2012-08-31 66 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