因此,我想遍历电子表格,并在这两个相交的单元格中收集标题,行标题和值。然后构建这些值的数组。
这是例子
V1 V2 V3 V4
C1 1 1 2
C2 3
C3 2 4
C4 1 1
该数组的最终输出将类似于
V1, C1, 1
V2, C1, 0
V3, C1, 1
V4, C1, 4
V1, C2, 0
V2, C2, 3
etc
然后我将对该数组进行排序,并消除所有值为“ 0”的条目。
问题:在实践中我不是最好的,尝试定义变量或数组条目时总是收到错误。我觉得这个主意不错,但从语法角度来看,我无法克服过去的特定错误。
我想我不会因为彻底破坏学习目的而完全解决它
我最初的解决方案是构建一个数组或Header,Row标头的数组以及数据的数组。
基本上是V值,另一个C值和一个整数值的数组。
我写了下面的代码(同样请原谅我的无知)。
据我所知,它应该循环遍历第一个范围捕获值V1(或我的代码中的C2),循环遍历第二个范围捕获值C1(或我的代码中的A2),然后是1的值(我将称为Z1)。然后增加整数以获取V2,然后是C1,然后是Z2,等等。
Dim myarrayX() As Variant
Dim myarrayY() As Variant
Dim myarrayZ() As Variant
Dim myarrayHeader() As Variant
Dim myarrayRowHeader() As Variant
Dim myarrayIntersection() As Variant
Dim Result() As Variant
Dim i As Variant
Dim j As Variant
Dim k As Variant
Dim l As Variant
Dim m As Variant
Dim n As Variant
l = 0
m = 0
n = 0
myarrayHeader = Range("C2:H2").Value
myarrayRowHeader = Range("A2:A6").Value
myarrayIntersection = Range("C2:H6").Value
For Each i In myarrrayHeader.Cells
myarrayX(l) = Cell.Value
For Each j In myarrayRowHeader.Cells
myarrayY(m) = Cell.Value
For Each k In myarrayIntersection.Cells
myarrayZ(n) = Cell.Value
k = k + 1
i = i + 1
n = n + 1
Next k
m = m + 1
Next j
l = l + 1
j = j + 1
Next i
我无法获得任何输出,因为它表示“ myarrayRowHeader.Cells”的“无效限定符”,而且我无法弄清楚为什么会这样。
答案 0 :(得分:1)
我无法获得任何输出,因为它表示“无效的限定词” “ myarrayRowHeader.Cells”,我不知道为什么。
您在这里有两个问题。第一个明显的错误是错字。始终在模块顶部使用Option Explicit
。 始终 。
您已声明以下内容为变体,目的是用值填充它们-使它们成为值数组:
Dim myarrayHeader() As Variant '<-- Actually, this is an array of Variants, also not what you want!
Dim myarrayRowHeader() As Variant
Dim myarrayIntersection() As Variant
实际上-您确实在代码的开头用这些值填充了这些数组。
myarrayHeader = Range("C2:H2").Value ' One row, multiple columns
myarrayRowHeader = Range("A2:A6").Value ' Multiple rows, one column
myarrayIntersection = Range("C2:H6").Value ' Multiple rows, multiple columns
此时,它们是数组,而不是对象,因此没有任何内部方法或属性。换句话说,myarrayRowHeader
没有.Cells
方法或属性,因此VBA编译器会抱怨。
您的代码的正确语法是简单地遍历数组:
For i = LBound(myarrrayHeader, 2) to UBound(myarrrayHeader, 2) ' <--- typo here
myarrayX(l) = myarrayHeader(I,1)
For j = LBound(myarrayRowHeader, 1) to UBound(myarrayRowHeader, 1)
myarrayY(m) = myarrayRowHeader(j,1)
'etc.
请注意,将Excel Range转换为数组时,即使仅选择一列,也始终是二维数组。
但是因为您正在处理多个列和数组,所以简单的循环将无法工作。您必须了解太空中的相对关系,如下所示。
Dim myarrayHeader As Variant
Dim myarrayRowHeader As Variant
Dim myarrayIntersection As Variant
dim myarray(,) as Variant
myarrayHeader = Range("C2:H2").Value ' One row, multiple columns
myarrayRowHeader = Range("A2:A6").Value ' Multiple rows, one column
myarrayIntersection = Range("C2:H6").Value ' Multiple rows, multiple columns
Dim rowNum as Long
rowNum = 1
ReDim myarray(UBound(myarrayRowHeader,1) * UBound(myarrayHeader, 2),3) ' <--- double check this for right numbers
For i = LBound(myarrayHeader, 2) to UBound(myarrayHeader, 2)
For j = LBound(myarrayRowHeader, 1) to UBound(myarrayRowHeader, 1)
myarray(rowNum, 1) = myarrayHeader(1,i)
myarray(rowNum, 2) = myarrayRowHeader(j,1)
myarray(rowNum, 3) = myarrayIntersection(I,j)
rowNum = rowNum+1
Next j
Next I
编辑:
我的原始代码只是考虑基于单个维度调整最终数组的大小,但是最终数组当然基于两个维度。当OP尝试遍历所有数据时,这会在原始代码中导致超出范围的错误。
将事物保持在UBound(x,1)模式的另一种方法是使用.Transpose
:
myarrayHeader = Range("C2:H2").Transpose.Value ' Now multiple rows, one column