2012-10-08 50 views
0

這是有關錯誤91的發佈#12772920的延續。好的,這裏是情況。 (1)如果這行被註釋掉,則(2)產生錯誤91.如果沒有註釋掉,代碼運行正常。 (3)這應該指向公衆對象公司到「公司」表,不是嗎?我很困惑,爲什麼這條線似乎並不像(1)那樣設置shCompanies對象。錯誤91 - 對象未設置

Option Explicit 
Public wbCode As Workbook 

Public Sub Main() 
    Dim tables As New CTables 
    Set wbCode = ThisWorkbook 
    Call SetExcelObjects 
    (2)Call tables.Indexing 
End Sub 

Public Sub SetExcelObjects() 
    Dim tables As New CTables 
    (3)Set tables.shCompanies = wbCode.Worksheets("Companies") 
End Sub 


---Class Module CTables 
Option Explicit 
Public shCompanies As Worksheet 

Public Sub Indexing() 
    Dim rng As Long 
    Dim tables As New CTables 
    (1)Set tables.shCompanies = wbCode.Worksheets("Companies") 
    rng = tables.shCompanies.UsedRange.Rows.Count 
End Sub 

回答

0

需要聲明tables作爲CTables公共實例。然後,您可以從不同的模塊採取行動。重新聲明它,就像你一直在做的那樣,「清理板岩」並導致你所看到的錯誤。你當然不想在CTables中聲明一個表的實例。

請注意,最佳做法是將實例化表從其聲明中分離出來,因此行Set tables = New CTablesMain中。

下面爲我編譯和運行。我認爲它你所期望的:

Public wbCode As Workbook 
Public tables As New CTables 

Public Sub Main() 
Set tables = New CTables 
Set wbCode = ThisWorkbook 
Call SetExcelObjects 
Call tables.Indexing 
End Sub 

Public Sub SetExcelObjects() 
Set tables.shCompanies = wbCode.Worksheets("Companies") 
End Sub 

    'Class CTables 
Public shCompanies As Worksheet 

Public Sub Indexing() 
    Dim rng As Long 
    rng = shCompanies.UsedRange.Rows.Count 
End Sub 
+0

喜道格:我要去嘗試下一個公共實例......這裏就是我仍然困惑:正如您指出的,我創造CTABLES的兩個實例 - 在Main()和Indexing()中。但是這兩個都是私有範圍變量,即使它們都被稱爲「表」。我不清楚Indexing()中第二次使用'table'是如何重新聲明的,並且替換Main()中的第一個用法。這兩個「表格」變量是不是分開的? – TSB

+0

是的,他們是分開的,獨特的。你原來的代碼失敗了,因爲'SetExcelObjects'中的表對象是該子例程的本地對象,只存在於它內部。它絕不會影響'Main'中聲明的'tables'實例。 'Main'中的表實例永遠不會有'shCompanies'屬性集。所以,當你從main調用'TableIndexing'時失敗。我希望有所幫助。你應該通讀一些變量的範圍,特別是類實例的範圍。 –

相關問題