2012-08-31 65 views
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 

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

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

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

+1

它听起来像你得到一个错误说Sub或Function没有被定义。这种类型的错误意味着你对子程序或函数的调用目前没有在模块中定义 - 基本上它不存在。我猜你在哪里得到错误 - 在Application.GetSaveAsFilename。 – AxGryndr

回答

2

你误会的问题。

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

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

将其更改为

set wbBK2 = Workbooks.add 

,它会创建一个新的工作簿和wbBK2保存的参考。另外,您可以通过添加一个“s”引用一个打开的工作簿Workbook,如果你是不是想使一个新的:

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 

因为它会维持在这些片正确的引用非常有帮助的,即使你增加额外的工作簿。

+0

这是基于OP的猜测工作 - 这是模糊的。你已经做了很多工作来回答这个问题,所以我不想把你的答案记下来。 – whytheq

+0

@whytheq你意识到我在开始时回答OP的实际问题,对吧? OP的问题是“未定义的错误”。这肯定是由代码'Set wbBK2 = Workbook(“Book2”)' – enderland

+0

&三个未定义的名称引发同一个错误引起的。除OP之外的所有内容都是模糊的+我把努力放在OPer没有说的错误的答案上;因此-1是不需要的。 (请注意,我编辑并改进了你的答案,即坚持SO的一般精神) – whytheq

-1

不知道是怎么回事,在这个问题上,所以我会想:

添加这3行所有其他Dim小号下方...

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 
+1

这并不回答问题的核心问题。 – enderland

+0

这个标记肯定不符合SO的精神 - OP太含糊。我已经回答了他的问题,具体到他没有定义'CurrentFile'的变量; 'NewFileType'; 'NewFile' – whytheq

5

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

您的问题

  1. 当你需要定义一个Sub或功能?
  2. 为什么你需要定义一个Sub或Function?
  3. 定义一个Sub或Function的目的是什么?
  4. 为什么需要定义这个子类?

VBA支持两种类型的程序:Sub过程功能程序

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 

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) 

您将单元格B1得到Hello Matt Ridge。见下面的快照。

enter image description here

现在看看你的代码。

当你说

Dim wbBK2 As Workbook 

然后VBA预计为enderland提到你相应地设置变量。在你的情况下,VBA正在寻找WORKBOOKS()这是一种内置方法。但是,当VBA看到它无法识别的WORKBOOK()时,它会尝试在模块中找到SUB PROCEDURE,希望您可能已将其定义在某处),并且当它找不到它时,它会弹出该错误。 :)

希望这回答你的问题。

+0

这是一个很好的解决问题的核心问题。 +1 – enderland

0

你的问题是你使用OPTION EXPICIT这意味着所有的变量mst被定义。 一种方式来实现这一目标,使你的代码不错,可读性是使用冒号作为线contiuation当你第一次定义和设置对象:

下例:

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