【问题标题】:Expression statements in VBAVBA 中的表达式语句
【发布时间】:2012-04-29 10:52:04
【问题描述】:

我最近尝试编写 Excel 宏,我需要确定是否存在特定的工作表。我选择编写脚本的武器是 Python,而我的 VBA 技能确实很差。因此,以良好的 Python 风格,我采用了比许可更容易请求宽恕的方法,并写了如下内容:

Debug.Print MyWorkbook.Worksheets(TabName).Name  ''Check for an index error
If Err.Number <> 0 Then
    ''Code to add the sheet to the workbook

在我尝试消除打印语句之前,这非常有效。我将第一行改为:

MyWorkbook.Worksheets(TabName).Name

突然间我开始收到“对象不支持此属性或方法”错误。作为一名 Python 程序员,这让我很惊讶,我一直在用 Python 做类似的事情。

我很好奇,所以我做了一点阅读。我能够在 Python 中找到关于上述表达式语句的文档,但在 VBA 中找不到。 VBA中根本不允许表达式语句吗?如果是这样,他们不这样做有什么原因吗?有谁知道我在哪里可以读到这个?

【问题讨论】:

  • 我认为请求原谅更容易:)。
  • 如果将工作表名称分配给变量,是否可以解决您的问题?
  • @DougGlancy 哈哈,好电话。错字!

标签: python vba language-theory


【解决方案1】:

简短的回答是“不”。 VBA 一直势在必行。通常,表达式不是合法的独立语句。你会注意到很多表达式甚至不会“编译”:

'Won't "compile"
(42+99)

在您的具体示例中,还有更多内容。 VBA 以您想要的方式将此行上的 MyWorkbook.Worksheets(TabName).Name 视为返回值的表达式:

'Fine: gets value of `Name` property
Debug.Print MyWorkbook.Worksheets(TabName).Name

VBA 在这一行看到相同的代码:

'Error: tries to call `Name` as method
MyWorkbook.Worksheets(TabName).Name

尝试在工作表对象上调用(不存在的)Name 方法。 (NameWorksheet 的属性。)因此错误消息,现在您知道发生了什么就更有意义了。

至于阅读更多关于此的内容,您可以在此处查看:

https://stackoverflow.com/a/1545024/58845

那里有一个 VBA 语言规范的链接,它可能更准确地涵盖了这类事情,尽管我没有检查:

http://msdn.microsoft.com/en-us/library/dd361851%28PROT.10%29.aspx

【讨论】:

    【解决方案2】:

    在 VBA 中,你不能在没有实际使用的情况下编写一行变量。就像@Marc 所说,你只需要将名称分配给另一个变量。

    另外,通常我使用以下函数来检查:

    Public Function CheckWorksheetExists(wsNams As String) As Boolean
    
        Dim ws As Worksheet
        On Error Resume Next
        Set ws = Thisworkbook.Worksheets(wsName)
        CheckWorksheetExists = err.Number = 0
    
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2019-07-10
      • 2011-03-19
      • 2011-03-28
      • 2016-03-17
      • 2012-01-01
      • 1970-01-01
      相关资源
      最近更新 更多