【问题标题】:Excel tab sheet names vs. Visual Basic sheet namesExcel 选项卡表名称与 Visual Basic 表名称
【发布时间】:2011-02-08 15:23:32
【问题描述】:

Visual Basic 似乎无法根据用户修改的工作表名称来引用工作表。工作表选项卡的名称可以更改,但似乎 Visual Basic 仍将工作表名称视为 Sheet1 等,尽管工作簿选项卡已更改为有用的名称。

我有这个:

TABname = rng.Worksheet.Name  ' Excel sheet TAB name, not VSB Sheetx name.

但我想在 Visual Basic 例程中使用工作表名称。到目前为止,我能想到的最好的方法是选择大小写工作表选项卡与 Visual Basic 名称,这不会让我很开心。

Visual Basic 必须知道 Sheet1、Sheet2 等名称。如何让这些与 Excel 选项卡名称相关联,这样我就不必维护一个查找表,该表会随着每个新工作表或工作表选项卡重命名而变化?

【问题讨论】:

  • 我从未遇到过工作表名称更改但 VB 无法看到更改的情况。你能显示你的相关代码吗?

标签: vba excel worksheet


【解决方案1】:

在 Excel 对象模型中,工作表有 2 个不同的名称属性:

工作表.名称
Worksheet.CodeName

Name 属性是读/写的,包含出现在工作表选项卡上的名称。它是用户和 VBA 可变的

CodeName 属性是只读的

您可以将特定工作表引用为 Worksheets("Fred").Range("A1") 其中 Fred 是 .Name 属性 或作为 Sheet1.Range("A1") 其中 Sheet1 是工作表的代号。

【讨论】:

  • 现在我想要一个带有 ParamArray 输出的 Visual Basic 函数,并且我希望该输出可用于另一个函数,而不必将它放在工作表上只是为了将其放入第二个函数.有没有办法在 Visual Basic 中的函数之间传输数组?提前感谢您的回复。
  • “CodeName 属性是只读的”:这只是在运行时。 CodeName 属性可以在设计时在 VBA 编辑器中设置:在 Microsoft Excel 对象列表中选择工作表并按 F4 以显示特性。 “(名称)”-属性-带括号-指代代码名,而“名称”-属性-不带括号-指出现在工作表选项卡上的名称。
【解决方案2】:

这将更改所有工作表对象的名称(从 VBA 编辑器的角度来看)以匹配它们的工作表名称(从 Excel 的角度来看):

