書誌データの重複削除と、データベースからの書名検索

sagyousheeteyecatcha

書誌データの重複表示を削除し、データベースからデータに合致する書誌名を検索し取り出します。
書名の手書きを大幅に削減して作業効率を爆上げするコード作成です。

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

雑誌と書籍の在庫管理表のソフト作成の中で、今回は前回に続き

「書誌棚卸表.xlsm」の「作業シート」で行う操作を規定するVBAコードの説明です。

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

書誌データの重複削除とデータベースから書名を取得する

sagyosheetp001

今回はVBAコードをModule2に記述します。

「作業シート」において、

  1. リスト中にある同じ書誌を整理して1タイトル1表示とします。
  2. それぞれの冊数と単価とその合計金額を計算します。(税別で)
  3. データベースからそれぞれの書名を検索し表示します。

ここがこのエクセルVBAソフトのいわば中心部分になります。

結果表示は、「作業シート」の余白部分に表示するようにします。

Module2にコードを記述して行く前に、宣言セクション(一番上段)にパブリック変数の宣言を行います。

vbasengeneyecatch 宣言方法で変数の適用範囲を変える エクセルVBA
VBA
Public Krow As Long
Public frow As Long

項目表示と重複削除

先頭行に項目を表示します。

E列からJ列まで使用します。

記述するVBAコードは、この様な感じです。

VBA
Sub 項目表示()
        With Worksheets("作業シート")
            .Range("E1") = "場所"
            .Range("F1") = "書誌コード"
            .Range("G1") = "書名"
            .Range("H1") = "本体価格"
            .Range("I1") = "冊数"
            .Range("J1") = "合計"
        End With
End Sub

リスト中の書誌タイトルの重複を削除します。

”Dictionaryオブジェクト”を利用して重複なしリストを作っていきます。

VBA
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

合計金額の計算と表示

ここの部分は、数量と単価から合計金額を計算します。

単価は本体価格(税抜き価格)の表示ですので、合計金額も税抜き価格で表示しています。

VBA
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コードも変更修正する必要があります。

ファイルを開いた後は別のプロシージャー「書誌チェック」を呼び出して書誌名検索に移ります。

そのファイルでの検索が終了したら、次に別のファイルを開くかどうか聞いてきますので、

「はい」か「いいえ」で応答します。

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書籍コードの桁数がおかしい場合は、検索自体を終了するかその検索だけをジャンプするかを選択します。

そのファイルでの検索が終了したら、次に別のファイルを開くかどうか聞いてきますので、

「はい」か「いいえ」で応答します。

VBA
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のまとめ

sagyosheetp002

今回は「書誌棚卸表.xlsm」のプログラムの核心部分の一つの書誌データの重複整理と書名マッチングを説明しました。

データを検索する部分は「Match」を使っています。

書誌コードを検索するときには、何かとエラーが発生する場合があります。主だったエラーケースを想定してVBAプログラムに反映させました。

想定に漏れたエラーが出たときはプログラムが停止してしまいますが、その都度コード修正でご対応お願いします。

次回記事は作業シートで書きだした「雑誌と書籍の在庫表」を新しいシートに転記し清書するVBAコードです。

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

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

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

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

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

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

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

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

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min