目标:打开任何工作簿并运行一个宏,该宏将切换出所有名称,并将其替换为工作簿“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
答案 0 :(得分:0)
你的问题是:
Workbooks
)的成员(工作簿&#34; NameToID&#34;)不存在。您需要参考工作簿&#34; NameToID&#34;按其完整文件名;否则它会给你一个超出范围错误的下标,即它应该是Workbooks("NameToID.xlsm")
而不是Workbooks("NameToID")
。注意:显然我假设是* .xlsm,但如果相关则将其更改为* .xlsx或其他。在这种情况下,&#34;下标&#34;是指&#34;索引&#34;,&#34;参考&#34;或&#34; key&#34 ;; &#34;范围&#34;指这些参考的可接受范围(值)。 &#34;下标超出范围&#34;因此,意味着目标参考不存在于可接受的参考范围内。
所以这一行变为:
Set tbl = Workbooks("NameToID.xlsm").Worksheets("NameToID").ListObjects("NameToID")
但是,您的问题的答案是:
在之前执行此操作,您需要检查NameToID
是否已打开;
一个。如果是,请继续;
湾如果不是,请打开它;
℃。 或者,您可以随时假设它将打开,因此无需检查,但您必须正确引用它;这就是你现在正在做的事情
d。 或者,您可以随时假设它不会打开,因此无需检查,但您必须打开它
我们需要一个函数来检查工作簿是否打开;此函数循环遍历所有打开的工作簿并检查所请求的成员是否存在。如果是,则返回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 =
...