バーコードを読み込む。シートイベントで連続処理

codeeyecatcha

バーコードから入力したコードを連続処理するVBAを作成します。シートイベントを使ってプログラムを設計します。
書籍にある2つのバーコードの扱い方がポイントです。

こんにちは、じゅんぱ店長(@junpa33)です。

今回からは、棚卸し等に使える「雑誌と書籍の在庫リスト」作成のVBAコードの説明を行っていきます。

この記事は「コード入力表」についてです。

基本的には、バーコードリーダーを使って書誌のデータを読み取ることを前提とした設定です。

(この後、別のシート設定の記事で、他から持ってきた場合のバーコードデータもうまく使える様な仕様にしています。)

目標として、Enterキー以外は出来るだけキーボードを使わなくて良い様にしていきます。

雑誌と書籍の在庫リスト(棚卸表)作成の記事編成

バーコードを読み込む「コード入力表シート」の設計

codenyup001

バーコードリーダーは基本の設定でコードの読み取り時には、” 数値 ”+” Enter ” をPCに送信します。これで自動的にアクティブセルに数値が入力され、次のセルがアクティブになります。

この様にデフォルトでは、読み取るごとに(セルに数値が入るごとに)アクティブセルの行が下がっていきます。

けれども、この仕様のままでは不都合なことがあります。

ISBNの書籍コードの場合は、バーコードが、書籍の固有のコードと価格を記述したコードの2段となっています。

なので、そのまま普通に読み取ると、固有コード⇒価格コード⇒固有コード⇒価格コードと積みあがってしまいます。

(デフォルトの設定のままですと同じ列に2種のコードが混ざった状態になってしまいます。)

コードを利用するためには、書誌の固有のコードと価格コードを一つのペアーとして扱う必要があります。対のコードとして、紐づけさせる必要があります。

ですので、シートの設定を、固有コードのバーコードを読み込んだら、アクティブセルが同じ行番号の次の列に移動するように仕組みます。

ISBNの書籍コードの場合、バーコードの読み取り後のセルの移動を

デフォルトの「常に下の行」から「条件が合えば横に移動」に変化させるようにしています。

連続入力処理のシートイベントVBAコード

codenyup002

それでは順番に説明していきます。

「書誌在庫表.xlsm」の作成

まずは、「書誌在庫表.xlsm」という名前のBOOKを作成します。

新規のエクセルBOOKを立ち上げて、名前を「書誌在庫表.xlsm」で保存してください。

「書誌在庫表.xlsm」を開きます。

最初に設定しておくSheet名は、Sheet1を「コード入力表」、Sheet2を「データコピー」、Sheet3を「作業シート」としてください。

VBA連続処理イベントコードをつくる

項目表示(シートを開いたとき作動)

最初に列のタイトル(項目)を記入されるようにします。

いつものようにVBE(ビジュアルベーシックエディタ)を開いてください。

参考記事

念のため開き方はこちら↓で確認してください。

VBA初めての起動。VBEの立ち上げ、保存と終了

今回は「Sheet1(コード入力表)」のシートモジュールに記述していきます。

(プロジェクトエクスプローラーの「Sheet1(コード入力表)」をダブルクリックしてください。)

それぞれの1行目で、A列に「書誌コードNO」、B列に「価格コードNO」、E列に「項目修正スイッチ」と表示しますシートを開いたときに作動します。

コードはこのようになります。

VBA
Private Sub Worksheet_Activate()
    With Worksheets("コード入力表")
        .Range("A1") = "書誌コードNO"
        .Range("B1") = "価格コードNO"
        .Range("E1") = "項目修正スイッチ"
        .Range("A:E").EntireColumn.AutoFit
        .Range("C1").Select
    End With
End Sub
vbawithstateeyecatch With~End Withの使い方。VBAコードを簡潔に記述する

アクティブセルの動きをコントロール(シートに変化があった時起動)

codenyu001a

シートを開いたときにはセルはC1の位置にあります。また、データの入力を一時的にでも終了すれば、セル位置はC1に戻ります。

A列、B列以外のセルをアクティブにした時には「A列のセルをアクティブにしてください。」のメッセージを表示します。A列のセルからのデータ入力のスタートとなります。

E列は”入力したデータの修正”のためのスイッチとなる列になっています。メッセージに従って修正データを入力していきます。データ修正したいセルと同じ行のE列のセルを指定する必要があります。

コード②

