我有代码驻留在页面上并引用工作簿的内容。当从不同的工作表执行时,我想获得包含代码的特定工作表的名称。
我有包含数据的工作表。代码将添加到该工作表和运行中 - 这将生成摘要工作表。在摘要工作表中,我想在数据工作表上运行代码。这意味着我无法使用ActiveSheet
,我必须按名称引用数据表。
如何获取包含代码的工作表的名称,而无需对名称进行硬编码?
答案 0 :(得分:6)
有两个应用程序属性会让您感兴趣。
Application.ThisWorkbook 属性(Excel)
返回一个Workbook对象,该对象表示当前运行宏代码的工作簿。只读。
和:
Application.ThisCell 属性(Excel)
返回从中调用用户定义函数的单元格作为Range对象。
答案 1 :(得分:6)
使用“我”对象。
Me.Name是您寻找的属性,无论活动工作表如何,它都会为您提供包含代码的工作表的名称。
答案 2 :(得分:0)
要查询项目的实际代码结构,您需要允许访问VBA项目对象模型(Excel设置>信任中心>宏设置,然后添加对Microsoft Visual Basic for Application Extensibility vX的引用),其中vX是像5.3这样的版本。您可以使用其中的对象来识别哪些工作表中包含哪些代码。
但是,我建议采取另一种方式。
相反,遍历工作簿中的工作表,然后在错误包装器中使用Application.Run运行宏
请注意,更好的做法是重构代码并将其全部放在标准模块中,然后将工作表作为参数传递(参见我的第二个示例)
E.g:
'With code distributed in each worksheet
Sub blah()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
On Error Resume Next
Application.Run ws.CodeName & ".CollectInfoMacro"
If Err.Number = 1004 Then Debug.Print "Skipping "; ws.Name; ", No macro defined"
On Error GoTo 0
Next ws
End Sub
'Otherwise, better practice would be to refactor
'and not have code on each sheet, instead in a standard module:
Sub blahblah()
Dim ws As Worksheet
Dim results As Collection
Set results = New Collection
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "Summary" Then 'or whatever
results.Add getYourInfoForTheSummary(ws), ws.Name
End If
Next ws
'Process your results (i.e. dump to the summary worksheet etc)
...
End Sub
Function getYourInfoForTheSummary(ws As Worksheet) As Collection 'or return whatever
Dim results As Collection
Set results = New Collection
With ws
'do something
End With
Set getYourInfoForTheSummary = results 'or whatever
End Function