子或function未定义

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

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

我还有很长的路要走,但是我想testing一下save函数,然后从那里开始,因为对我来说那将是最困难的事情。

所以,如果没有解决我的全部难题,我想知道为什么这样的东西需要定义? 以及如何定义…如果有人可以给出答案,不胜感激。

你误解了这个问题。

以下代码行不正确。 它不会像你想象的那样创build一个新的工作簿。 函数Workbook不存在 – 当您尝试运行/编译VBA编辑器时抱怨函数不存在。

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

将其更改为

 set wbBK2 = Workbooks.add 

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

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

您还需要将这些variables最终定义为string:

  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 

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

您的文章围绕以下问题展开讨论,让我一一解释。

你的问题

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

VBA支持两种types的程序: 子程序function程序

一个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) 

在Cell B1中你会得到Hello Matt Ridge 。 看下面的快照。

在这里输入图像描述

现在看你的代码。

当你说

  Dim wbBK2 As Workbook 

然后,VBA期望您按照enderland所述相应地设置variables。 就你而言,VBA正在寻找一种内置方法WORKBOOKS() 。 但是,当VBA看到它无法识别的WORKBOOK() ,它会尝试在模块中findSUB PROCEDURE希望可能已经在某处定义了它 ),而当它找不到它时,会popup该错误。 🙂

希望这回答你的问题。

你所遇到的问题是你使用OPTION EXPICIT这意味着所有的variablesmst被定义。 实现这一目的的一种方法是让您的代码更加友好和可读,当您首次定义和设置对象时,使用“冒号”作为连续线:

示例如下:

 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 

不知道在这个问题上发生了什么,所以我会猜测:

将这3行添加到所有其他Dim s …下

 Dim CurrentFile as string Dim NewFileType as string Dim NewFile as string 

另外 – 所有这些代码的目的是什么?…是否需要?

  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 

这也许正在朝着你可能想到的方向前进:

 Option Explicit Sub OpenOrderReportExport() Dim CurrentFile As String Dim NewFileType As String Dim NewFile As String Application.ScreenUpdating = False ' Prevents screen refreshing. CurrentFile = ThisWorkbook.Path ChDir CurrentFile NewFileType = "Excel Files 2007 (*.xlsx), *.xlsx" NewFile = Excel.Application.GetSaveAsFilename(InitialFileName:="Open Order Log .txt", fileFilter:=NewFileType) MsgBox (NewFile) End Sub