2015-07-10 183 views
0

Im新的VBA,我有一個關於二維數組的問題。我有一個數據的二維數組,像這樣:VBA:操縱二維數組

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] 

誰能給我一個指針的循環算法,將實現這一目標的正確方向?

+0

最後一個j如何變空它的前一個字符是T – Raghavendra

+0

數組不能正常工作,第二個索引不能超過2!此外,索引從零開始,因此您將排除第一個索引。 – PatricK

+0

像@PatricK說的,但你需要決定你是否要使用基於零的索引(例如0到9)或基於一個索引(例如1到10)。 – Jeeped

回答

2

看到下面的代碼顯示你的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 
+0

我從來沒有用過'.Transpose'來獲得第二級的UBound。好戲! – Jeeped

+0

@Jeeped謝謝,我發現以前從[其他網站](http://www.mrexcel.com/forum/excel-questions/629320-application-transpose-visual-basic-applications-array.html),但無法找到MSDN參考。如果數組超過2D,我沒有任何技巧... – PatricK

1

試試這個

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 
1

查看是否通過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 functionUBound function有助於跟蹤兩個級別中的數組範圍,而不管您使用的是基於單一維還是基於零的維。