Visual Basic似乎无法根据用户修改的工作表名称引用工作表。工作表选项卡可以更改其名称,但似乎Visual Basic仍然将工作表名称视为Sheet1等,尽管工作簿选项卡已更改为有用的内容。
我有这个:
TABname = rng.Worksheet.Name ' Excel sheet TAB name, not VSB Sheetx name.
但我想在Visual Basic例程中使用工作表名称。到目前为止我能得到的最好的是选择Case Case the Worksheet Tab与Visual Basic名称,这不是我的一天。 Visual Basic必须知道Sheet1,Sheet2等名称。如何将这些与Excel选项卡名称关联起来,以便我不必维护一个随每个新工作表或工作表选项卡重命名而更改的查找表? 提前感谢您的回复。
答案 0 :(得分:23)
在Excel对象模型中,Worksheet有2个不同的名称属性:
Worksheet.Name
Worksheet.CodeName
Name属性是读/写,包含工作表选项卡上显示的名称。用户和VBA可更改
CodeName属性是只读的
您可以将特定工作表引用为 工作表(“Fred”)。范围(“A1”),其中Fred是.Name属性 或者作为 Sheet1.Range(“A1”)其中Sheet1是工作表的代号。
答案 1 :(得分:4)
这将更改所有工作表对象的名称(从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
请务必注意,对象名称(代号)“(Name)”被属性名称“Name”覆盖,因此必须将其作为子属性引用。
答案 2 :(得分:3)
您应该能够通过用户提供的名称来引用工作表。您确定要引用正确的工作簿吗?如果您在引用工作表时打开了多个工作簿,那肯定会导致问题。
如果这是问题,使用ActiveWorkbook
(当前活动的工作簿)或ThisWorkbook
(包含宏的工作簿)应该解决它。
例如,
Set someSheet = ActiveWorkbook.Sheets("Custom Sheet")
答案 3 :(得分:3)
实际上可以更改“Sheet1”对象/代码名称。在VBA中,单击Excel对象列表中的Sheet1。在属性窗口中,您可以将Sheet1更改为rng。
然后,您可以将rng作为全局对象引用,而无需先创建变量。所以debug.print rng.name工作得很好。没有更多的工作表(“rng”)。名称。
与标签不同,对象名称与其他变量具有相同的限制(即没有空格)。
答案 4 :(得分:1)
这是一个非常基本的解决方案(也许我错过了问题的全部内容)。 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
答案 5 :(得分:0)
有(至少)两种不同的方式来到Worksheet
对象
Sheets
或Worksheets
个收藏集当创建包含三个工作表的新工作簿时,将存在四个可以通过非限定名称访问的对象: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,这次你将得到一个“对象不支持此属性或方法”错误
答案 6 :(得分: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
答案 7 :(得分:0)
使用工作表代码就是我需要的答案,以阻止一系列宏崩溃 - ccampj的答案高于镜像this solution(带屏幕图片)
答案 8 :(得分:0)
也许我错了,但您可以打开一个工作簿,选择一个工作表并将其属性(Name)更改为您需要的任何内容。这将覆盖“Sheetx”命名约定。这些名称也显示在VBA编辑器中。
如何手动执行此操作: 1.选择工作簿中的工作表(我倾向于创建模板)。 2.将其选项卡名称设置为您喜欢的任何名称(“foo”)。 3.单击开发人员菜单(您之前启用的,对吧?)。 4.找到“属性”并单击它,打开该工作表的属性窗口。 5.字母列表中的第一项是(名称),(名称)右侧是“Sheetx” 6.单击该字段并进行更改(我们如何使用“MyFav”)。 7.关闭属性窗口。 8.转到Visual Basic编辑器。 9.查看刚刚修改的工作簿中的工作表。 10.观察MicroSoft Excel对象显示刚刚更改的名称“MyFav”,右侧是括号中的工作表选项卡名称(“foo”)。
如果您愿意,可以通过编程方式更改.CodeName。我使用非工作表名称来方便我的模板操作。 您不必使用通用默认值“Sheetx”。
答案 9 :(得分:-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