VBA:操作2维数组

林新的VBA和我有一个关于二维数组的问题。 我有一个像这样的数据2d数组:

Dim MyArray(10, 10) As String ' array definition should be 10, 10 as you 10 by 10 elements MyArray(1, 0) = A MyArray(2, 0) = A MyArray(3, 0) = A MyArray(4, 0) = J MyArray(5, 0) = J MyArray(6, 0) = J MyArray(7, 0) = A MyArray(8, 0) = T MyArray(9, 0) = T MyArray(10, 0) = J MyArray(0, 1) = b MyArray(0, 2) = b MyArray(0, 3) = g MyArray(0, 4) = k MyArray(0, 5) = k MyArray(0, 6) = b MyArray(0, 7) = g MyArray(0, 8) = u MyArray(0, 9) = u MyArray(0, 10) = u 

所以数据看起来像这样:

 [A, b] [A, b] [A, g] [J, k] [J, k] [J, b] [A, g] [T, u] [T, u] [J, u] 

有了这个数据,我想遍历第二列,如果前面的字符和当前的字符是相同的,那么在第一列中删除相应的字符。 这是我想要的数组看起来像:

 [A, b] ["", b] [A, g] [J, k] ["", k] [J, b] [A, g] [T, u] ["", u] ["", u] 

任何人都可以给我一个正确的方向指针循环algorithm,将实现这一目标?

看到下面的代码显示你的10乘2的数据,一旦你了解循环,你可以在你的检查工作,玩得开心!

 Option Explicit Sub ArraysExample() 'Dim MyArray(10, 2) As String ' This is actually 11 rows by 3 coulms Dim MyArray(9, 1) As String ' This is what you should have for 10 by 2 Dim rMax As Long, cMax As Long ' Max of Rows and Columns Dim r As Long, c As Long ' Rows and Columns Dim sTmp As String ' Temporary text MyArray(0, 0) = "A" MyArray(1, 0) = "A" MyArray(2, 0) = "A" MyArray(3, 0) = "J" MyArray(4, 0) = "J" MyArray(5, 0) = "J" MyArray(6, 0) = "A" MyArray(7, 0) = "T" MyArray(8, 0) = "T" MyArray(9, 0) = "J" MyArray(0, 1) = "b" MyArray(1, 1) = "b" MyArray(2, 1) = "g" MyArray(3, 1) = "k" MyArray(4, 1) = "k" MyArray(5, 1) = "b" MyArray(6, 1) = "g" MyArray(7, 1) = "u" MyArray(8, 1) = "u" MyArray(9, 1) = "u" rMax = UBound(MyArray) cMax = UBound(Application.Transpose(MyArray)) - 1 ' Transposed are 1 based, so you need to subtract 1 ' To Display data visually For r = 0 To rMax sTmp = "[" For c = 0 To cMax sTmp = sTmp & MyArray(r, c) If c = cMax Then sTmp = sTmp & "]" Else sTmp = sTmp & ", " End If Next Debug.Print sTmp Next End Sub 

尝试这个

 For i =1 to 9 'exclude first element if MyArray(0, i) = MyArray(0, i-1) then MyArray(i, 0) = "" end if debug.print i & ', 0: is ' & MyArray(i, 0) next 

查看通过Debug.Print语句发送到VBE立即窗口(Ctrl + G)的结果是否有助于理解这一切。

 Sub arrTest() Dim vARRs As Variant, v As Long, w As Long ReDim vARRs(0 To 9, 0 To 1) Debug.Print LBound(vARRs, 1) & ":" & UBound(vARRs, 1) Debug.Print LBound(vARRs, 2) & ":" & UBound(vARRs, 2) Debug.Print "---" vARRs(0, 0) = Chr(65) vARRs(1, 0) = Chr(65) vARRs(2, 0) = Chr(65) vARRs(3, 0) = Chr(74) vARRs(4, 0) = Chr(74) vARRs(5, 0) = Chr(74) vARRs(6, 0) = Chr(65) vARRs(7, 0) = Chr(84) vARRs(8, 0) = Chr(84) vARRs(9, 0) = Chr(74) vARRs(0, 1) = Chr(98) vARRs(1, 1) = Chr(98) vARRs(2, 1) = Chr(103) vARRs(3, 1) = Chr(107) vARRs(4, 1) = Chr(107) vARRs(5, 1) = Chr(98) vARRs(6, 1) = Chr(103) vARRs(7, 1) = Chr(117) vARRs(8, 1) = Chr(117) vARRs(9, 1) = Chr(117) 'show data before culling For v = LBound(vARRs, 1) To UBound(vARRs, 1) Debug.Print vARRs(v, 0) & " - " & vARRs(v, 1) Next v Debug.Print "---" For v = LBound(vARRs, 1) + 1 To UBound(vARRs, 1) If vARRs(v, 1) = vARRs(v - 1, 1) Then _ vARRs(v, 0) = vbNullString Next v 'show data after culling For v = LBound(vARRs, 1) To UBound(vARRs, 1) Debug.Print vARRs(v, 0) & " - " & vARRs(v, 1) Next v End Sub 

结果:

 arrTest 0:9 0:1 --- A - b A - b A - g J - k J - k J - b A - g T - u T - u J - u --- A - b - b A - g J - k - k J - b A - g T - u - u - u 

正如你所看到的,我更喜欢变体数组,但方法几乎相同。 使用LBound函数和UBound函数 ,无论您使用的是基于一维的还是基于零的维度,都有助于跟踪两列中的数组范围。