子或函数未定义

时间:2012-08-31 19:52:24

标签: excel excel-vba vba

自学成才我还没有学到有关Excel VBA的所有知识。地狱说实话,我知道一些基本知识,但不是我可能应该做的那么多,所以这个问题虽然可能是一个通用的基本问题,但可能应该知道VBA的人知道,但在我学习我需要的东西的情况下前进......所以我需要一个解释。

您何时需要定义Sub或Function?为什么需要定义Sub或Function?定义Sub或Function的目的是什么?

我只问,因为这个:

Option Explicit

Sub OpenOrderReportExport()

    Dim wsJL As Worksheet   'Jobs List
    Dim wsPOT As Worksheet  'PO Tracking
    Dim wsTNO As Worksheet  'Tel-Nexx OOR
    Dim wbBK2 As Workbook   'New Workbook
    Dim wsWS1 As Worksheet  'Sheet1
    Dim wsWS2 As Worksheet  'Sheet2
    Dim wsWS3 As Worksheet  'Sheet3


    Set wsJL = Sheets("Jobs List")      'Jobs List
    Set wsPOT = Sheets("PO Tracking")   'PO Tracking
    Set wsTNO = Sheets("Tel-Nexx OOR")  'Tel-Nexx OOR
    Set wbBK2 = Workbook("Book2")       'New Workbook
    Set wsWS1 = Sheets("Sheet1")        'Sheet1
    Set wsWS2 = Sheets("Sheet2")        'Sheet2
    Set wsWS3 = Sheets("Sheet3")        'Sheet3

        Application.ScreenUpdating = False    ' Prevents screen refreshing.
        CurrentFile = ThisWorkbook.FullName
        NewFileType = "Excel Files 2007 (*.xlsx)"
        NewFile = Application.GetSaveAsFilename(InitialFileName:="Open Order Log - " & Format(Date, "dd-mm-yyyy") & ".txt", fileFilter:=NewFileType)

End Sub

为什么需要定义这个子?我把它作为一个标准模块,并设置它,以便一旦按下按钮,我将能够将几页移动到一个新的工作簿,删除空白的工作簿,并从那里使用保存功能你告诉它在哪里保存。

我还有很长的路要走,但我想测试保存功能,然后从那里开始,因为对我来说这将是最困难的事情。

所以,如果不解决我的整个难题,我想知道为什么需要定义这样的东西?以及如何定义......如果有人能给出答案,我们将非常感激。

3 个答案:

答案 0 :(得分:5)

您的帖子围绕以下问题展开,让我逐一解释。

您的问题

  1. 您何时需要定义Sub或Function?
  2. 为什么需要定义Sub或Function?
  3. 定义Sub或Function的目的是什么?
  4. 为什么需要定义这个子?
  5. VBA支持两种类型的程序:子程序功能程序

    子程序由一系列语句组成,可以通过多种方式执行,例如

    Sub Sample()
        MsgBox "Hello Matt Ridge"
    End Sub
    

    Sub Sample()
        Sample1 "Hello Matt Ridge"
    End Sub
    
    Sub Sample1(s As String)
        MsgBox s
    End Sub
    

    enter image description here

    另一方面,VBA 函数返回单个值或可能是数组。可以从另一个VBA过程调用函数,也可以在工作表公式中使用该函数。例如

    Sub Sample()
        Dim Ret As String
    
        Ret = GreetUser("Matt Ridge")
    
        MsgBox Ret
    End Sub
    
    Public Function GreetUser(User As String)
        GreetUser = "Hello " & User
    End Function
    

    也可以在工作表中调用相同的函数。例如,单元格A1具有Matt Ridge,并且当您在单元格B1中键入此公式时

    =GreetUser(A1)
    

    您将在Cell B1中获得Hello Matt Ridge。请参见下面的快照。

    enter image description here

    现在查看您的代码。

    当你说

        Dim wbBK2 As Workbook 
    

    然后VBA希望您按照enderland的说法相应地设置变量。在您的情况下,VBA正在寻找WORKBOOKS(),这是一种内置方法。但是,当VBA看到它无法识别的WORKBOOK()时,它会尝试在模块中找到SUB PROCEDURE希望您可能已将其定义在某处)以及何时找不到它,就会出现错误。 :)

    希望这能回答你的问题。

答案 1 :(得分:2)

你误解了这个问题。

以下代码行不正确。它不会像您认为的那样创建新的工作簿。函数Workbook不存在 - 当您尝试运行/编译VBA编辑器时,会抱怨该函数不存在。

Set wbBK2 = Workbook("Book2")       'New Workbook

将其更改为

set wbBK2 = Workbooks.add

它将创建一个新工作簿并在wbBK2中保存一个引用。或者,如果您不想创建一个新的,可以通过向Workbook添加“s”来引用打开的工作簿:

Set wbBK2 = Workbooks("Book2")       'New Workbook

您还需要将这些变量最终标注为字符串:

    Dim CurrentFile as String        
    Dim NewFileType as String
    Dim NewFile as String

    CurrentFile = ThisWorkbook.FullName
    NewFileType = "Excel Files 2007 (*.xlsx)"
    NewFile = Application.GetSaveAsFilename(InitialFileName:="Open Order Log - " & Format(Date, "dd-mm-yyyy") & ".txt", fileFilter:=NewFileType)

另一个注意事项 - 当你使用

Set wsWS1 = Sheets("Sheet1")        'Sheet1
Set wsWS2 = Sheets("Sheet2")        'Sheet2
Set wsWS3 = Sheets("Sheet3")        'Sheet3

您可能希望将其更改为引用其他工作簿中的工作表

Set wsWS1 = wbBK2.Sheets("Sheet1")        'Sheet1
Set wsWS2 = wbBK2.Sheets("Sheet2")        'Sheet2
Set wsWS3 = wbBK2.Sheets("Sheet3")        'Sheet3

因为即使您添加其他工作簿,维护对这些工作表的正确引用也会非常有用。

答案 2 :(得分:0)

您遇到的问题是您正在使用OPTION EXPICIT,这意味着要定义所有变量。 实现此目的并使代码更好和可读的一种方法是在首次定义和设置对象时使用冒号作为行连续:

以下示例:

Option Explicit 

Sub OpenOrderReportExport() 

    Dim wsJL As Worksheet:  Set wsJL = Sheets("Jobs List")      'Jobs List 
    Dim wsPOT As Worksheet: Set wsPOT = Sheets("PO Tracking")   'PO Tracking 
    Dim wsTNO As Worksheet: Set wsTNO = Sheets("Tel-Nexx OOR")  'Tel-Nexx OOR
    Dim wbBK2 As Workbook:  Set wbBK2 = Workbook("Book2")       'New Workbook 
    Dim wsWS1 As Worksheet: Set wsWS1 = wbBK2.Sheets("Sheet1")  'Sheet1 
    Dim wsWS2 As Worksheet: Set wsWS2 = wbBK2.Sheets("Sheet2")  'Sheet2  
    Dim wsWS3 As Worksheet: Set wsWS3 = wbBK2.Sheets("Sheet3")  'Sheet3 

    Application.ScreenUpdating = False    ' Prevents screen refreshing. 
    Dim CurrentFile as string: CurrentFile = ThisWorkbook.FullName 
    Dim NewFileType as string: NewFileType = "Excel Files 2007 (*.xlsx)" 
    Dim NewFileType as string: NewFile = Application.GetSaveAsFilename(InitialFileName:="Open Order Log - " & Format(Date, "dd-mm-yyyy") & ".txt", fileFilter:=NewFileType) 

End Sub