0

自学成才,我还没有学到有关 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

为什么需要定义这个 sub?我把它作为一个标准模块,并努力设置它,一旦按下按钮,我就可以将几页移到一个新的工作簿,删除空白的,然后从那里开始保存功能你告诉它在哪里保存。

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

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

4

3 回答 3

5

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

你的问题

  1. 什么时候需要定义 Sub 或 Function?
  2. 为什么需要定义 Sub 或 Function?
  3. 定义 Sub 或 Function 的目的是什么?
  4. 为什么需要定义这个 sub?

VBA 支持两种类型的过程:子过程函数过程

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

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

在此处输入图像描述

另一方面,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)

您将进入Hello Matt Ridge单元格 B1。请参阅下面的快照。

在此处输入图像描述

现在查看您的代码。

当你说

    Dim wbBK2 As Workbook 

然后 VBA 期望您按照提到的 enderland 相应地设置变量。在您的情况下,VBA 正在寻找WORKBOOKS()哪个是内置方法。但是,当 VBA 发现WORKBOOK()它无法识别时,它会尝试SUB PROCEDURE在模块中找到 (希望您可能已经在某个地方定义了它),当它找不到它时,它会弹出该错误。:)

希望这能回答你的问题。

于 2012-08-31T23:58:46.983 回答
3

你误解了这个问题。

以下代码行不正确。它不会像您想象的那样创建新的工作簿。该函数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

因为保持对这些工作表的正确引用将非常有帮助,即使您添加了其他工作簿。

于 2012-08-31T20:29:16.347 回答
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 
于 2012-09-02T13:00:42.473 回答