VBA
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim R As Long
    Dim Rb As Long
    Dim LARow As Long
    Dim LARowb As Long
    Dim p As Variant
    Dim AD As Variant
    Dim x As Integer, y As Integer
        With Range("A:B")
            .NumberFormatLocal = "@"
            .EntireColumn.AutoFit
        End With
        If Target.Column <> 2 And Target.Column <> 1 Then
            R = MsgBox("A列のセルをアクティブにしてください。" _
                    , vbOKOnly + vbExclamation)
            If Target.Column = 5 Then
                q = Application.inputbox(Prompt:= _
                    "A列の修正コードを入力。" & vbCrLf & _
                    "B列修正または間違いの場合はキャンセルを" _
                    & vbCrLf & "空欄入力は9999を", Type:=2)
                If q = False Or q = "" Then
                    w = Application.inputbox(Prompt:= _
                        "B列の修正コードを入力。" & vbCrLf & _
                        "間違いの場合はキャンセルを" & vbCrLf _
                        & "空欄入力は9999を", Type:=2)
                        If w = False Then
                            GoTo STEP_E
                        ElseIf w = "" Then
                            GoTo STEP_E
                        ElseIf w = 9999 Then
                            Cells(Target.Row, 2) = vbNullString
                        Else
                            Cells(Target.Row, 2) = w
                        End If
                ElseIf q = 9999 Then
                            Cells(Target.Row, 1) = vbNullString
                Else
                    Cells(Target.Row, 1) = q
                End If
            End If
            If R = vbOK Then
                GoTo STEP_E
            End If
        ElseIf Target.Column = 2 Then
            If Target.Value <> "" Then
                Target.Offset(1, -1).Select
            End If
        Else
            LARow = Range("A1").CurrentRegion.Rows.Count
            LARowb = Cells(1, 1).End(xlDown).Row
            Range(Cells(1, 5), Cells(LARow, 5)).Interior.Color _
                                        = RGB(230, 230, 230)
            If LARow = 1 Then
                Range("A2").Select
            Else
                If LARowb < LARow Then
                    Range("A" & LARowb + 1).Select
                Else
                    Range("A" & LARow + 1).Select
                End If
            End If
        End If

A列のいずれかのセルやB列で既にデータが入力されているセルをアクティブにした時には、次にデータ入力可能なA列のセルが自動的にアクティブになります。

ISBNコードであった場合は、価格コードを入力するために自動的に同行のB列にセルが移動します。

VBA
        AD = Target.Address(False, False)
          x = Target.Row
          y = Target.Column
        p = Application.inputbox(Prompt:="コードを入力。" _
                & vbCrLf & "終了の場合はキャンセルを", Type:=2)
        If p = False Then
            GoTo STEP_E
        ElseIf p = "" Then
            GoTo STEP_E
        Else
            p = LTrim(p)
            Range(AD).Value = p
            If Left(p, 3) = 978 Then
                If Target.Column = 1 Then
                    Cells(x, y + 1).Select
                Else
                    Cells(x + 1, y - 1).Select
                End If
            ElseIf Left(p, 3) = "" Then
                GoTo STEP_E
            Else
                If Target.Column = 1 Then
                    Cells(x + 1, y).Select
                Else
                    Cells(x + 1, y - 1).Select
                End If
            End If
        End If
STEP_E:
        Cells(1, 3).Select
End Sub

データ入力終了後の操作(シートから移動した時に起動)

データ入力が終わって次の作業に移る(違うシートへ移動)時に、

入力したデータを「データコピー」シートに移します。(「コード入力表」のVBAは引き継がれません。)

この後、ユーザーフォームの「コントロールパネル」で「バーコードモード」ボタンを設置します。

そして入力したデータを、「データコピー」シートへ引き渡しする・しないを、ボタンのON・OFFでコントロールします。

そのためのコードのトリガーのVBAをここで埋め込みます。本体はModule1に記述します。

VBA
Private Sub Worksheet_Deactivate()
        Module1.バーコード
End Sub

  バーコード読み込みVBAコードのまとめ

codenyup003

バーコードリーダを利用するこのシートでのVBAの起動については、トリガーとなるボタンのクリックなどでは非常に使いづらくなります。

シートの変化に対してそれがVBA起動のトリガーとなることで、連続してバーコードレーダーでの操作が可能になります。

シートの変化(イベント)をトリガーとすると、下手をすると無限ループに嵌ってしまうことがあります。コードミスなどしないよう十分注意して記述してください。

次回は、「データコピー」シートの作成について書いていきたいと思います。

次の記事を読む

datacopyeyecatchaa 雑誌コードとISBNコードを使い易く加工するVBA

エクセルVBAの勉強を始めましょう

codenyup004

エクセルVBAは、プログラムコードです。

第一印象で、「プログラムコードか!」 と思えば、非常に取っ付き難いでしょう。

でも、初めて出会う参考書で心象が大きく変わります。(変わらせない参考書もあります。)

また学習素材に何を選ぶかも大切です。

vbastudyeyecatch002 エクセルVBAを独学で習得する!ために大切な7つのポイントを解説します

Excelマクロ&VBA超入門 今すぐ使えるかんたんぜったいデキます!
エクセルVBAを初めて勉強するときに効く
vbastudy016a
vbastudy017a

電子書籍版「Excelマクロ&VBA超入門」をamazonで見てみる

(著者)井上香緒里
(出版社)技術評論社
(税込価格)1,738円(本体1,580円+税)

マクロとVBAについて学んでみたいけれど,いまひとつ自信がないという方のために,ひとつひとつの操作を丁寧に解説する1冊目の教科書です。
エクセルVBAの「い・ろ・は の い」から説明していますので、安心して取り組める参考書です。
例題として、
  • 「データ消去」「シートのコピー」「メッセージボックス」の機能を持つお小遣い帳
  • 「入力フォーム」の機能を持った歩数表
2つの題材ファイルを作成しながら,マクロとVBAの基本を学習していきます。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min