创建引用其他工作簿的个人MACRO

时间:2017-11-03 16:38:20

标签: excel excel-vba vba

目标:打开任何工作簿并运行一个宏,该宏将切换出所有名称,并将其替换为工作簿“NameToID”中引用的ID。

工作簿有一个包含两列的表,一列是名称,另一列是关联的ID。工作簿,工作表和表具有相同的标签“NameToID”。

宏存储在我的个人文件夹中,因此我打开的每个文档都可以访问它。现在,我打开我的NameToID工作簿,然后打开我想运行宏的工作簿 - 但是当我运行它时,我得到一个运行时错误9“下标超出范围”错误。我无法弄清楚如何解决它。 NameToID工作簿是否需要存储在个人文件夹中的某个位置,以便始终可以访问?任何帮助都非常感谢。

Sub Multi_FindReplace()
'PURPOSE: Find & Replace a list of text/values throughout entire 
 workbook from a table
'SOURCE: www.TheSpreadsheetGuru.com/the-code-vault

Dim sht As Worksheet
Dim fndList As Integer
Dim rplcList As Integer
Dim tbl As ListObject
Dim myArray As Variant

'Create variable to point to your table
  Set tbl = Workbooks("NameToID").Worksheets("NameToID").ListObjects("NameToID")

'Create an Array out of the Table's Data
  Set TempArray = tbl.DataBodyRange
  myArray = Application.Transpose(TempArray)

'Designate Columns for Find/Replace data
  fndList = 1
  rplcList = 2

'Loop through each item in Array lists
  For x = LBound(myArray, 1) To UBound(myArray, 2)
    'Loop through each worksheet in ActiveWorkbook (skip sheet with table in it)
      For Each sht In ActiveWorkbook.Worksheets
    If sht.Name <> tbl.Parent.Name Then

      sht.Cells.Replace What:=myArray(fndList, x), Replacement:=myArray(rplcList, x), _
        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False

        End If
      Next sht
  Next x

End Sub

1 个答案:

答案 0 :(得分:0)

你的问题是:

  1. 下标超出范围错误通常意味着集合(Workbooks)的成员(工作簿&#34; NameToID&#34;)不存在。您需要参考工作簿&#34; NameToID&#34;按其完整文件名;否则它会给你一个超出范围错误的下标,即它应该是Workbooks("NameToID.xlsm")而不是Workbooks("NameToID")。注意:显然我假设是* .xlsm,但如果相关则将其更改为* .xlsx或其他。
  2. 在这种情况下,&#34;下标&#34;是指&#34;索引&#34;,&#34;参考&#34;或&#34; key&#34 ;; &#34;范围&#34;指这些参考的可接受范围(值)。 &#34;下标超出范围&#34;因此,意味着目标参考不存在于可接受的参考范围内。

    所以这一行变为:

    Set tbl = Workbooks("NameToID.xlsm").Worksheets("NameToID").ListObjects("NameToID")
    

    但是,您的问题的答案是:

    1. 之前执行此操作,您需要检查NameToID是否已打开;

      一个。如果是,请继续;

      湾如果不是,请打开它;

      ℃。 或者,您可以随时假设它将打开,因此无需检查,但您必须正确引用它;这就是你现在正在做的事情

      d。 或者,您可以随时假设它不会打开,因此无需检查,但您必须打开它

    2. 我们需要一个函数来检查工作簿是否打开;此函数循环遍历所有打开的工作簿并检查所请求的成员是否存在。如果是,则返回true。如果没有,则返回false。

      Function IsWorkbookOpen(ByVal wbName As String) As Boolean
      
          Dim wb As Workbook
          For Each wb In Application.Workbooks ' loop through open workbooks
              If wb.Name = wbName Then ' if we find a match, set return value to True and exit the function
                  IsWorkbookOpen = True
                  Exit Function
              End If
          Next wb
          ' if we didn't find a match, set return value to False
          IsWorkbookOpen = False
      
      End Function
      

      使用此功能可以帮助我们打开工作簿,如果它还没有打开。

      If Not IsWorkbookOpen("NameToID.xlsm") Then Application.Workbooks.Open "C:\...\NameToID.xlsm"
      

      然后您可以从Set tbl = ...

      继续