19

似乎 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 选项卡名称相关联,这样我就不必维护一个查找表,该表会随着每个新工作表或工作表选项卡重命名而改变?

4

10 回答 10

27

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

Worksheet.Name
Worksheet.CodeName

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

CodeName 属性是只读的

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

于 2010-04-16T11:33:20.330 回答
5

这将更改所有工作表对象的名称(从 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

重要的是要注意对象名称(代号)“(名称)”被属性名称“名称”覆盖,因此必须将其作为子属性引用。

于 2013-12-09T05:55:12.643 回答
3

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

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

例如,

Set someSheet = ActiveWorkbook.Sheets("Custom Sheet")
于 2010-04-16T00:30:57.010 回答
3

实际上“Sheet1”对象/代码名称可以更改。在 VBA 中,单击 Excel 对象列表中的 Sheet1。在属性窗口中,您可以将 Sheet1 更改为 rng。

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

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

于 2010-05-05T05:36:51.507 回答
2

这是一个非常基本的解决方案(也许我错过了问题的全部要点)。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
于 2012-03-19T23:53:53.417 回答
0

(至少)有两种不同的方法可以到达Worksheet对象

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

创建具有三个工作表的新工作簿时,将存在四个对象,您可以通过非限定名称访问它们ThisWorkbookSheet1; 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,这一次您将收到“对象不支持此属性或方法”错误

于 2010-04-16T02:09:18.817 回答
0

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

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
于 2010-04-16T03:49:24.827 回答
0

使用工作表代号是我也需要阻止一系列宏倒下的答案 - ccampj 上面的答案反映了这个解决方案(带有屏幕图片)

于 2011-06-01T10:33:06.550 回答
0

也许我错了,但是您可以打开一个工作簿,然后选择一个工作表并将其属性(名称)更改为您需要的任何内容。这会覆盖“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”的通用默认值。

于 2018-03-25T02:05:57.457 回答
-1

我想我可能有一个替代解决方案。这有点难看,但它似乎工作。

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
于 2020-02-09T19:37:46.687 回答