【问题标题】:Making sheet name the same as cell value使工作表名称与单元格值相同
【发布时间】:2019-12-02 01:59:08
【问题描述】:

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

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

【问题讨论】:

    标签: excel vba accounting


    【解决方案1】:

    如果您在主工作表的 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

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

    【讨论】:

      【解决方案2】:

      对于您的第二次尝试,您可以使用 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
      

      【讨论】:

      • 您好我考虑过使用这种方法,但我不确定在这种情况下按索引号引用工作表是否有效。工作表的顺序通常会由用户更改,有人告诉我,如果您使用他们的索引号引用工作表,这会导致问题(如果我错了,请纠正我,因为我还是 VBA 的新手)。如果是这种情况,我是否可以使用它们的代号引用工作表? @Doug Glancy
      • 无论如何我可以使用它们的代号引用工作表吗?是的,但不使用变量。如果Sheet1 的代码名称是您手动设置的sh1,您可以直接使用sh1.Name(但看看您如何不能使用变量来实现?)
      • 您总是可以创建一个函数来扫描所有工作表以查找特定名称,然后让它返回索引,然后在您的代码中使用该索引...
      • 我明白了。我倾向于尝试您建议的方法,但是如果用户更改工作表的名称,该函数会出错吗? @braX
      • 必须保持一致,最好是顺序或名称。否则,您将需要一个使用某种匹配方法搜索它的函数。它不能只是随机的。它必须输入某些内容,比如列标题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多