2010-04-16 84 views
12

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

我有这样的:

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

,但我想用在Visual Basic程序表名称。到目前为止我所能得到的最好的结果是选择工作表选项卡与Visual Basic名称,这并没有使我的一天。 Visual Basic必须知道Sheet1,Sheet2等名称。如何将这些与Excel选项卡名称关联起来,以便我不必维护一个随每个新工作表或工作表选项卡重新命名而变化的查找表? 在此先感谢您的答复。

+1

我从来没有遇到过表单名称改变但VB无法看到改变的情况。你能显示你的关联代码吗? – 2010-04-16 00:27:32

回答

16

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

Worksheet.Name
Worksheet.CodeName

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

代号属性是只读

您可以参考一个特定的片作为 工作表(“佛瑞德”)。范围(“A1”)其中佛瑞德是请将.Name属性 或 Sheet1.Range(“A1”)其中Sheet1是工作表的代号。

+0

是的,那正是我在寻找的,谢谢! – SteveNeedsSheetNames 2010-04-16 16:29:41

+0

现在我想要一个具有ParamArray输出的可视化基本函数,并且我希望该输出可用于其他函数,而不必将其放在工作表上,只是将其输入到第二个函数中。有没有办法在Visual Basic中的函数之间传递数组?预先感谢您的回复。 – SteveNeedsSheetNames 2010-04-28 21:57:45

3

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

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

例如,

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

有(至少)两种不同的方式来获得的Worksheet对象

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

当创建包含三个工作表的新工作簿时,将存在四个对象,您可以通过非限定名称访问这四个对象: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,这次你会得到一个“对象不支持这个属性或方法”的错误

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 
1

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

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

与标签不同,对象名称与其他变量(即无空格)具有相同的限制。

0

使用片代号是我需要太多的答案,停止一系列的宏倒下 - ccampj的回答上面的镜子this solution(屏幕图片)

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 
+0

列出Proc的问题让我们设置Get Subs Func已经和我在一起了几年,其中模块名称表名代码名称是一团糟......这解决了这个问题。非常感谢您的代码Harry S – 2016-12-21 09:25:50

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

“对Visual Basic项目的编程访问不受信任” - 启用宏设置http://stackoverflow.com/a/25638419/ – user423430 2016-04-08 19:54:08

+0

.Properties(“Name”)。Value was Exactly what I was was寻找,谢谢! – baldmosher 2016-08-30 12:27:13

+0

列出Proc的问题让我们设置Get Subs Func已经有几年了,其中模块名称表名代码名称是一团糟......这解决了这个问题。非常感谢你的代码Harry S – 2016-12-21 09:28:16