2012-03-23 98 views
0

我已經針對兩個問題運行了關於我想要用VBA處理變量範圍和生命週期的問題。VBA 2關於變量範圍和生命週期的問題

  1. 我有不同的潛艇使用相同的變量,一遍又一遍。例如,一個將列定義爲日期列,cDate或應用程序的整數。由於我有一個大小相同的聲明部分,我想將它放在一個使用Global的獨立模塊中,但這不起作用。我在這裏設置程序範圍有什麼關係?我怎樣才能做到這一點?

  2. 與Q1類似,初始化變量是什麼?具體來說,不是複製和粘貼找到列標題的相同塊(例如cDate),而是將它放入自己的過程中。我正在運行許多問題試圖讓這個工作。我希望這是可能的,也許不是。

如果您需要查看代碼,請告訴我。告訴我你想看到什麼,然後把它扔在這裏。 (PS-我已經通過VBA幫助,MSDN,古爾等,有什麼我不理解這裏)

編輯:添加編輯的代碼,因爲真實的東西很長。所有部分都在單獨的標準模塊中。我讀了全局聲明只在工作簿及以下級別工作,所以我也想每個模塊(這裏沒有顯示)在聲明和設置appwbwrkPublic: 這裏是我的聲明:

Option Explicit 

Global app As Application 
Global wb As Workbook 
Global wrk As Worksheet 

Global cInvoice As Byte 

Global iEndCol As Integer 
Global lEndRow As Long 
Global x As Integer 

Global sString1 As String 

Global rng As Range 

Private Sub Not_Really_a_sub() 
    'No code. I read that any declaration needed to be in a module 
    ' with a procedure. I tried it with out the dummy sub also 
End Sub 
'green text, read me and notes 

而任何調用子:

Dim modulevariables As Integer 

Sub Calling_Sub() 

'doing things 

lEndRow = 1 'blah blah blah 
iEndCol = 1 ' blah blah blah 
app.Run "'" & ThisWorkbook.Name & "'!Header_Finder" 

    'Code using cInvoice etc. 

End Sub 

和標題取景器:

Private Sub Header_Finder() 
    With wb.ActiveSheet 
    For x = 1 To iEndCol 
     If InStr(UCase(.Cells(x, 1)), UCase("Invoice")) > 0 Then 
      cInvoice = x 
     ElseIf .Cells(1, x) = "next thing" Then 
      cNextThing = x 
     End If 
    Next 
End With 
End Sub 

已經感謝。

+0

你是指如何將全局變量放在不同的模塊中不起作用?當你運行你的代碼時,它給出了一個錯誤? 你可以包括你的全局聲明和你的列頭查找程序的初學者? – mkingston 2012-03-23 21:35:31

+0

回車不應該默認提交評論。每次。請參閱原始編輯。 – Bippy 2012-03-23 23:40:25

+1

要清楚,你沒有在任何地方指定它,但我認爲你在訪問變量之前調用了你的變量初始化代碼,對吧? – mkingston 2012-03-24 01:01:59

回答

1

Q1。

您可以在三個不同的級別聲明變量。過程級別(這聽起來像你一直在做什麼,想要離開),模塊級別還是項目級別。

要在模塊級聲明一個變量,只需在第一個過程之外聲明它,例如

Dim app As Application 

Sub mySub() 
... 

該變量將適用於模塊內的所有過程。要讓變量可用於其他模塊中的過程,您可以使用公開聲明,例如

Public app As Application 

Sub mySub() 
.... 

Q2。

如果有一個過程初始化可以根據需要從其他過程調用的變量,那麼執行此操作最簡單的方法。例如,下面的代碼創建一個名爲PubStr的公共變量,在第一個從第二個調用的過程中初始化它。

Option Explicit 
Public PubStr As String 

Sub InitVar() 
PubStr = "Hello World!" 
End Sub 

Sub RunMe() 
Call InitVar 
MsgBox PubStr 
End Sub 

運行「RunMe」將調用初始化公共變量PubStr的InitVar過程。

希望這會有所幫助。

1

不是一個真正的答案,但我需要包含一些代碼。作爲測試,我把下面的代碼一個模塊(模塊)中:

Public wb As Workbook 

而這種代碼在另一模塊(單詞數):

Sub test() 

    Set wb = ThisWorkbook 
    Debug.Print wb.Name 

End Sub 

這對我工作的罰款。你可以嘗試在新的工作簿中做同樣的事情,讓我知道它是怎麼回事?此外,您可以嘗試更明確指定哪些變量如果引用,就像這樣(仍然是單詞數):

Sub test() 

    Set wb = ThisWorkbook 
    Debug.Print Module1.wb.Name 

End Sub 
+1

注意:模塊1中沒有虛擬程序 – mkingston 2012-03-24 00:17:30

+0

注意到,不允許使用虛擬程序,我將在明天嘗試使用工作計算機上的實際文件。我用'Global'在筆記本電腦上試了一下,很高興知道我沒有瘋狂。 – Bippy 2012-03-24 00:45:51

+0

「Module1.wb.Name」很有趣。最近轉移到xl2010,我試圖更明確_everywhere_。通常在xl服務器上有幾個實例運行大量的宏,每個都帶有公共變量,通常具有相同的名稱 - 出現意外的自動化錯誤我懷疑由於範圍太寬。因此,儘可能明確是一件好事。 – whytheq 2012-03-24 17:40:49

2

由於這不屬於我的其他(非)的答案,但我再次需要包括一些代碼,我會把它放在這裏。

在你的「變量」模塊,你聲明變量:

dim wb as Workbook 

之前,你可以使用這個變量必須初始化它,即給它一個值(任何這些例子將工作,每個都是不同的情景):

set wb = ThisWorkbook 
set wb = ActiveWorkbook 
set wb = Application.Workbooks(1) 

如果做訪問它,就像在之前沒有初始化這個變量下面這個例子:

dim wb as Workbook 
debug.print wb.name 

您會收到錯誤消息:「運行時錯誤‘91’:對象變量或帶塊變量未設置」

唯一對象變量需要初始化。其他數據類型不。簡而言之,非對象數據類型如下。默認值(在聲明初始化)括號內:

  • 整數[0]
  • 龍[0]
  • 字符串( 「」)
  • 雙[0]
  • 單[0]
  • 日期[0,或1899年12月30日]
  • 字節[0]
  • 布爾[FALSE]
  • 貨幣[$ 0]

其他的都是一個對象,需要某種初始化的。示例如下:

Option Explicit 

Dim wb as Workbook 
Dim app as Excel.Application 
Dim wrk as Worksheet 

Set app = Application 
Set wb = app.workbooks(1) 
Set wrk = wb.sheets(1) 

'If any of the lines preceding this line are skipped, an error will occur. 
debug.print wrk.name 

很抱歉,如果你已經知道這個(說真的,我是,這是一個很多寫!)只是想確保我們在同一頁上我們上面討論的意見後。

+0

不要道歉,你的努力值得讚賞。我一直在試驗和錯誤的學習,所以我有很多知識空白。有一些我知道,有些我沒有。另外還有很多的術語和定義,我不完全理解 – Bippy 2012-03-24 11:47:06

+0

好吧,有許多問題仍然有一些聲明在潛艇中,然後另一個神祕的地方,其他人只是沒有初始化。但是,將模塊移到新的工作簿中可以解決這個問題。非常感謝您的幫助。 – Bippy 2012-03-24 23:00:40

+0

完全沒問題。樂於幫助 :) – mkingston 2012-03-25 00:34:32