2010-12-13 27 views
1

这是我在Excel VBA中编写的代码的开始,但我不明白为什么我不断收到编译错误(VBA指向代码的最后一行作为错误源,并且“已命名参数已指定“)。这里有这么多聪明的程序员,所以任何人都可以告诉我什么是错的(并修改代码)?我正处于学习VBA的早期阶段,所以对我编写错误代码的更多解释和指导对我来说真的很有帮助。在Excel 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" 

回答

4

你会认为这是愚蠢的,但它会解决您的问题...

你需要调用SaveAs方法和Filename命名参数之前后删除逗号。

所以你的代码的最后一行应该是这样的:

analysisbook.SaveAs Filename:="analysis" & " " & Format(Now(), "dd_mm_yyyy_hh_mm_AMPM") & ".xlsx" 

你只需要使用一个逗号,如果你提供不止一个命名参数。由于您只提供一个(Filename),因此不需要逗号,这会导致您得到(有点神秘的)“命名参数已指定”编译时错误。 Excel认为你错过了在逗号前面提供了一个命名参数。拿出来,它会意识到你只是想包括一个。


编辑:的方法括号的确切含义打来电话,要在需要时他们,是一件很令人困惑,甚至长时间的VBA用户。这是相对复杂的,所以让我看看我可以做些什么来解释它。 (同样的规则也适用于Visual.NET的pre.NET版本,如VB 6)。

简单的规则是,当您将函数的结果分配给变量或其他对象时,您总是将参数列表括在括号内。所以,如果我有一个名为GetAge当我指定了一个姓和名返回的数值函数,我会写:

Dim age As Integer 
age = GetAge("John", "Smith") 

否则,这是从来没有必要用括号括起来的参数。这涵盖了两种可能的情况。首先,当你调用一个子程序(“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" 

或者,你可以选择呼叫两个子程序和函数,其返回值您正在使用的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") 

最后,万一你以为你得到了这一切,有一个更多的可能性,你应该明白。如果将参数包装到一个子程序或函数的返回值中,并且它们使用括号忽略而不使用语句,则VBA将解释参数ByVal),否则它们通常会被参考文献ByRef)。当你写一个方法调用这种方式,编译器会自动重新格式化你,证明它是如何解释的区别:

''#The following line 
MsgBox("Hello World") 
''#will be re-formatted by the compiler to 
MsgBox ("Hello World") 

注意的空间,它包围的方法名和参数之间增加在括号内?该空间表示参数通过ByVal。 Eric Lippert在相关问题上的blog post可能比我能解释这个特殊问题。

+0

非常感谢。我还有一个更加愚蠢的问题要问,而这个问题本质上是更一般的。我已经看到有时候VBA中的参数可以用括号来表示,而其他的只是在一个空格之后(如.saveas)来表示,在哪种情况下你会使用它们?这很混乱,因为我只是开始学习VBA – Carole 2010-12-13 06:18:21

+0

@Carole http://bytes.com/topic/access/insights/732414-how-use-named-arguments – 2010-12-13 06:53:04

+0

@Carole:我添加了对你的问题的回应我的答案。不幸的是,这不是一个简单的答案。 :-) – 2010-12-13 06:53:39

相关问题