子或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
因为即使添加其他工作簿,维护对这些工作表的正确引用也会非常有帮助。
您的文章围绕以下问题展开讨论,让我一一解释。
你的问题
- 你什么时候需要定义一个Sub或Function?
- 为什么你需要定义一个Sub或Function?
- 定义Sub或Function的目的是什么?
- 为什么这个子需要被定义?
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