2016-09-08 50 views
0

我敢肯定我错过了房间里的大象,但我不断收到错误。我正在创建一个名为Prompts的公用字典,并在下面的子表中填充一个自定义类对象。通过字典与自定义对象项目循环

Public Sub SetPromptControls() 
Dim PromptsRange As Range 
Dim PromptRow As Range 

Set PromptsRange = Range("LookUpTablePrompts") 
Dim NewPrompt As clsPrompt 
For Each PromptRow In PromptsRange.Rows 
    Set NewPrompt = New clsPrompt 
    NewPrompt.Name = PromptRow.Cells(1, 1) 
    NewPrompt.ControlType = PromptRow.Cells(1, 2) 
    NewPrompt.ComboboxValues = PromptRow.Cells(1, 3) 
    NewPrompt.HelpText = PromptRow.Cells(1, 4) 
    NewPrompt.TabIndex = PromptRow.Cells(1, 5) 
    NewPrompt.ColumnIndex = PromptRow.Cells(1, 6) 
    NewPrompt.TableIndex = PromptRow.Cells(1, 7) 
    NewPrompt.ControlName = PromptRow.Cells(1, 8) 


    Me.Prompts.Add NewPrompt.ControlName, NewPrompt 
Next 
End Sub 

现在我试图通过我刚刚在下一个子类中的同一个类中创建的字典进行循环。问题是每个循环不断给我对象错误

Public Sub SetProductPromptMapping() 
Dim ProductPromptMappingRange As Range 
Dim SKURange As Range 
Dim SKUPromptMapRow As Integer 
Dim MapRow As Range 
Dim Key As Variant 
Dim Prompt As clsPrompt 
Set ProductPromptMappingRange = Range("LookUpTablePromptMap") 
Set SKURange = ProductPromptMappingRange.Find(PromptsForm.SKU, LookIn:=xlValues) 
SKUPromptMapRow = SKURange.Row - 2 

For Each Key In Prompts.Keys 
    Set Prompt = New clsPrompt 
    Prompt = Key 
    Me.ProductPromptMappingRow.Add Prompt.ControlName, ProductPromptMappingRange.Cells(SKUPromptMapRow, Prompt.TableIndex).Value 
Next 

End Sub 

最后,我想通过我的Prompts字典环和投目前的项目回到我clsPrompt类对象,这样我可以访问它的属性。

+3

'设置提示=提示(关键)'并删除'提示=关键'行应该这样做。 – Comintern

回答

5

Comintern correctly points out一样,您遇到了一个常见错误 - 尝试分配没有Set关键字的对象引用。下面是最小的例子,我可以拿出演示该问题:

Option Explicit 

Public Sub DoSomething() 
    Dim foo As MyClass 
    foo = New MyClass 
End Sub 

这里有已分配的参考(= New MyClass)本地foo对象变量,但由于分配不Set关键字制造,运行,这将提高运行时错误91:

对象变量或带块变量未设置

你的代码有完全一样的问题:

Dim Prompt As clsPrompt 
'... 
'more code 
'... 
Prompt = Key 

代码高高兴兴编译,但将一如既往地提高该运行时错误91时执行

这个错误已经足够普遍了(只需看看how many questions involve runtime error 91就可以看到堆栈溢出),我决定在最新版本Rubberduck中实现对它的检查,这是一个用于VBE的开源COM插件它可以帮助你清理你的代码(我管理项目):

Rubberduck code inspections

对象变量“富”不“设置”关键字被分配

据Rubberduck可以看出,这个变量是一个对象变量,没有'Set'关键字。这会导致运行时错误91'对象或块变量未设置'。

Rubberduck本来是可以赶上的错误=)


它所不会虽然有抓到,是,它并没有多大意义分配Prompt一个新的参考,只是将其重新分配给一些Variant。再次作为Comintern correctly points out,您需要在Set Prompt = Prompts(Key)这里。

+0

我真的很喜欢阅读你的答案,因为你以非常详细和教学的方式来阅读答案。我在这里没有任何用处,但我想指出,在最后一句中,你有一个小小的错字。 'Propmts(Key)'应该是'Prompts(Key)' –

+0

@VictorMoraes谢谢!错字固定=) –