我目前正在工作簿中包含多个工作表的宏,该工作簿旨在基于主工作表中的值显示和隐藏某些工作表。工作表名称也包含在主工作表中,并且主过程在引用需要显示或隐藏的工作表时会查看这些值。此方法的问题在于,如果用户更改工作表选项卡名称,则宏将产生错误。我希望插入一个附加过程,以使每个工作表的选项卡名称等于主工作表的相应单元格中的值。我提出了以下建议:
Sub SheetName()
If Not ActiveWorkbook Is ThisWorkbook Then Exit Sub
Dim DataImport As Worksheet
Set DataImport = ThisWorkbook.Worksheets("Data Import")
DataImport.Range("A13").Value = Sheet1.Name
End Sub
此代码可以正常工作,但此工作簿中约有100多个工作表。我想知道是否有更有效的方法来执行此操作,而不是键入相同的过程100次。我尝试将工作表代码名称存储在数组中,并通过该数组循环相同的过程,例如:
Sub test()
Dim DataImport As Worksheet
Set DataImport = ThisWorkbook.Worksheets("Data Import")
Dim index As Long
Dim ws(0 To 2) As Worksheet
Set ws = Array(Sheet1, Sheet2, Sheet3)
For i = 13 To 14
index = i - 13
DataImport.Cells(i, "A").Value = ws(index).Name
Next i
End Sub
,但显示错误消息“无法分配给阵列”。抱歉,如果我的代码看上去很垃圾,我对VBA还是陌生的,我还有很多东西要学习。
答案 0 :(得分:1)
如果您在主表的ColA中列出工作表 codenames ,则此代码将分别使用当前工作表的标签名称和索引更新B和C列:
Sub UpdateIndex()
Dim ws As Worksheet, cn As String, m
For Each ws In ThisWorkbook.Worksheets
cn = ws.CodeName
If cn <> DataImport.CodeName Then
'look for the codename in the Import sheet
m = Application.Match(cn, DataImport.Columns(1), 0)
If Not IsError(m) Then
'got a match - update this row
DataImport.Cells(m, "B").Value = ws.Name 'tab name
DataImport.Cells(m, "C").Value = ws.Index 'sheet index
End If
End If
Next ws
End Sub
假设您将“数据导入”工作表的代码名称设置为DataImport
。
如果代码是由工作表代号驱动的,则用户重命名选项卡还是更改工作表顺序都无所谓。
答案 1 :(得分:0)
第二次尝试,可以使用Excel内置的Sheets
对象和Workbook.Sheets
集合:
Sub test()
Dim DataImport As Worksheet
Set DataImport = ThisWorkbook.Worksheets("Data Import")
Dim index As Long
Dim ws As Excel.Sheets
Set ws = ThisWorkbook.Sheets
For i = 13 To 14
index = i - 13
DataImport.Cells(i, "A").Value = ws(index).Name
Next i
End Sub