值2variables未定义

我已经将一个范围转换为一个数组,然后我想遍历每个值来计算有多less没有空值。

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

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 

这一切对我来说都很简单,而且运作良好。 现在突然间,我收到一个错误,说“编译错误:variables未定义”,它突出显示了Value2。 有没有人能够解释这里发生的事情,或者通过可能发生的事情来说说我?

提前致谢

它看起来像你试图把一个Range对象的Value属性放在一个数组中,并循环通过该数组。 这不是你正在做的,这里有一些概念。

默认属性

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

 vValue = rMyRange 

您正在将vValue设置为等于Value属性。 养成一种总是包括财产而不是依靠违约的习惯。

 vValue = rMyRange.Value 

设置关键字

Set关键字很臭。 但是由于默认属性,这是必要的。 当你使用Set时,你说你想要一个对象variables指向一个对象。 如果你不使用Set,你说你想要一个数据variables等于一个值。

 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数据types可以被转换成任何正常的数据types。 这是因为Excel单元格可以容纳很多不同types的数据,并且需要具有类似灵活性的东西。 如果你想读取一个单元格的值,并且不能确定它将包含什么,请使用一个变体。 有几个其他时间使用Variant(比如将一个范围读入一个数组)。 一般来说,不要使用变体,除非你有一个非常具体的(和好的)理由。

来自单元格的数组

如果将Range的Value或Value2属性赋值给Variantvariables,并且Range有多个单元格,则该variables将转换为二维数组。 这是读取Excel数据并使用它的最棒的方法 – 速度明智。 但是你必须从一个变体开始,所以你必须对上述概念进行额外的小心。

 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

工作表function的方式

 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 

arrays方式

 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 

您正在使用Option Explicit ,这意味着所有variables都应该被标注。 只需在维度区域添加Dim Value2 as Variant就足够了。

 Option Explicit Sub ArrayCount () Dim cmArray As Variant Dim Value2 As Variant 'Code follows... 

值得一提的是, Value2虽然不知道它是否为保留关键字,但是属性。 尝试改变它以保证安全或避免混淆。

希望这可以帮助。