使工作表名称与单元格值相同

时间:2019-12-02 01:59:08

标签: excel vba accounting

我目前正在工作簿中包含多个工作表的宏,该工作簿旨在基于主工作表中的值显示和隐藏某些工作表。工作表名称也包含在主工作表中,并且主过程在引用需要显示或隐藏的工作表时会查看这些值。此方法的问题在于,如果用户更改工作表选项卡名称,则宏将产生错误。我希望插入一个附加过程,以使每个工作表的选项卡名称等于主工作表的相应单元格中的值。我提出了以下建议:

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还是陌生的,我还有很多东西要学习。

2 个答案:

答案 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