書誌データの重複表示を削除し、データベースからデータに合致する書誌名を検索し取り出します。
書名の手書きを大幅に削減して作業効率を爆上げするコード作成です。
こんにちは、じゅんぱ店長(@junpa33)です。
雑誌と書籍の在庫管理表のソフト作成の中で、今回は前回に続き
「書誌棚卸表.xlsm」の「作業シート」で行う操作を規定するVBAコードの説明です。
雑誌と書籍の在庫リスト(棚卸表)作成の記事編成
- 雑誌と書籍の在庫リストの使い方とダウンロード
- 書誌データベースのダウンロード
コンテンツ
書誌データの重複削除とデータベースから書名を取得する
今回はVBAコードをModule2に記述します。
「作業シート」において、
- リスト中にある同じ書誌を整理して1タイトル1表示とします。
- それぞれの冊数と単価とその合計金額を計算します。(税別で)
- データベースからそれぞれの書名を検索し表示します。
ここがこのエクセルVBAソフトのいわば中心部分になります。
結果表示は、「作業シート」の余白部分に表示するようにします。
Module2にコードを記述して行く前に、宣言セクション(一番上段)にパブリック変数の宣言を行います。
宣言方法で変数の適用範囲を変える エクセルVBAPublic Krow As Long
Public frow As Long
項目表示と重複削除
先頭行に項目を表示します。
E列からJ列まで使用します。
記述するVBAコードは、この様な感じです。
Sub 項目表示()
With Worksheets("作業シート")
.Range("E1") = "場所"
.Range("F1") = "書誌コード"
.Range("G1") = "書名"
.Range("H1") = "本体価格"
.Range("I1") = "冊数"
.Range("J1") = "合計"
End With
End Sub
リスト中の書誌タイトルの重複を削除します。
”Dictionaryオブジェクト”を利用して重複なしリストを作っていきます。
Sub 書誌重複削除()
Dim Krow As Long
Dim i As Long, j As Long
Dim Dic As Object
Worksheets("作業シート").Select
Range("F:F").NumberFormatLocal = "@"
Set Dic = CreateObject("Scripting.Dictionary")
Krow = Cells(Rows.Count, 2).End(xlUp).Row
For i = 2 To Krow
Dic.Add Worksheets("作業シート").Cells(i, 1) _
.Value, ActiveSheet.Cells(i, 2).Value
On Error Resume Next
Next i
For j = 0 To Dic.Count - 1
myKeys = Dic.keys
myItems = Dic.Items
Range("F" & j + 2).Value = myKeys(j)
Range("H" & j + 2).Value = myItems(j)
Next j
With Range("F:H")
.EntireColumn.AutoFit
End With
End Sub
合計金額の計算と表示
ここの部分は、数量と単価から合計金額を計算します。
単価は本体価格(税抜き価格)の表示ですので、合計金額も税抜き価格で表示しています。
Sub 冊数合計マッチ()
Dim Mr As Long
Dim m As Long
Worksheets("作業シート").Select
frow = Cells(Rows.Count, 6).End(xlUp).Row
For m = 1 To frow
On Error Resume Next
Mr = WorksheetFunction.Match(Range("F" & m), _
Range("A:A"), 0)
Range("I" & m).Value = Range("C" & Mr).Value
Range("J" & m).Value = Range("H" & m).Value _
* Range("I" & m).Value
If Range("F" & m) = "" Then
Range("H" & m, "J" & m) = ""
End If
Next m
With Range("I:I")
.NumberFormatLocal = "0_"
.EntireColumn.AutoFit
End With
With Range("J:J")
.NumberFormatLocal = "\#,##0;\-#,##0"
.EntireColumn.AutoFit
End With
End Sub
データベースから書名をマッチング
- データベースを収納しているフォルダー名は「書誌データベース」となっています。このフォルダー名は固定(変更不可)です。
- フォルダー名を変更する場合は必ずVBAコード上でも変更修正する必要があります。
- データベース名は自由です。ただしファイル形式はエクセルまたはCSVファイルに限ります。
- データベースの内容は、「Sheet1」名のシートに記述する必要があります。
- データベースのレイアウトは、「D列に書誌コード」、「I列に書誌名」を指定しています。それ以外は特に固定事項はありません。自由です
データベースとなるファイルを開いて雑誌コードやISBNコードから書誌名を探します。
このプロシージャーでは、ファイルを開くためのダイアログボックスを表示して、開くファイルを指定することになります。
データベースを収納しているフォルダー名は「書誌データベース」となっています。このフォルダー名は固定(変更不可)です。
この作成しているプログラムでは、フォルダー名を変更する場合は必ずVBAコードも変更修正する必要があります。
ファイルを開いた後は別のプロシージャー「書誌チェック」を呼び出して書誌名検索に移ります。
そのファイルでの検索が終了したら、次に別のファイルを開くかどうか聞いてきますので、
「はい」か「いいえ」で応答します。
Sub 書誌名挿入()
step_cont:
Application.ScreenUpdating = False
Dim RP As Integer
Dim FileD As FileDialog
Set FileD = Application.FileDialog(msoFileDialogOpen)
With FileD
.ButtonName = "開く"
With .Filters
.Clear
.Add "Excelブック", _
"*.xls; *.xlsx; *.xlsm", 1
.Add "テキストファイル", "*.csv", 2
End With
.InitialFileName = ThisWorkbook.Path & _
"\書誌データベース\"
.InitialView = msoFileDialogViewLargeIcons
If .Show = True Then
.Execute
Else
MsgBox "終了します。"
Exit Sub
End If
End With
Call Module2.書誌チェック
With Range("F:J")
.EntireColumn.AutoFit
End With
RP = MsgBox("続けてデータベースを開きますか?" _
& vbCrLf & "続けるには「はい」を" & vbCrLf & _
"終わるには「いいえ」を", vbYesNo + _
vbQuestion, "確認")
If RP = vbYes Then
GoTo step_cont
Else
Application.ScreenUpdating = True
Exit Sub
End If
Application.ScreenUpdating = True
End Sub
書誌名挿入 プロシージャーでファイルを開いた後は、別のプロシージャー「書誌チェック」を呼び出して書誌名検索に移ります。
雑誌やISBN書籍コードの桁数がおかしい場合は、検索自体を終了するかその検索だけをジャンプするかを選択します。
そのファイルでの検索が終了したら、次に別のファイルを開くかどうか聞いてきますので、
「はい」か「いいえ」で応答します。
Private Sub 書誌チェック()
Application.ScreenUpdating = False
Dim ASrow As Long
Dim ASname As String
Dim SRV, SC, SCt, SN As Variant
Dim Sr, SCa, SNS As Long
Dim SCS, SCG As String
Dim s As Long
Dim MsgR As Integer
Dim BK As Workbook
Set BK = ActiveWorkbook
Dim BS As Worksheet
Set BS = BK.Worksheets("Sheet1")
Dim TB As Workbook
Set TB = Workbooks("書誌在庫表.xlsm")
Dim SS As Worksheet
Set SS = TB.Worksheets("作業シート")
TB.Activate
SS.Select
frow = Cells(Rows.Count, 6).End(xlUp).Row
For s = 2 To frow
SC = 0
TB.Activate
SS.Select
SRV = Range("F" & s).Value
If SRV = "" Then GoTo step_a
SCS = CStr(SRV)
If Len(Trim(SCS)) = 6 Then
SC = CLng(Left(Trim(SCS), 4))
SCG = CLng(Right(Trim(SCS), 2)) & "月"
ElseIf Len(Trim(SCS)) = 7 Then
SC = CLng(Left(Trim(SCS), 5))
SCG = CLng(Right(Trim(SCS), 2)) & "月"
ElseIf Len(Trim(SCS)) = 13 Then
SCt = Right(Trim(SCS), 10)
SC = Val(SCt)
SCG = ""
Else
MsgR = MsgBox("コードの桁数が違います。" _
& vbCrLf & "全体処理を中止しますか?(はい)" _
& vbCrLf & "この処理をJumpますか?(いいえ)", _
vbYesNo + vbExclamation)
If MsgR = vbYes Then
Exit Sub
Else
End If
End If
BK.Activate
BS.Select
Sr = 0
On Error Resume Next
Sr = WorksheetFunction.Match(SC, Range("D:D"), 0)
If Err.Number = 1004 Then
Err.Clear
Else
SN = Range("I" & Sr)
TB.Activate
SS.Select
If SN <> "" Then
Range("G" & s) = SN & " " & SCG
End If
End If
step_a:
Next s
With Range("G:G")
.EntireColumn.AutoFit
End With
BK.Close False
Application.ScreenUpdating = True
End Sub
書誌データの重複削除、書名を取り出すVBAのまとめ
今回は「書誌棚卸表.xlsm」のプログラムの核心部分の一つの書誌データの重複整理と書名マッチングを説明しました。
データを検索する部分は「Match」を使っています。
書誌コードを検索するときには、何かとエラーが発生する場合があります。主だったエラーケースを想定してVBAプログラムに反映させました。
想定に漏れたエラーが出たときはプログラムが停止してしまいますが、その都度コード修正でご対応お願いします。
次回記事は作業シートで書きだした「雑誌と書籍の在庫表」を新しいシートに転記し清書するVBAコードです。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。