首页 > 解决方案 > 使工作表名称与单元格值相同

问题描述

我目前正在处理具有多个工作表的工作簿中的宏,旨在根据主工作表中的值显示和隐藏某些工作表。工作表名称也包含在主工作表中,主过程在引用需要显示或隐藏的工作表时查看这些值。此方法的问题在于,如果用户更改工作表选项卡名称,宏将产生错误。我希望插入一个额外的过程,使每个工作表的选项卡名称等于主工作表相应单元格中的值。我想出了以下内容:

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 还是新手,我还有很多东西要学。

标签: excelvbaaccounting

解决方案


如果您在主工作表的 ColA 中列出工作表代号,则此代码将分别使用当前工作表选项卡名称和索引更新列 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.

如果您的代码由工作表代号驱动,则用户是否重命名选项卡或更改工作表顺序都没有关系。


推荐阅读