キーとアイテムを異なるファイルへ転記
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行目:計算、画面更新、およびイベントの再開
コメント