遍历行,集合和交集VBA

时间:2019-06-29 19:52:54

标签: excel vba

因此,我想遍历电子表格,并在这两个相交的单元格中收集标题,行标题和值。然后构建这些值的数组。

这是例子

   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”的“无效限定符”,而且我无法弄清楚为什么会这样。

1 个答案:

答案 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