Value2变量未定义

时间:2013-12-02 00:46:40

标签: arrays excel vba excel-vba

我已将范围转换为数组,然后我想循环遍历每个值以计算有多少空值。

由于某种原因,这工作正常

Option Explicit
Sub ArrayCount ()

Dim cmArray As Variant

Set cmArray = Worksheets("Sheet1").Range("H19:CN19")

ColCount = 1

For Each Value2 in cmArray
    If Value2 <> "" Then
    ColCount = ColCount + 1
    End If
Next

End Sub

这对我来说似乎很简单并且运作良好。现在突然间我收到一条错误,说“编译错误:变量未定义”,它突出显示了Value2。有人能够解释这里发生的事情或通过可能发生的事情与我交谈吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

您正在使用Option Explicit,这意味着所有变量都应该标注尺寸。只需在维度区域添加Dim Value2 as Variant即可。

Option Explicit
Sub ArrayCount ()

Dim cmArray As Variant
Dim Value2 As Variant
'Code follows...

作为附注,Value2,虽然我不知道它是否是保留关键字,但是属性。尝试将其更改为其他内容以确保安全或避免混淆。

希望这有帮助。

答案 1 :(得分:1)

看起来你正试图将Range对象的Value属性放在一个数组中并循环遍历该数组。这不是你正在做的事情,这里有一些概念。

默认属性

引用对象但未指定属性时,实际上是在访问其默认属性。对于大多数对象,如果它具有Value属性,那么这是默认值。如果它有一个Item属性,那就是默认值。 Range对象有点奇怪。大多数时候,Value属性是Range的默认属性。在某些情况下,Cells属性是默认值。如果你说

vValue = rMyRange

您将vValue设置为等于Value属性。养成总是包含财产而不是依赖默认值的习惯。

vValue = rMyRange.Value

设置关键字

Set关键字发臭。但由于默认属性,这是必要的。当您使用Set时,您说您希望对象变量指向对象。如果您不使用Set,则表示您希望数据变量等于值。

vValue = rMyRange 'vValue = rMyRange.Value
Set vValue = rMyRange 'vValue points to the range object
vValue = rMyRange.Value 'same as the first, good programming practice
Set vValue = rMyRange.Value 'you get an error - a good reason to specify property

变体

Excel具有Variant数据类型,可以转换为任何常规数据类型。这是因为Excel单元格可以容纳许多不同类型的数据,并且它们需要具有类似灵活性的东西。如果要读取单元格的值并且无法确定其中的内容,请使用Variant。还有一些其他时间使用Variant(比如将数组读入数组)。一般情况下,除非您有非常具体(和良好)的理由,否则不要使用Variant。

细胞阵列

如果将Range的Value或Value2属性分配给Variant变量,并且Range具有多个单元格,则该变量将被转换为二维数组。这是读取Excel数据并使用它的最棒的方法 - 速度明智。但是你必须从Variant开始,所以你必须要特别注意上述概念。

vVariant = rRange.Value 'creates an array in vVariant
Set vVariant = rRange.Value 'causes an error
Set vVariant = rRange 'vVariant gets cast to a Range object - not what you wanted

所以使用第一种语法。然后,您可以使用For i = LBound(vVariant,1) to UBound(vVariant,1)循环。或者您可以使用For Each vItm in vVariant

工作表功能方式

Sub ArrayCount()

    Dim rRow As Range
    Dim lColCnt As Long

    Set rRow = Sheet1.Range("H19:CN19")

    lColCnt = Application.WorksheetFunction.CountA(rRow)

    Debug.Print lColCnt

End Sub

阵列方式

Sub ArrayCntArray()

    Dim cmArray As Variant
    Dim i As Long
    Dim lColCnt As Long

    cmArray = Sheet1.Range("H19:CN19").Value

    For i = LBound(cmArray, 2) To UBound(cmArray, 2)
        If Len(cmArray(1, i)) > 0 Then
            lColCnt = lColCnt + 1
        End If
    Next i

    Debug.Print lColCnt

End Sub

范围对象方式

Sub ArrayCountRange()

    Dim rRow As Range
    Dim rCell As Range
    Dim lColCnt As Long

    Set rRow = Sheet1.Range("H19:CN19")

    For Each rCell In rRow.Cells
        If Len(rCell.Value2) > 0 Then
            lColCnt = lColCnt + 1
        End If
    Next rCell

    Debug.Print lColCnt

End Sub