Sub ZZ_Reset_Sheet_CodeNames()
'Changes the internal object name (codename) of each sheet to it's conventional name (based on it's sheet name)

    Dim varItem As Variant

    For Each varItem In ThisWorkbook.VBProject.VBComponents
        'Type 100 is a worksheet
        If varItem.Type = 100 And varItem.Name <> "ThisWorkbook" Then
            varItem.Name = varItem.Properties("Name").Value
        End If
    Next
End Sub

请务必注意,对象名称(代号)“(名称)”已被属性名称“名称”覆盖,因此必须将其作为子属性进行引用。

【讨论】:

  • "对 Visual Basic 项目的编程访问不受信任" - 启用宏设置 stackoverflow.com/a/25638419
  • .Properties("Name").Value 正是我想要的,谢谢!
  • 列出 Proc Lets set Get Subs Func 的问题已经困扰我好几年了,其中 Module name sheet name code name 是一团糟。这解决了这个问题。非常感谢您的代码 Harry S
【解决方案3】:

其实“Sheet1”对象/代号是可以更改的。在 VBA 中,单击 Excel 对象列表中的 Sheet1。在属性窗口中,您可以将 Sheet1 更改为 rng。

然后您可以将 rng 作为全局对象引用,而无需先创建变量。所以 debug.print rng.name 工作得很好。不再有 Worksheets("rng").name。

与选项卡不同,对象名称与其他变量具有相同的限制(即没有空格)。

【讨论】:

    【解决方案4】:

    您应该能够通过用户提供的名称引用工作表。你确定你引用了正确的工作簿吗?如果您在引用工作表时打开了多个工作簿,那肯定会导致问题。

    如果这是问题所在,使用ActiveWorkbook(当前活动的工作簿)或ThisWorkbook(包含宏的工作簿)应该可以解决它。

    例如,

    Set someSheet = ActiveWorkbook.Sheets("Custom Sheet")
    

    【讨论】:

      【解决方案5】:

      这是一个非常基本的解决方案(也许我错过了问题的全部要点)。 ActiveSheet.Name 将返回当前选项卡名称的字符串(并将反映用户未来的任何更改)。我只是调用活动工作表,设置变量,然后将其用作工作表的对象。在这里,我从表中检索数据以设置部门报告。此宏将适用于我的工作簿中针对相同过滤器(条件和复制范围)格式化的任何工作表 - 每个部门都有自己的工作表,并且可以使用此单个宏更改条件和更新。

      Dim currRPT As String
      ActiveSheet.Select
      currRPT = (ActiveSheet.Name)
      Range("A6").Select
      Selection.RemoveSubtotal
      Selection.AutoFilter
      Range("PipeData").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
          ("C1:D2"), CopyToRange:=Range("A6:L9"), Unique:=True
      Worksheets(currRPT).AutoFilter.Sort.SortFields.Clear
      Worksheets(currRPT).AutoFilter.Sort.SortFields.Add Key:= _
          Range("C7"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
          xlSortNormal
      

      【讨论】:

      • 列出 Proc Lets set Get Subs Func 的问题已经困扰我几年了,其中模块名称表名称代码名称是一团糟。这解决了这个问题。非常感谢您的代码 Harry S
      【解决方案6】:

      有(至少)两种不同的方式可以访问Worksheet 对象

      • 通过 DanM 引用的 SheetsWorksheets 集合
      • 不合格的对象名称

      创建包含三个工作表的新工作簿时,将存在四个对象,您可以通过非限定名称访问它们:ThisWorkbook; Sheet1; Sheet2; Sheet3。这使您可以编写如下内容:

      Sheet1.Range("A1").Value = "foo"
      

      虽然这似乎是一个有用的快捷方式,但当工作表被重命名时就会出现问题。即使将工作表重命名为完全不同的名称,未限定的对象名称仍为 Sheet1

      这有一些逻辑,因为:

      • 工作表名称不符合与变量名称相同的规则
      • 您可能不小心屏蔽了现有变量

      例如(在 Excel 2003 中测试),创建一个包含三个工作表的新 Workbook。创建两个模块。在一个模块中声明:

      Public Sheet4 As Integer
      

      在另一个模块中放置:

      Sub main()
      
      Sheet4 = 4
      
      MsgBox Sheet4
      
      End Sub
      

      运行这个,消息框应该会正确显示。

      现在向工作簿添加第四个工作表,它将创建一个Sheet4 对象。再次尝试运行 main,这一次你会得到一个“对象不支持这个属性或方法”的错误

      【讨论】:

        【解决方案7】:

        使用工作表代号是我也需要阻止一系列宏倒下的答案 - ccampj 在镜子上方的答案 this solution(带有屏幕图片)

        【讨论】:

          【解决方案8】:

          我不得不求助于这个,但这存在维护问题。

          Function sheet_match(rng As Range) As String  ' Converts Excel TAB names to the required VSB Sheetx names.
            TABname = rng.Worksheet.Name                ' Excel sheet TAB name, not VSB Sheetx name. Thanks, Bill Gates.
          ' Next, match this Excel sheet TAB name to the VSB Sheetx name:
             Select Case TABname 'sheet_match
                Case Is = "Sheet1": sheet_match = "Sheet1"  ' You supply these relationships
                Case Is = "Sheet2": sheet_match = "Sheet2"
                Case Is = "TABnamed": sheet_match = "Sheet3" 'Re-named TAB
                Case Is = "Sheet4": sheet_match = "Sheet4"
                Case Is = "Sheet5": sheet_match = "Sheet5"
                Case Is = "Sheet6": sheet_match = "Sheet6"
                Case Is = "Sheet7": sheet_match = "Sheet7"
                Case Is = "Sheet8": sheet_match = "Sheet8"
             End Select
          End Function
          

          【讨论】:

            【解决方案9】:

            也许我错了,但是您可以打开一个工作簿,然后选择一个工作表并将其属性(名称)更改为您需要的任何内容。这会覆盖“Sheetx”命名约定。这些名称也显示在 VBA 编辑器中。

            如何手动执行此操作: 1. 在工作簿中选择工作表(我倾向于创建模板)。 2. 将其选项卡名称设置为您喜欢的任何名称(“foo”)。 3. 单击“开发人员”菜单(您之前启用的,对吗?)。 4. 找到“属性”并单击它,打开该工作表的属性窗口。 5. 字母列表中的第一项是 (Name),在 (Name) 的右侧是“Sheetx”。
            6. 单击该字段并更改它(我们使用“MyFav”怎么样)。 7. 关闭属性窗口。 8. 转到 Visual Basic 编辑器。 9. 查看您刚刚修改的工作簿中的工作表。 10. 观察 MicroSoft Excel 对象显示您刚刚更改的名称“MyFav”,并且在该名称右侧的括号中显示工作表选项卡名称(“foo”)。

            您可以根据需要以编程方式更改 .CodeName。我使用非工作表名称来方便我的模板操作。 您不必强制使用“Sheetx”的通用默认值。

            【讨论】:

              【解决方案10】:

              我想我可能有其他解决方案。这有点难看,但它似乎工作。

              Function GetAnyNameValue(NameofName) As String
                  Dim nm, ws, rng As String
                  nm = ActiveWorkbook.Names(NameofName).Value
                  ws = CStr(Split(nm, "!")(0))
                  ws = Replace(ws, "'", "")
                  ws = Replace(ws, "=", "")
                  rng = CStr(Split(nm, "!")(1))
                  GetAnyNameValue = CStr(Worksheets(ws).Range(rng).Value)
              End Function
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多