2017年12月2日土曜日

オラの頭は、バーコードを通り過ぎてオバケのQ太郎になってしまったけど、在庫管理にそれは必要なんだな - バーコードリーダー(Elekele製有線式)

Amazonのショッピングサイトより

タイの駐在を終えて帰国してから、はや五年が過ぎてしまいました。
まあ、記憶にあるのは、合弁工場へ通っていた懐かしい記憶だけです。

でも、今回は、生産関係の社員が研修で日本へ来たので思い出しました。
それは、在庫管理が手作業の筆記による記録に、未だ依存していること。

バーコードの導入が全然始まっていなくて、急いで、導入したいようです。
でも、MRPの生産管理システムは立ち上げが終わっているし、ちぐはぐだよ。

実を言うと、自分が現地で働いていた当時から、在庫が合わずに苦労しました。
それは、手書きによる在庫記録がずさんで、経理データから乖離してしまう。

うーん、昔からの問題を解決せずに、MRPを導入したのがハイリスクですわ。
業績は好調なんですが、在庫の回転率が異常に高くなってしまった状況です。

ならば、マウスのように認識するUSBのバーコードリーダーを使えば良いのだ。
そこで、ユーチューブで読取値をエクセルのセルに出力してくれる動画を発見。

それをトレイニングの最中に再生して紹介しましたが、素直に驚いていました。
そして、後はマクロでプログラムを組んで、テスト的に運用しろと指導したのです。

でも、話しているうちに、VBAもマクロの言葉も分からなかったので不安なんだ。
だから、来週月曜日に、サンプルプログラムを渡すつもりで自作してみました。
    
    
それで、バーコードリーダーを会社は買ってくれないので、頼りはネット動画のみ。
でも、読み取ればセルに一瞬で表示されるのが分かって、とにかくプログラム。

多分、こんな動作だろうと思って、Ctrl+Vキーで貼り付けては動作確認しました。
まあ、このやり方では、ユーザーフォームのテキストボックスなんかでもOKです。

ところが、小遣いはたいて、廉価品バーコードリーダを購入したら、さあ大変です。
なんと、セルに表示される数値が、最初の一桁しかプログラムが認識しないのです。

人間の目だと、一瞬で複数桁が表示されますが、マクロは入力開始で判断します。
つまり、セル入力=イベント発生で、次のステップに進みますが、上手く同期しない。

自宅に、サンプルプログラムを持ち帰って、バーコードに接続してから大騒ぎでした。
結局、第一ステップとして、非表示のシートにバーコード値をセルに投入させました。

それから、この値をユーザーフォームのテキストボックスに転写させる大改造です。
このプログラムの手直しに時間が掛かりすぎましたが、なんとか完成いたしました。

ですので、参考になるかどうかは分かりませんが、使いたければ使ってみて下さい。
プログラム的には、ユーザーフォームを使って、簡単に入出庫の記録をとるだけのものですので、その後でデータをどのように扱うかが、それが懸案になるかと思いますが、簡単な在庫管理のソフトとして使えるのではないかと思ったのでした。


<プログラムのコード>
ユーザーフォーム
サンプルデータ表
クリックで拡大して、番地を確認してね

<ユーザーフォームのコード>
Private Sub CommandButton1_Click()
Application.Visible = True
UserForm1.Hide
Worksheets("INVENTORY").Activate
End Sub
------------------------------------------------------
Private Sub CommandButton3_Click()
Call FormStart2
End Sub

※モジュールのパブリックプロシージャで、テキストボックス1にバーコード値
 その後、右のボタンを押して、ボックス10までの値を貼り付けさせます。 
-------------------------------------------------------
Private Sub TextBox7_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
With Worksheets("INVENTORY")
TextBox9.Value = .Cells(RowNr, 10).Value
TextBox10.Value = .Cells(RowNr, 10).Value + TextBox7.Value
End With
End Sub
------------------------------------------------------
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    If CloseMode = vbFormControlMenu Then
        MsgBox "Please use [Form Close] button"
        Cancel = True
    End If

End Sub
------------------------------------------------------
Private Sub CommandButton2_Click()

    Dim rc As Integer
 
    rc = MsgBox("Is In-Out Qty correct?", vbYesNo + vbExclamation, "Final Check")
    If rc = vbYes Then
        MsgBox "DATABASE UPDATE"
    Else
        MsgBox "UPDATE CANCEL"
    End If

