变量如何在VBA中作用域

时间:2013-09-04 22:19:12

标签: excel vba excel-vba

我有以下代码:

Dim RR As Range

RR = Sheet90.Range("AA25:AA46")
For i = 1 To ComboBox1.ListCount

       'Remove an item from the ListBox.
       ComboBox1.RemoveItem 0

Next i


Dim R As Range


For Each R In RR.Cells
    If Len(R.Value) > 0 Then
        Sheet90.ComboBox1.AddItem (R.Value)
    End If
Next R

显然,它不起作用。

我正在尝试使用已定义数组的非空值填充组合框。

Excel VBA不支持我的方法,其错误消息不太有帮助。

它说,

Run-time error '91'
Object variable or With block variable not set

我认为这是某种词汇范围问题,但对于我的生活,我无法理解。所有内容都包含在一个私有SUB中,奇怪的是,当我运行时:

RR = Sheet90.Range("AA25:AA46")
For i = 1 To ComboBox1.ListCount

       'Remove an item from the ListBox.
       ComboBox1.RemoveItem 0

Next i

它清除了这个盒子。

如果我Dim RR As Range,一切都会崩溃。

我没有写过多年的vba,所以我可能会犯一些简单的错误,我真的很感激任何指导。

谢谢!

2 个答案:

答案 0 :(得分:4)

问题是在分配对象变量时需要使用Set关键字:

'Change this line:
RR = Sheet90.Range("AA25:AA46")

'To be this instead:
Set RR = Sheet90.Range("AA25:AA46")

答案 1 :(得分:1)

虎的解决方案肯定是你的错误的解决方案。

由于您正在寻求一些帮助/指导,我想给您一些关于使用组合框的额外提示,这些提示太多了,无法发表评论,所以这里有:

使用一个语句清除组合框(而不是使用循环):ComboBox1.Clear

此外,假设您的范围未填充公式等,您可以使用SpecialCells method返回该范围内的非空单元格,从而避免额外的检查空白值(Len(r.Value) > 0)的步骤。

Dim RR As Range
Dim r As Range

Set RR = Range("AA25:AA46").SpecialCells(xlCellTypeConstants)

ComboBox1.Clear
For Each r In RR.Cells
    ComboBox1.AddItem r
Next