Excel 受領書入力フォーム
前回のおさらい
送付物の紛失の為に、営業所・支店での「受領確認」が必要なった。
そのため、管理部署で受領書のチェック体制を整える。
・台帳に受領日(営業所・支店、管理部署)を記入、フォローする。
・受領日入力を簡単にするため、入力フォームを作成する。
入力フォーム作成
Excel台帳に「営業所・支店受領日」「管理部受領日」を追加
入力フォームで「受領日」入力後のイメージ
入力フォーム オブジェクト名設定
前回のフォームで「営業所・支店」項目もあったほうが良いので、
追加します。
そして、フォームの中のオブジェクトに名前を付けます。
入力フォームで入力した値をどのように台帳に反映させるか考えて、
VBAでプログラムを書いていきます。
入力フォームを表示してみます
Sub FormShow()
U_InputForm.Show
End Sub
入力フォームで「送付連番」を入力すると、
台帳情報 ・営業所・支店
・送付物名
が表示されたら便利ですよね。
送付連番 : ”1” のとき、
営業所・支店 : 東京支店
送付物名 : 商品A書類
が表示されるようにする。
営業所・支店、送付物名の情報を取得するコードを書いていきます。
クラスモジュール(clsInpForm)
Sub AutoNo_ItemShow '送付連番を入力→営業所・支店、送付物名表示'
Dim SendNo As Long '送付連番'
With U_InputForm
SendNo = .U_AutoNo_T.Value
.U_BrchName_T.Value = SendBranch(SendNo)
.U_Syohin_T.Value = SendProduct(SendNo)
End With
End Sub
Function SendProduct(ByVal SendNo As Long) '送付物名の取得'
Dim StBk As Worksheet 'ワークシート'
Dim EndRow As Long '台帳の最終行'
Set StBk = ThisWorkbook.Worksheets("台帳")
On Error Resume Next
With StBk
EndRow = .Cells(Rows.Count, 1).End(xlUp).Row ' 台帳の最終行'
SendProduct = WorksheetFunction.VLookup(SendNo,.Range("A2:D" & EndRow),4,False)
End With
End Function
Function SendBranch(ByVal SendNo As Long) '営業所・支店の取得'
Dim StBk As Worksheet 'ワークシート'
Dim EndRow As Long '台帳の最終行'
Set StBk = ThisWorkbook.Worksheets("台帳")
On Error Resume Next
With StBk
EndRow = .Cells(Rows.Count, 1).End(xlUp).Row ' 台帳の最終行'
SendBranch = WorksheetFunction.VLookup(SendNo,.Range("A2:C" & EndRow),3,False)
End With
End Function
ユーザーフォームを「コードの表示」して、
コードを書いていきます。
Private clsFrm As New clsInpForm
Private Sub U_AutoNo_T_AfterUpdate()
clsFrm.AutoNo_ItemShow
End Sub
ちゃんと表示されました。
では、受領日の入力について、考えてみます。
日付入力で「10月2日」を考えると、
「2022/10/2」を入力するようになります。
簡単に日付を入力するには、「041022」と入力したほうが、
入力は速く入力できそうです。
日付編集コードを書いていきます。
クラスモジュール(clsInpForm)
Function EdtDate(ByVal tgtDay As String) As Date
EdtDate = Left(tgtDay, 2) + 2018 & "/" & Mid(tgtDay, 3, 2) & "/" & Right(tgtDay, 2)
End Function
入力フォームで項目入力が完了し、台帳に書込みしていきます。
クラスモジュール(clsInpForm)
Public Sub WrtStBkDate() '台帳に書込'
Dim StBk As Worksheet 'ワークシート'
Dim SendNo As String '送付連番'
Dim BrchRptDate As Date '営業所・支店受領日'
Dim KanriRptDate As Date '管理部受領日'
Set StBk = ThisWorkbook.Worksheets("台帳")
With U_InputForm
SendNo = .U_AutoNo_T.Text
BrchRptDate = EdtDate(.U_BrchDay_T.Text)
KanriRptDate = EdtDate(.U_KnriDay_T.Text)
End With
With StBk
If WorksheetFunction.CountIfs(.Range("A:A"), SendNo) > 0 Then
Set findNo = .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Find(SendNo) '送付連番検索'
If Not findNo Is Nothing Then
firstadd = findNo.Address
Do
.Range(findNo.Address).Offset(0, 4).Value = BrchRptDate '営業所・支店受領日書込'
.Range(findNo.Address).Offset(0, 5).Value = KanriRptDate '管理部受領日書込'
Set findNo = .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row).FindNext(findNo)
Loop While findNo.Address <> firstadd
End If
Else
MsgBox "入力した送付連番はありませんでした!", vbCritical + vbInformation '入力した送付連番がない時'
End If
End With
End Sub
ユーザーフォームにコードを書いていきます。
Private Sub U_Ok_B_Click()
clsFrm.WrtStBkDate
End Sub
では、実行してみましょう。
送付連番を”3”入力していきます。
Okボタンを押すと、台帳の送付連番”3”の行に日付が記入されます。
ちゃんと実行されました。
このようにユーザーフォームを活用すると、
入力作業がスムーズに行えます。
今回のケースでは、1日に1件しかありませんが、
1日に10,20件あると、これは大変です。
ユーザーフォームの活用事例を紹介しました。
説明出来ていないコードもありますが、悪しからず。