例文を使って繰り返し業務を時短

【マクロ・VBA】Dictionary マッチング(突合)/キーとアイテム

エクセル、マクロ、VBAでDictionaryを使ってキーとアイテムを別シートに転記する方法 VBA

キーとアイテムを異なるファイルへ転記

Sub キーとアイテム基シート転記()

With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With

'基ファイル
Dim wb1 As Workbook
Set wb1 = ThisWorkbook
Dim ws1 As Worksheet
'Set ws1 = ActiveSheet
Set ws1 = wb1.Worksheets("検索")
Dim LastRow1 As Long
LastRow1 = ws1.Cells(Rows.Count, 1).End(xlUp).Row

'基ファイル処理
ws1.Range("F2").CurrentRegion.Offset(1.1).Clear

'基ファイル文字列変換(Cstr関数)
Dim g As Long

g = 2
Do Until g = LastRow1 + 1
    DoEvents
        'Dim strNum As String
        Num = ws1.Cells(g, 1)
        strNum = CStr(Num)
        ws1.Cells(g, 1) = strNum
 
            '----------
            '型Tを調べる方法(VarType関数)8:文字列
            'Debug.Print VarType(strNum), TypeName(Str(Num))
            '----------

            'ステータスバーへの表示更新
            Application.StatusBar = g & "/" & LastRow1 - 1 & " を完了"
g = g + 1
Loop

            'ステータスバーへの表示更新終了
            Application.StatusBar = False

'相手ファイル
Dim FName As String
Dim wb4 As Workbook
Dim ws4 As Worksheet
Dim LastRow4 As Long

MsgBox "「ファイル選択」選択"
FName = Application.GetOpenFilename("Microsoft Excelブック,*.xls*")

    If FName <> "False" Then
        Set wb4 = Workbooks.Open(FName)
        Set ws4 = wb4.Worksheets(1)
        LastRow4 = ws4.Cells(Rows.Count, 2).End(xlUp).Row
    Else
        MsgBox "file未指定 "
    End
    End If

'相手ファイル文字列変換(Cstr関数)
'Dim g As Long
g = 2
Do Until g = LastRow4 + 1
    DoEvents

    'Dim strNum As String
    Num = ws4.Cells(g, 1)
    strNum = CStr(Num)
    ws4.Cells(g, 1) = strNum
        '----------
        '型Tを調べる方法(VarType関数)8:文字列
        'Debug.Print VarType(strNum), TypeName(Str(Num))
        '----------
        'ステータスバーへの表示更新
        Application.StatusBar = g & "/" & LastRow4 - 1 & " を完了"
g = g + 1
Loop

        Application.StatusBar = False   'ステータスバーへの表示更新終了

'処理
Dim myDic As Object, myKey
Dim c, myVal
Dim i As Long
Set myDic = CreateObject("Scripting.Dictionary")

For i = 2 To LastRow4
    On Error Resume Next
    If Not myDic.Exists(ws4.Cells(i, 1).Value) Then
        myDic.Add (ws4.Cells(i, 1).Value), (ws4.Range("A" & i & ":BB" & i).Value)
    End If
Next i

For i = 2 To LastRow1
    ws1.Range("F" & i & ":BG" & i).Value = myDic.Item(ws1.Cells(i, 1).Value)
Next i

On Error GoTo 0

For i = 2 To b
   On Error Resume Next
    If Not myDic.Exists(sheet_2.Cells(i, 3).Value) Then
        myDic.Add (ws4.Cells(i, 3).Value), (ws4.Range("D" & i & ":BD" & i).Value)
    End If
Next i

For i = 20 To A
    ws1.Range("H" & i & ":BH" & i).Value = myDic.Item(ws1.Cells(i, 1).Value)
    ws1.Cells(i, 7).Value = ws1.Cells(i, 1).Value
Next i

On Error GoTo 0

'相手ファイル閉じる
wb4.Close savechanges:=False
Set myDic = Nothing
Set wb4 = Nothing
Set ws4 = Nothing

'アドバンスフィルタ
ws1.Activate
ws1.Range("F1").AutoFilter

'スピードUP解除
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True
Application.DisplayAlerts = True

MsgBox "完了"
End Sub

TOPIX

  • ブックを指定:Workbooks(“Book1.xls”)
  • シートを指定:Worksheets(“シート名”)
           Worksheets(1)
           wb1.Worksheets(“Sheet1”)
  • 参考)範囲指定 :LastRow1 = ws1.Range(“B2:B” & Cells(Rows.Count, “B”).End(xlUp).Row).Count
  • 表示形式を調べる:Debug.Print VarType(strNum), TypeName(Str(Num)) ‘(VarType関数)8:文字列

解説

  • 1-4行目:スクリーン更新、イベント、計算を停止しています。
  • 6-14行目:処理する基本ファイル(ThisWorkbook)とその中の検索シートを定義しています。その後、1列目の最終行をLastRow1に設定しています。
  • 16行目:基本ファイルの処理のために、F2から始まる領域をクリアしています。
  • 18-30行目:基本ファイルの1列目のすべてのセルを文字列に変換しています。これは、後で辞書オブジェクトで使用するために必要です。この処理では、ステータスバーに進捗状況を表示するために、StatusBarプロパティを使用しています。
  • 32-38行目:ファイルを開くダイアログボックスを表示し、ユーザーが選択したファイルを変数FNameに格納します。FNameがFalseでない場合、選択されたファイルを開いて、最初のワークシートをws4に設定し、2列目の最終行をLastRow4に設定します。
  • 40-50行目:相手ファイルの1列目のすべてのセルを文字列に変換します。これは、後で辞書オブジェクトで使用するために必要です。この処理では、ステータスバーに進捗状況を表示するために、StatusBarプロパティを使用しています。
  • 52-56行目:辞書オブジェクトを作成し、重複するキーを避けるために、ws4の1列目の値をキーとして、1行目からBB行目の値を値として辞書に追加します。
  • 58-62行目:ws1の1列目の値をキーとして、辞書から値を取得して、ws1のF列からBG列に値をコピーします。
  • 64-71行目:同様に、ws4の3列目の値をキーとして、4列目からBD列目の値を値として辞書に追加し、ws1の20行目からA行目のH列からBH列に値をコピーします。
  • 73-76行目:wb4、ws4、および辞書オブジェクトを解放します。
  • 78-79行目:フィルタを解除して、処理が終了しましたを通知します。
  • 81-83行目:計算、画面更新、およびイベントの再開

コメント

タイトルとURLをコピーしました