2014-03-06 32 views
0

所以我一直在尋找stackoverflow,我打了一堵牆。請原諒任何「不良行爲」只需要這個邏輯運行一次。這是我第一次在VBA中使用類(如果我有更多的時間,我只是寫在C#中)VBA Excel試圖存儲一個自定義類的數組

這是我的問題。我有兩個自定義類。 DocName和Doclib

Docname包含我的工作表中每行獲取的各種信息。我正在尋找「職員」名字的獨特性。我無法做一個簡單的搜索,因爲我收到的這個數據庫沒有押韻的名稱存儲的原因。有時候是全名,有時候是中間名,有時候是後面的,有時候是憑證。這令人生氣。

縮寫類如下:

Option Explicit 
Public staff As Boolean 
Public docID As Long 
Public namesCount As Integer 
Private names(5) As String 
Public CNumber As String 
Private fakeCnumber As Long 
Public rowIndex As Integer 
Public hasCnumber As Boolean 
Private rawString As String 


Private Sub class_initialize() 
namesCount = 0 
hasCnumber = False 
rowIndex = 1 
End Sub 

Public Sub resetClass() 
docID = 0 
rowIndex = 1 
resSize = 0 
namesCount = 0 
End Sub 


Public Function match(comp As DocName) As Boolean 
Dim goodMatch As Integer 

goodMatch = 0 

Dim myNames As Integer 
Dim compNames As Integer 
myNames = 0 
compNames = 0 

While (nameValid(myNames)) 

While (comp.nameValid(compNames)) 

If names(myNames) = comp.getName(compNames) Then 
goodMatch = goodMatch + 1 
End If 

compNames = compNames + 1 
Wend 

myNames = myNames + 1 
Wend 

If goodMatch > 1 Then 
match = True 
Else 
match = False 
End If 


End Function 


Public Function nameValid(i As Integer) As Boolean 
If i < namesCount Then nameValid = True 
If i >= namesCount Then nameValid = False 
End Function 

Public Property Let savestate(orig As DocName) 
Dim x As Integer 
x = 0 

docID = orig.getdocID 
hasCnumber = orig.hasCnumber 
If hasCnumber Then CNumber = orig.getCNumber 
While orig.nameValid(x) 
names(x) = orig.getName(x) 
x = x + 1 
Wend 

End Property 

我也有一類 「DocLib」。該類的唯一目標是容納我想要保存的每個DocName實例。我希望它在內存中完成一些後處理,然後再將其轉儲回Excel表。再次縮寫類如下:

Option Explicit 

Private res(500) As DocName 
Private resSize As Integer 



Private Sub class_initialize() 
resSize = 0 
End Sub 

Public Function addDoc(n As DocName) 

Dim x As Integer 
Dim m As Boolean 
m = True 
x = 0 

While x < resSize & resSize > 0 

If res(x).match(n) Then 
res(x).addOrder 
If res(x).hasCnumber = False & n.hasCnumber = True Then 
    res(x).setCNumber = n.getCNumber 
End If 

m = False 

End If 
Wend 

If Not m Or resSize = 0 Then 
res(resSize) = New DocName 
res(resSize).savestate = n 'This is where it breaks ***** 
'res(resSize) = n 

resSize = resSize + 1 
End If 


End Function 

當我運行這個我得到錯誤91.對象變量或塊變量未設置。我在上面「Res(resSize).savestate = n」上面的行得到了這個問題。我嘗試了一下簡單的賦值,但是這給了我相同的錯誤。所以我創造了沒有變化的豐富功能。我也嘗試爲每個位置(崩潰前的行)分配一個新的文檔。我最初沒有這樣做,並且有同樣的錯誤。

任何想法?提前致謝。我相信這是一個簡單的修復。我只需要這個血腥的代碼在測試集上工作一次,然後再次在20k集上工作,我再也不會使用它了。

  • 我試圖在開始時將索引從0改爲1,但沒有工作。當我通過調試器進行跟蹤時,它會在「new」語句之後給docname的class_initialize函數結尾處提供該錯誤。 docname類可以在我需要的其他地方工作。我嘗試了一個簡單的測試,我手動給它的行號,它的工作。一旦我嘗試自己儲存它,它就破裂了。

謝謝你們! 〜乍得

+0

你說你會得到一個錯誤「當我運行THI ......」當你跑什麼?我只看到幾個類定義...你實例化它們的代碼在哪裏?另外,第二個類中的While循環缺少用於管理x的代碼。 –

+1

我注意到你正在使用'&'在哪裏你應該使用'和'... –

回答

2

res(ResSize)將參考存儲到一個對象 - 實例化它,你需要使用

Set res(resSize) = New DocName