我已将范围转换为数组,然后我想循环遍历每个值以计算有多少空值。
由于某种原因,这工作正常
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。有人能够解释这里发生的事情或通过可能发生的事情与我交谈吗?
提前致谢
答案 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