With ListBox1
  If .ListIndex = -1 Then
      MsgBox "LISTBOX NOT SELECTED"
      GoTo SkipAction
  Else
      Worksheets("INVENTORY").Cells(RowNr, 10).Value = .List(.ListIndex, 0)
  End If
End With

With Worksheets("INVENTORY")
.Cells(RowNr, 2).Value = TextBox2.Value
.Cells(RowNr, 2).Value = TextBox2.Value
.Cells(RowNr, 7).Value = TextBox7.Value
.Cells(RowNr, 9).Value = TextBox9.Value
.Cells(RowNr, 10).Value = TextBox10.Value
End With

TextBox1.Value = ""
TextBox2.Value = ""
TextBox3.Value = ""
TextBox4.Value = ""
TextBox5.Value = ""
TextBox6.Value = ""
TextBox7.Value = ""
TextBox8.Value = ""
TextBox9.Value = ""
TextBox10.Value = ""

UserForm1.ListBox1.ListIndex = -1

Worksheets("BARCODE").Activate
Cells(1, 1).Value = ""
Cells(1, 1).Select

Worksheets("INVENTORY").Activate
Cells(1, 1).Select
UserForm1.TextBox1.SetFocus

SkipAction:

End Sub
-------------------------------------------------
<ThisWorkbookのコード>

Private Sub Workbook_Open()
Application.Visible = False

Worksheets("BARCODE").Visible = False 'True
Worksheets("BARCODE").Activate
Cells(1, 1).Select

Call FormStart

End Sub
※バーコード読取値を出力させるシートは、非表示です。
-------------------------------------------------
<モジュール1のコード>

Public RowNr As Long
Public Rng As Range
Public InputValue As String
Option Explicit
※パブリック変数・プロシージャを使いました(ユーザーフォームの操作)
-------------------------------------------------
Sub FormStart()

Load UserForm1
UserForm1.Show

UserForm1.TextBox1.SetFocus

End Sub
------------------------------------------------
Sub TextBox1_Change()

Worksheets("BARCODE").Activate
If ActiveCell.Address = "$A$2" Then
InputValue = Worksheets("BARCODE").Cells(1, 1).Value
InputValue = UserForm1.TextBox1.Value
Else
GoTo SkipAction
End If

Worksheets("BARCODE").Cells(1, 1).Value = ""
Cells(1, 1).Select

SkipAction:

End Sub
--------------------------------------------------
Sub FormStart2()

Worksheets("INVENTORY").Activate
Set Rng = Range("A3:A100000").Find(What:=UserForm1.TextBox1.Value, LookIn:=xlValues, LookAt:=xlWhole)
If Rng Is Nothing Then
MsgBox "NOT FOUND"
UserForm1.TextBox1.Value = ""
UserForm1.TextBox1.SetFocus
GoTo SkipAction
End If

RowNr = Rng.Row

With UserForm1.ListBox1
    .AddItem "SUPPLY"
    .AddItem "PRODUCTION"
    .AddItem "SERVICE"
End With

With ThisWorkbook.Worksheets("INVENTORY")
UserForm1.TextBox2.Value = Format(Date, "yyyy/mm/dd")
UserForm1.TextBox3.Value = .Cells(RowNr, 3)
UserForm1.TextBox4.Value = .Cells(RowNr, 4)
UserForm1.TextBox5.Value = .Cells(RowNr, 5)
UserForm1.TextBox6.Value = .Cells(RowNr, 6)
UserForm1.TextBox8.Value = .Cells(RowNr, 8)
UserForm1.TextBox10.Value = .Cells(RowNr, 10)
End With

UserForm1.TextBox7.SetFocus

SkipAction:

End Sub

※テキストボックス7で、入出庫のデータを入力。
 マイナスなら、-123のように入力します。
------------------------------------------------
<モジュール2のコード>
Sub Option01_Click()
Application.Visible = False
UserForm1.Show
End Sub
※”INVENTORY”シートにあるユーザーフォーム表示ボタン

※お願い
何か間違っていたら、教えてください。
また、現地のタイ人に見せるために、表記は英語にしました。
訂正:在庫データ登録後、リストボックスの選択反転表示を解除させるコードを追加しました。



いいねと思ったら、二つポチっとね!



0 件のコメント:

コメントを投稿