什么对象没有被正确设置或引用?

Private Sub UserForm_Initialize() Call CreateDictFromColumns("Schedule", "A", "B") Dim dic As Dictionary Set dic = createdDic For Each k In dic.Keys MsgBox dic(k) Next With ListBox1 .AddItem "test" End With End Sub 'http://stackoverflow.com/questions/33523658/what-is-the-easiest-way-to-take-two-columns-of-data-and-convert-to-dictionary Function CreateDictFromColumns(sheet As String, keyCol As String, valCol As String) As Dictionary Dim aDict As Dictionary Set aDict = New Dictionary Dim rng As Range: Set rng = Sheets(sheet).Range(keyCol & ":" & valCol) Dim i As Long Dim lastCol As Long '// for non-adjacent ("A:ZZ") lastCol = rng.Columns.Count For i = 1 To rng.Rows.Count If (rng(i, 1).Value = "") Then Exit Function aDict.Add rng(i, 1).Value, rng(i, lastCol).Value Next Set createdDic = aDict End Function 

我不断地得到“对象需要”的错误,我相信这是来自Set dic = createdDic但是我似乎无法弄清楚为什么这是错的。 这个对象不需要这样设置,还是在尝试将函数作为字典引用时设置不正确? 所有这些代码正在做的是试图创build一个字典作为列的关键,行是存储的价值。 任何额外的意见将有助于更多地了解如何工作,以及如何声明一个字典作为一个function处理。 谢谢。

你应该总是在你的模块中使用Option Explicit 。 这将无法编译代码中未声明variables(通常是印刷错误的情况下等)

例如,你有:

 Set dic = createdDic 

但是, createdDic不是任何现有对象,对象variables或函数的名称,它们在您的子例程UserForm_Initialize的范围内返回一个对象。

那么这是做什么的解释createdDic作为一个未声明的Varianttypes的Variant ,默认情况下,它将包含一个空string或空数值,它将评估您的expression式为:

 Set dic = "" 

要么

 Set dic = Empty 

这会引发Object Required错误,因为您试图将非对象分配给对象variables。

可能使你困惑,在这里你正在调用函数(但不是从它返回任何值):

 Call CreateDictFromColumns("Schedule", "A", "B") 

要修正这个错误

CreateDictFromColumns的结果赋值给dic对象variables,如下所示:

 Set dic = CreateDictFromColumns("Schedule", "A", "B") 

并确保在给出End Function之前的返回值:

 Set CreateDictFromColumns = aDict 

把它放在一起:

 Private Sub UserForm_Initialize() Dim dic As Dictionary Set dic = CreateDictFromColumns("Schedule", "A", "B") For Each k In dic.Keys MsgBox dic(k) Next With ListBox1 .AddItem "test" End With End Sub 'http://stackoverflow.com/questions/33523658/what-is-the-easiest-way-to-take-two-columns-of-data-and-convert-to-dictionary Function CreateDictFromColumns(sheet As String, keyCol As String, valCol As String) As Dictionary Dim aDict As Dictionary Set aDict = New Dictionary Dim rng As Range: Set rng = Sheets(sheet).Range(keyCol & ":" & valCol) Dim i As Long Dim lastCol As Long '// for non-adjacent ("A:ZZ") lastCol = rng.Columns.Count For i = 1 To rng.Rows.Count If (rng(i, 1).Value = "") Then Exit Function aDict.Add rng(i, 1).Value, rng(i, lastCol).Value Next Set CreateDictFromColumns = aDict End Function