2012-09-17 84 views
0

請問,什麼是錯的再次
標準模塊:A模塊不看公共變量

Public ws1 As Worksheet 
Public rCopy As Range 

Workbook_Open:

Set ws1 = Sheets("abc") 
Set rCopy = ws1.Range("A1") 

第三模塊:

ws1.Select ' Error 
rCopy.Select ' Error 

請幫幫我。

+1

確保在第三工作簿中的代碼Workbook_Open後運行...那什麼事都沒有重置它:)之間 –

回答

2

您發佈的代碼的確是的工作。

你可能會遇到一個錯誤的一個原因是,如果你一直在調試你的代碼,並且在某個點有錯誤並停止執行,公共變量將不再被設置。你只需要重新運行Workbook_Open子(你可以在IDE中運行它,使用F5

注意,你應該採取勸你們最後的問題,並使用Set ws1 = Thisworkbook.Sheets("abc")。如果你不運行ws1將被設置爲abc在另一個工作簿中的風險,因爲它被寫爲它相當於Set ws1 = ActiveWorkbook.Sheets("abc")

+1

感謝,現在的工作。變量流被中斷。 – Alegro

3

如果第三個模塊中的代碼由於發生某些事件而未被調用 Workbook_Open後,這兩個變量仍未初始化。

1

那麼私人會員和財產呢?

Option Explicit 

Private m_mySheet As Worksheet 
Private m_myRange As Range 

Public Property Get MySheet() As Worksheet 
    If (m_mySheet Is Nothing) Then 
     Set m_mySheet = ThisWorkbook.Worksheets("abc") 
    End If 
    Set MySheet = m_mySheet 
End Property 

Public Property Get MyRange() As Range 
    If (m_myRange Is Nothing) Then 
     Set m_myRange = MySheet.Range("A1") 
    End If 
    Set MyRange = m_myRange 
End Property 

Option Explicit 

Sub test() 
    Debug.Print MyRange.Address 
End Sub 
+0

謝謝Daniel。你的代碼對我來說還不太清楚,但我需要一些時間來分析它。 – Alegro

+0

@Alegro:爲了更好地理解,在你的代碼中,你不會使用公共變量ws1或rCopy,但公共屬性如MyRange。如果你調用屬性MyRange,那麼首先檢查m_myRange,如果它是Nothing,那麼它被設置。所以這樣應該避免MyRange在你需要時沒有任何問題:-)。希望它有幫助,關心丹。 – dee

+0

謝謝Daniel。你很親切。我現在看到了這一點。非常好的技巧。 – Alegro