首页 文章

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

提问于
浏览
13

似乎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选项卡名称关联起来,以便我不必维护一个随每个新工作表或工作表选项卡重命名而更改的查找表?提前感谢您的回复 .

9 回答

  • 0

    这是一个非常基本的解决方案(也许我错过了问题的全部内容) . 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
    
  • 1

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

    Worksheet.Name
    Worksheet.CodeName

    Name属性是读/写,包含工作表选项卡上显示的名称 . 它是用户和VBA可更改的

    CodeName属性是只读的

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

  • 3

    这将更改所有工作表对象的名称(从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”覆盖,因此必须将其作为子属性引用 .

  • 0

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

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

    例如,

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

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

    然后,您可以将rng作为全局对象引用,而无需先创建变量 . 所以debug.print rng.name工作得很好 . 没有更多的工作表(“rng”) . 名称 .

    与制表符不同,对象名称与其他变量具有相同的限制(即没有空格) .

  • 4

    有(至少)两种不同的方式来到 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,这次你会收到"Object does not support this property or method"错误

  • 1

    使用工作表代码是我需要的答案,以阻止一系列的宏崩溃 - ccampj的答案上面镜像this solution(与屏幕图片)

  • 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
    
  • 20

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

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

    如果您愿意,可以以编程方式更改.CodeName . 我使用非工作表名称来方便我的模板操作 . 您不必被迫使用“Sheetx”的通用默认值 .

相关问题