自学成才我还没有学到有关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
为什么需要定义这个子?我把它作为一个标准模块,并设置它,以便一旦按下按钮,我将能够将几页移动到一个新的工作簿,删除空白的工作簿,并从那里使用保存功能你告诉它在哪里保存。
我还有很长的路要走,但我想测试保存功能,然后从那里开始,因为对我来说这将是最困难的事情。
所以,如果不解决我的整个难题,我想知道为什么需要定义这样的东西?以及如何定义......如果有人能给出答案,我们将非常感激。
答案 0 :(得分: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
另一方面,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的说法相应地设置变量。在您的情况下,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