2016-09-23 57 views
1

好了,所以我在這裏找到了一種解決這個問題的方法,但它不在VBA中,所以我只需要正確的語法來從數組中獲取信息。VBA - 循環2D數組定義的範圍

我已經在工作表上定義了一個範圍的數組。我已經發現這實際上並不是一維陣列,因爲我第一次認爲即使第二維參數僅爲1.

現在我只是試圖在數組中循環以幫助我獲得我的回頭看看它們是如何工作的,並且我得到下標超出範圍錯誤。

Dim arr1 As Variant 
Dim e As Variant 

    arr1 = Array(ActiveSheet.Range("A1:A4")) 

For e = LBound(arr1) To UBound(arr1) 
    MsgBox (arr1(e, 1)) 
Next e 

如何修復MsgBox (arr1(e,1))行?

回答

2

有幾個問題:

  1. 分配範圍爲數組
  2. 時,您不需要Array(..)你應該在UBOUND和LBOUND

指定的尺寸所以在這裏:

Dim arr1 As Variant 
Dim e As Long 

    arr1 = ActiveSheet.Range("A1:A4").Value 

For e = LBound(arr1,1) To UBound(arr1,1) 
    MsgBox arr1(e, 1) 
Next e 
+0

確定這非常有意義,除了最後一部分,自從我開始學習以來,我一直()用MsgBox - 不知道我在哪裏瞭解到,但它卡住了。爲什麼這是不好的做法,並轉化爲VB.NET?哦,對於第2點)是必要的或只是良好的做法。 – jamheadart

+1

vba和vb.net是不同的,所以我不確定。但據我所知,除非使用=或Call,否則不要使用'()'。但它似乎無論如何工作。 –

+0

我可能會注意到這一點。這對我很有趣。我總是選擇'MsgBox(「嘿!」&var) - 我想我已經這麼做了,現在看起來很整潔,但也許我會習慣其他方式。 – jamheadart

2

real 1-d陣列,你可以走這條路:

Option Explicit 

Sub main() 
    Dim arr1 As Variant 
    Dim e As Long 

    arr1 = Application.Transpose(ActiveSheet.Range("A1:A4").value) '<--| transposing a 1-column range you get a 1-row range that fits in an actual 1-D array   
    For e = LBound(arr1) To UBound(arr1) <--| no need to specify the column index 
     MsgBox arr1(e) 
    Next e 
End Sub 

爲通過數組迭代,你可能想使用For Each語法:

Option Explicit 

Sub main() 
    Dim arr1 As Variant, elem As Variant 

    arr1 = Application.Transpose(ActiveSheet.Range("A1:A4").value)    
    For Each elem In arr1 
     MsgBox elem 
    Next elem  
End Sub 
+0

感謝您的答案 - 我曾在每一個點上使用,但有了lbound和ubound,我可以使用e作爲計數器,它派上用場而不是elem.position類型。至於第一點,如果那是有效的,那就太好了。我寧願儘可能使用1D陣列。 – jamheadart

+0

不用客氣。如果您使用我的解決方案之一,您可能想接受我的答案。謝謝 – user3598756

+0

即使你向我展示瞭如何獲得一個真正的一維數組,他確實修復了原始代碼,但我不得不挑選其他人作爲我害怕問題的正確答案。我做了upvote,可惜我不能選擇兩個答案:D – jamheadart