繁体   English   中英

使用自定义对象项遍历字典

[英]Looping Through a dictionary with custom object items

我确定我想念房间里那头硕大的大象,但是我一直在出错。 我正在创建一个名为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类对象,以便可以访问其属性。

正如Comintern正确指出的那样 ,您经常遇到一个常见错误-尝试分配不带Set关键字的对象引用。 这是我可以提出的最小示例,它演示了该问题:

Option Explicit

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

这里有一个本地foo对象变量,该变量分配了一个引用( = New MyClass ),但是由于该赋值是在没有Set关键字的情况下进行的,因此运行此变量会引发运行时错误91:

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

您的代码有完全相同的问题:

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

该代码可以愉快地编译 ,但是在执行时将始终产生该运行时错误91。

这个错误很常见(只需在Stack Overflow上看看有多少个问题涉及运行时错误91 ),我就决定在最新版本的Rubberduck中进行检查,后者是一个开源的COM加载项。可以帮助您清理代码的VBE(我正在管理项目):

Rubberduck代码检查

对象变量“ foo”的分配不带“ Set”关键字

据Rubberduck所知,此变量是一个对象变量,分配时没有使用'Set'关键字。 这将导致运行时错误91'未设置对象或带块变量'。

Rubberduck会发现该错误=)


但这并不会引起人们的注意,只是立即将Prompt重新分配给某些Variant并没有给它分配新的Prompt的意义。 再次如Comintern正确指出的那样 ,您需要在此处Set Prompt = Prompts(Key)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM