バーコードから入力したコードを連続処理するVBAを作成します。シートイベントを使ってプログラムを設計します。
書籍にある2つのバーコードの扱い方がポイントです。
こんにちは、じゅんぱ店長(@junpa33)です。
今回からは、棚卸し等に使える「雑誌と書籍の在庫リスト」作成のVBAコードの説明を行っていきます。
この記事は「コード入力表」についてです。
基本的には、バーコードリーダーを使って書誌のデータを読み取ることを前提とした設定です。
(この後、別のシート設定の記事で、他から持ってきた場合のバーコードデータもうまく使える様な仕様にしています。)
目標として、Enterキー以外は出来るだけキーボードを使わなくて良い様にしていきます。
雑誌と書籍の在庫リスト(棚卸表)作成の記事編成
- 雑誌と書籍の在庫リストの使い方とダウンロード
- 書誌データベースのダウンロード
コンテンツ
バーコードを読み込む「コード入力表シート」の設計
バーコードリーダーは基本の設定でコードの読み取り時には、” 数値 ”+” Enter ” をPCに送信します。これで自動的にアクティブセルに数値が入力され、次のセルがアクティブになります。
この様にデフォルトでは、読み取るごとに(セルに数値が入るごとに)アクティブセルの行が下がっていきます。
けれども、この仕様のままでは不都合なことがあります。
ISBNの書籍コードの場合は、バーコードが、書籍の固有のコードと価格を記述したコードの2段となっています。
なので、そのまま普通に読み取ると、固有コード⇒価格コード⇒固有コード⇒価格コードと積みあがってしまいます。
(デフォルトの設定のままですと同じ列に2種のコードが混ざった状態になってしまいます。)
コードを利用するためには、書誌の固有のコードと価格コードを一つのペアーとして扱う必要があります。対のコードとして、紐づけさせる必要があります。
ですので、シートの設定を、固有コードのバーコードを読み込んだら、アクティブセルが同じ行番号の次の列に移動するように仕組みます。
ISBNの書籍コードの場合、バーコードの読み取り後のセルの移動を
デフォルトの「常に下の行」から「条件が合えば横に移動」に変化させるようにしています。
連続入力処理のシートイベントVBAコード
それでは順番に説明していきます。
「書誌在庫表.xlsm」の作成
まずは、「書誌在庫表.xlsm」という名前のBOOKを作成します。
新規のエクセルBOOKを立ち上げて、名前を「書誌在庫表.xlsm」で保存してください。
「書誌在庫表.xlsm」を開きます。
最初に設定しておくSheet名は、Sheet1を「コード入力表」、Sheet2を「データコピー」、Sheet3を「作業シート」としてください。
VBA連続処理イベントコードをつくる
最初に列のタイトル(項目)を記入されるようにします。
いつものようにVBE(ビジュアルベーシックエディタ)を開いてください。
今回は「Sheet1(コード入力表)」のシートモジュールに記述していきます。
(プロジェクトエクスプローラーの「Sheet1(コード入力表)」をダブルクリックしてください。)
それぞれの1行目で、A列に「書誌コードNO」、B列に「価格コードNO」、E列に「項目修正スイッチ」と表示します。シートを開いたときに作動します。
コードはこのようになります。
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
シートを開いたときにはセルはC1の位置にあります。また、データの入力を一時的にでも終了すれば、セル位置はC1に戻ります。
A列、B列以外のセルをアクティブにした時には「A列のセルをアクティブにしてください。」のメッセージを表示します。A列のセルからのデータ入力のスタートとなります。
E列は”入力したデータの修正”のためのスイッチとなる列になっています。メッセージに従って修正データを入力していきます。データ修正したいセルと同じ行のE列のセルを指定する必要があります。
コード②
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列にセルが移動します。
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に記述します。
Private Sub Worksheet_Deactivate()
Module1.バーコード
End Sub
バーコード読み込みVBAコードのまとめ
バーコードリーダを利用するこのシートでのVBAの起動については、トリガーとなるボタンのクリックなどでは非常に使いづらくなります。
シートの変化に対してそれがVBA起動のトリガーとなることで、連続してバーコードレーダーでの操作が可能になります。
シートの変化(イベント)をトリガーとすると、下手をすると無限ループに嵌ってしまうことがあります。コードミスなどしないよう十分注意して記述してください。
次回は、「データコピー」シートの作成について書いていきたいと思います。
次の記事を読む
雑誌コードとISBNコードを使い易く加工するVBAエクセルVBAの勉強を始めましょう
エクセルVBAは、プログラムコードです。
第一印象で、「プログラムコードか!」 と思えば、非常に取っ付き難いでしょう。
でも、初めて出会う参考書で心象が大きく変わります。(変わらせない参考書もあります。)
また学習素材に何を選ぶかも大切です。
エクセルVBAを独学で習得する!ために大切な7つのポイントを解説します電子書籍版「Excelマクロ&VBA超入門」をamazonで見てみる
(著者)井上香緒里(出版社)技術評論社
(税込価格)1,738円(本体1,580円+税)
マクロとVBAについて学んでみたいけれど,いまひとつ自信がないという方のために,ひとつひとつの操作を丁寧に解説する1冊目の教科書です。
エクセルVBAの「い・ろ・は の い」から説明していますので、安心して取り組める参考書です。
例題として、
- 「データ消去」「シートのコピー」「メッセージボックス」の機能を持つお小遣い帳
- 「入力フォーム」の機能を持った歩数表
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。