宏:编辑宏以在工作簿之外的工作表中工作

时间:2018-07-20 10:58:26

标签: excel-vba

我当前正在使用一个宏,该宏从工作簿的一个工作表查找到工作簿的另一工作表,并在第一工作表中显示结果。这个宏出现在我所有的工作簿中,基本上,我正在复制第二个工作表中所有文件的相同数据。由于所有这些数据都非常庞大,并且打开和粘贴需要大量时间,因此这已成为一项耗时的活动。

我希望同一个宏使用存在该宏的工作簿之外的公共文件,而不是同一个文件中的选项卡。

我正在粘贴下面使用的宏。基本上,它基于特定的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"

1 个答案:

答案 0 :(得分:0)

  1. 将工作表“产品映射”放入宏自己的工作簿中,将其与宏一起

  2. 使用ThisWorkbook.Sheets("Product Mapping")代替Sheets(“产品映射”)。

    说明:ThisWorkbook始终是对包含宏的工作簿的引用。这就是为什么宏应该与“产品映射”放在同一本书中的原因。

  3. 具有一个变量来保存对包含“ 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而不是查找它。

    < / li>
  4. 使用synDataSheet代替Sheets(“ Syn Data”)。

  5. 您可能希望通过确保synDataBook符合预期来检查错误:

    If synDataBook Is Nothing Then
      MsgBox "Cannot find worksheet ""Syn Data""."
      Stop
    End If