Excel选项卡表名称与Visual Basic表名称

看来,Visual Basic不能根据用户修改的工作表名称来引用工作表。 工作表选项卡可以更改其名称,但似乎Visual Basic仍将工作表名称视为Sheet1等,尽pipe工作簿选项卡已被更改为有用的东西。

我有这个:

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

但我想在Visual Basic例程中使用图表名称。 到目前为止我所能得到的最好的结果是select大小写工作表选项卡与Visual Basic名称,这并不是我的一天。 Visual Basic必须知道Sheet1,Sheet2等名称。 我怎么能得到这些与Excel选项卡名称相关联,以便我不必维护一个查找表,哪个更改与每个新的工作表或工作表选项卡重命名? 提前感谢您的回复。

在Excel对象模型中,Worksheet有两个不同的名称属性:

Worksheet.Name
Worksheet.CodeName

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

CodeName属性是只读的

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

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

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

例如,

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

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

 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”覆盖,所以它必须被引用为子属性。

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

那么你可以引用rng作为一个全局对象,而不必先创build一个variables。 所以debug.print rng.name工作得很好。 没有更多的工作表(“rng”)。

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

这是一个非常基本的解决scheme(也许我错过了问题的全部)。 ActiveSheet.Name将返回当前选项卡名称的string(并将反映用户将来的任何更改)。 我只是调用活动工作表,设置variables,然后将其用作工作表的对象。 在这里,我从表格中检索数据来为分部设置报告。 这个macros可以在我的工作簿中的任何工作表中工作,这些工作簿被格式化为相同的filter(criteria和copytorange) – 每个部门都有自己的工作表,并且可以使用这个macros来更改条件和更新。

 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 

有(至less)两种不同的方式来到Worksheet对象

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

当有三个工作表的新工作簿被创build时,将存在四个对象,您可以通过非限定名称访问这些对象: ThisWorkbook ; Sheet1 ; Sheet2 ; Sheet3 。 这可以让你写这样的东西:

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

虽然这可能看起来像是一个有用的捷径,但问题出现在工作表被重命名的时候。 即使工作表被重命名为完全不同的东西,非限定对象名仍保留为Sheet1

这有一些逻辑是因为:

  • 工作表名称不符合与variables名称相同的规则
  • 您可能会不小心掩盖了现有的variables

例如(在Excel 2003中testing),用三个工作表创build一个新的Workbook 。 创build两个模块。 在一个模块中声明:

 Public Sheet4 As Integer 

在其他模块中放:

 Sub main() Sheet4 = 4 MsgBox Sheet4 End Sub 

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

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

使用表单代号是我需要的答案,以阻止一系列的macros掉落 – ccampj上面的答案反映了这个解决scheme (与屏幕图片)

我不得不诉诸这一点,但这与保养有关。

 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