Car*_*ole 1 excel vba excel-vba
这是我在Excel VBA中编写的代码的开始,但我不明白为什么我一直收到编译错误(VBA指向最后一行代码作为错误来源,已经指定了"已命名的参数") .这里有很多聪明的程序员,所以有人可以告诉我究竟是什么错误(并修改代码)?我正处于学习VBA的早期阶段,所以对我编码错误的更多解释和指导对我来说真的很有帮助.
非常感谢你.
''''''''''''''''''''''''''''''''''''''''''''
Dim outputbook, sourcebook As Workbook
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Firstly creating new worksheet
Set sourcebook = ActiveWorkbook
Set outputbook = Workbooks.Add
outputbook.SaveAs , Filename:="Output" & " " & Format(Now(), "dd_mm_yyyy_hh_mm_AMPM") & ".xlsx"
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim analysisbook As Workbook
'''''''''''''''''''''''''''''''''''''''''
'Create another new workbook where analysis will be performed
Set analysisbook = Workbooks.Add
analysisbook.SaveAs , Filename:="analysis" & " " & Format(Now(), "dd_mm_yyyy_hh_mm_AMPM") & ".xlsx"
Run Code Online (Sandbox Code Playgroud)
你会认为这很愚蠢,但它会解决你的问题......
您需要在调用SaveAs
方法之后和Filename
命名参数之前删除逗号.
因此,代码的最后一行应如下所示:
analysisbook.SaveAs Filename:="analysis" & " " & Format(Now(), "dd_mm_yyyy_hh_mm_AMPM") & ".xlsx"
Run Code Online (Sandbox Code Playgroud)
如果要提供多个命名参数,则只需使用逗号.因为你只提供一个(Filename
),所以不需要逗号,这导致你得到(有点神秘)"命名参数已经指定"编译时错误.Excel认为您错过了在逗号之前的开头提供命名参数.拿出来,它会意识到你只想包括一个.
编辑:方法调用中括号的确切含义,以及何时需要它们,即使是长期使用VBA的用户也会感到困惑.这是相对复杂的,所以让我看看我在解释它时能做得多好.(相同的规则也适用于Visual Basic的.NET前版本,如VB 6.)
简单的规则是,当您将函数的结果分配给变量或其他对象时,始终将参数列表括在括号中.所以,如果我有一个名为GetAge
在我指定名字和姓氏时返回数值的函数,我会写下面的内容:
Dim age As Integer
age = GetAge("John", "Smith")
Run Code Online (Sandbox Code Playgroud)
否则,永远不必将参数括在括号中.这包括两种可能的情况.首先,当你调用一个永远不会返回值的子例程("sub"),第二,如果你调用一个函数(它总是返回一个值),但是没有赋值,则返回任何变量或对象.基本上,当你忽略它返回的值时.例如:
''#Calling a subroutine
MsgBox "Hello World"
''#Calling the same function as above, but ignoring its return value
''# (this particular example is not very useful, but sometimes you'll do this)
GetAge "John", "Smith"
Run Code Online (Sandbox Code Playgroud)
或者,您可以选择使用语句调用其忽略返回值的子例程和函数,该Call
语句始终需要将参数括在括号中.我个人更喜欢这种语法,因为它与我工作的其他语言更相似,消除了何时需要括号以及何时不使用括号的模糊性,并且在代码中更加明确地调用外部方法.对于上面给出的相同的两个示例,代码将更改为:
''#Calling a subroutine, but using the Call statement
Call MsgBox("Hello World")
''#Calling a function, but ignoring its return value
Call GetAge("John", "Smith")
Run Code Online (Sandbox Code Playgroud)
最后,为了防止你认为自己得到了所有这些,还有一个你应该理解的可能性.如果将参数包装到子例程或函数,其返回值用括号忽略并且不使用该Call
语句,则VBA会将参数解释为value(ByVal
),否则它们通常会通过reference(ByRef
)传递.当您以这种方式编写方法调用时,编译器将自动为您重新格式化它,演示它的解释方式的区别:
''#The following line
MsgBox("Hello World")
''#will be re-formatted by the compiler to
MsgBox ("Hello World")
Run Code Online (Sandbox Code Playgroud)
注意它在方法名称和括在括号中的参数之间添加的空间?该空格表示参数已通过ByVal
.Eric Lippert 关于相关问题的博客文章可能比我能更好地解释这个特殊问题.