【发布时间】:2015-01-04 17:29:54
【问题描述】:
我正在使用带有 Excel 2010 的 VBA,并正在尝试创建(看起来应该是)一个简单的函数。我希望该函数接收一个字符串参数,如果该字符串与打开的工作簿的名称匹配,则返回对该工作簿对象的引用;如果未找到匹配项,则应返回“#NAME?”。 (该函数还尝试连接常见的文件扩展名以获得匹配,以方便用户使用。)
它是这样的:
Function BookFromName(bookName As String) As Workbook
Dim wb As Workbook
For Each wb In Workbooks
Select Case (wb.Name)
Case bookName, _
bookName & ".xls", _
bookName & ".xlsx", _
bookName & ".xlsm":
Set BookFromName = wb
Exit Function
End Select
Next
MsgBox ("Workbook '" & bookName & "' is not open.")
BookFromName = CVErr(xlErrName)
End Function
现在我收到错误:“运行时错误 438:对象不支持此属性或方法。” 从这一行开始:
Set BookFromName = wb
我尝试将返回类型切换为 Variant 或 Object,但没有任何改变。
我还尝试从行中删除 SET(即使这对我来说似乎不正确),这会将错误更改为 “运行时错误 91:对象变量或未设置块变量。”
我扫描了 Google 和 StackExchange 一段时间,但找不到任何返回工作簿对象的函数示例,而不仅仅是工作簿的名称。
这是 Veve 的建议,效果很好,但我更愿意传递参考:
Function BookFromName(bookName As String) As Variant
Dim wb As Workbook
For Each wb In Workbooks
Select Case (wb.Name)
Case bookName, _
bookName & ".xls", _
bookName & ".xlsx", _
bookName & ".xlsm":
BookFromName = wb.Name
Exit Function
End Select
Next
MsgBox ("Workbook '" & bookName & "' is not open.")
BookFromName = CVErr(xlErrName)
End Function
【问题讨论】:
-
你不能只返回工作簿名称并在调用你的函数后使用它来做任何你想做的事情吗?
-
这样可以完成工作,但我担心我会遗漏一些用于传递引用的 VBA 语法的细微差别。我的问题是我试图将 VBA 视为 .NET 吗?
-
如果正在搜索的工作簿打开,该功能是否有效?
-
它总是在 SET 行上抛出一个错误。如果我在其上方放置一个 MsgBox,我可以显示匹配工作簿的名称,但它仍然会在 SET 上出错。
-
(我不是要评论,但现在我必须使用至少 15 个字符)