2015-06-12 99 views
-1

我有一个名为“rng1”的范围,第一行是标题。我想要有一个collection来存储所有的变量名称。鉴于有5个变量。集合上运行时错误91

Sub Main()       

    Dim rng As Range 
    Set rng = Range("rng1") 
    Dim header As Collection 

    For i = 1 To 5 
     header.Add Item:=Cells(rng.Row, rng.Column).Offset(0, i - 1).Value 
    Next i 

    End Sub 

我能当我使用的代码MsgBox Cells(rng.Row, rng.Column).Offset(0,0).Value

+2

在本网站快速搜寻“错误91” 3000个资源产生ults ....所有涉及未分配的对象引用。你的'header'是'Nothing',因为你没有初始化它。将其声明为“新集合”或添加“设置标题=新集合”指令。 –

+0

好的。非常感谢。 – useR

+0

在相关主题上,如果您决定切换到Scripting.Dictionary以利用其唯一索引,则必须使用后期绑定或将** Microsoft.Scripting Runtime **添加到项目引用中,以便早期绑定编译。 – Jeeped

回答

4

你从来没有header为对象,以显示变量名。当您将header声明为Collection时,它会指示编译器为Collection对象预留空间,但实际上并未创建该对象。为了实例化对象,你需要做的的线沿线的东西:

Set header = New Collection 

该语言提供,如果你正在创建一个实例(而不是从现有的分配)的一些快捷键的语法,并让您结合在一行中的声明和实例:

Dim header As New Collection 

所以,完整的代码看起来是这样的:

Sub Main()       

    Dim rng As Range 
    Set rng = Range("rng1") 
    Dim header As New Collection 

    For i = 1 To 5 
     header.Add Item:=Cells(rng.Row, rng.Column).Offset(0, i - 1).Value 
    Next i 

End Sub 
+3

在回答这个问题时,这只不过是评论而已。展开以展示代码的修订版本,并可能解释“晚绑定与早绑定”,即使只是一点点,都会使这是一个很好的答案。 (https://msdn.microsoft.com/zh-cn/library/aa261365(v=vs.60).aspx)和[对象变量声明](https: //msdn.microsoft.com/en-us/library/vstudio/cfwx51t1(v=vs.100).aspx)以获取更多信息。 – Jeeped

+1

@Jeeped - 现在编辑,但我不确定这与绑定模型有什么关系。集合也不需要,忘记添加'CreateObject(“Foo.Bar”)''会得到相同的错误91,忘记添加'Set baz = New Foo.Bar'。 – Comintern

+0

@Jeeped - 根本不视为迪斯尼。 ;-)关于我使用后期绑定的所有情况是,如果我需要支持多个版本的Office。你的评论只是让我意识到,即使我想,我也不知道我会如何延迟收藏。我会猜到'CreateObject(“VBA.Collection”)',但它显然没有注册。 – Comintern