数组(0)给出的值超出了分配给它的范围

时间:2014-04-15 22:56:50

标签: arrays excel vba set range

我试图在VBA中为数组分配一些值,问题是当我尝试打印数组的每个值时,我得到的值多于预期值,因为第一个值被赋值给Header。

我有这样的值:

  1. A3 - 类别(标题)
  2. A4 - 全球
  3. A5 - KAM
  4. A6 - 推销员
  5. A7 - 外部
  6. A8 - 管理员
  7. 这是我的代码:

    Function xyz()
    Dim Category as Variant
    Set Category = Sheets("Reports").Range("A4:A8")
    End Function
    

    我得到的价值是:

    MsgBox Category(0) =Category
    MsgBox Category(1) =Global
    MsgBox Category(2) =KAM
    MsgBox Category(3) =Salesman
    MsgBox Category(4) =External
    MsgBox Category(5) =Admin
    

    据我所知,数组的Option Base默认设置为'0',那么为什么Category(0)值考虑“A3”单元而不是“A4”单元?

1 个答案:

答案 0 :(得分:1)

Sheets("Reports").Range("A4:A8")正在返回Range个对象,您可以引用与该范围相关的单元格。例如,如果您在标题上方的单元格中放置一些示例文本,并尝试MsgBox Category(-1),则会显示该值。

看看这个:http://msdn.microsoft.com/en-us/library/office/ff841096%28v=office.15%29.aspx

由于ItemRange类的默认属性,因此您可以在不明确使用Range.Item的情况下引用它(例如,Category(0)在您的示例中与{Category.Item(0)相同1}})

Item属性 - 无论是在Category.Item(0)中明确提供,还是在您的情况下隐含地在Category(0)中提供,都会返回另一个范围,表示其地址相对于您的范围的单元格。这就是为什么如果你运行我的测试并用单元格A2中的示例文本调用MsgBox Category(-1),它将显示该文本。

仅供参考:如果您想证明Category(0)实际上是一个范围,请运行MsgBox TypeName(Category.Cells(0))