我当前正在使用一个宏,该宏从工作簿的一个工作表查找到工作簿的另一工作表,并在第一工作表中显示结果。这个宏出现在我所有的工作簿中,基本上,我正在复制第二个工作表中所有文件的相同数据。由于所有这些数据都非常庞大,并且打开和粘贴需要大量时间,因此这已成为一项耗时的活动。
我希望同一个宏使用存在该宏的工作簿之外的公共文件,而不是同一个文件中的选项卡。
我正在粘贴下面使用的宏。基本上,它基于特定的ID从“产品映射”标签中查找“产品类型”,并将其粘贴到“ Syn Data”标签中。该宏从“ Syn Data”选项卡运行。我希望此宏从存储在单独位置的文件中查找,以便可以从该文件中删除“产品映射”选项卡。请任何人帮助我。
Dim a, b, i As Long
a = Sheets("Product mapping").Range("A1:E" & LastRowMap).Value
b = Sheets("Product mapping").Range("B1:E" & LastRowMap).Value
'For lookup using ACID
Dim ProdMapDict As Object
Set ProdMapDict = CreateObject("Scripting.Dictionary")
'For lookup using ID
Dim ProdMapDict2 As Object
Set ProdMapDict2 = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(a, 1)
ProdMapDict.Item(a(i, 1)) = a(i, 5)
Next
For i = 2 To UBound(b, 1)
ProdMapDict2.Item(b(i, 1)) = b(i, 4)
Next
'Lookup manual product type using ACID then ID
a = Sheets("Syn Data").Range("R1:T" & LastRow).Value
a(1, 3) = "Manual Product Type"
For i = 2 To UBound(a, 1)
If ProdMapDict.exists(a(i, 1)) And a(i, 1) <> "" Then
a(i, 3) = ProdMapDict.Item(a(i, 1))
ElseIf ProdMapDict2.exists(a(i, 2)) And a(i, 2) <> "" Then
a(i, 3) = ProdMapDict2.Item(a(i, 2))
Else
a(i, 3) = "#N/A"
End If
Next
'Extract relevant columns from array into spreadsheet
Sheets("Syn Data").Range("DI1:DK" & LastRow).Value = a
Sheets("Syn Data").Range("BQ2:BQ" & LastRow).Value = Range("DK2:DK" & LastRow).Value
Sheets("Syn Data").Range("DI1:DK" & LastRow).Clear
MsgBox "Manual product type updated"
答案 0 :(得分:0)
将工作表“产品映射”放入宏自己的工作簿中,将其与宏一起。
使用ThisWorkbook.Sheets("Product Mapping")
代替Sheets(“产品映射”)。
说明:ThisWorkbook
始终是对包含宏的工作簿的引用。这就是为什么宏应该与“产品映射”放在同一本书中的原因。
具有一个变量来保存对包含“ Syn Data”的工作簿的引用,并具有一个变量来保存对工作表“ Syn Data”的引用:
Dim synDataBook as Workbook
Dim synDataSheet as Worksheet
For Each synDataBook In Workbooks Do
On Error Resume Next
set synDataSheet = synDataBook.Worksheets("Syn Data")
If Not synDataSheet Is Nothing Then Exit For
On Error Goto 0
Next synDataBook
说明:宏从包含“产品映射”的工作簿运行。它必须寻找包含“ Syn Data”的工作簿,否则用户必须注意包含“ Syn Data”的工作簿是ActiveWorkbook
。
如果确定在调用宏时用户可以确定“ Syn Data”是ActiveSheet
,则可以说set synDataSheet = ActiveSheet
而不是查找它。
使用synDataSheet
代替Sheets(“ Syn Data”)。
您可能希望通过确保synDataBook
符合预期来检查错误:
If synDataBook Is Nothing Then
MsgBox "Cannot find worksheet ""Syn Data""."
Stop
End If