恩抽空研究陣列,發現觀念不好通啊..
一維尚可理解,那二維時就有些亂了..
首先我的疑惑1在
例如:
dim myArray()
redim myarray(5,10)
恩...第一個疑惑,這裡5,10哪一個是列,哪一個是欄..?
我可以把它理解成cells(列,欄)這樣嗎?
還是他比較是同range(欄列)
又或者我可以不管它,反正能存入就好..
不過因為我試著用條件去跑回圈
然後將符合條件時將文字丟入陣列的(1,1),同時將所在的位置丟到陣列的(1,2)
以此類推..假設陣列是以(列,欄)來做存放
我跑完回圈後共計存了30列,2欄的資料
而在跑之前我用redim的方式去宣告該陣列的大小等同工作表的總欄數..
在此假設為100欄.
跑完後我要的資料只要其中的30欄..
那我試著再利用 (重新宣告陣列大小)
redim preserve myarray(i,2)
時,會出現錯誤..
我網查了下,大致如下解答..
恩..有點小複雜..
所以我才在想..是不是如果我給它反過來..用myarray(2, i)
i變成變數..這樣就可以改變大小了?
不過因為觀念打結,找了下找不到陣列宣告後,其多維的順序是如何,只好再來求問了..以上謝謝諸位
下為網上找得資訊
'----------------------------------------------------------------------------------------
'ReDim 陳述式是用來決定或重新決定動態陣列的大小,且此動態陣列是由
'Private、Public 或 Dim 陳述式加上空括號 (沒有維數陣列索引) 所正式宣告的。
'可以重覆地使用 ReDim 陳述式來改變陣列的元素數目和維數。
'如果使用了 Preserve(保留)關鍵字,則只能重新改變陣列最後一維的大小,而不
'能改變維數的數目。
'舉例來說,如果陣列只有一維,則可以改變此維的大小,因為它是最後且唯一的一維
'然而如果陣列有二維以上,則只能改變最後一維的大小,且仍然可以保留陣列的內
'容。
█████████████████████████████████████████████████
2021/11/28(日)補充一下:
先感謝抽空回覆我的兩位熱心網友.
其次我再細看了下WJS_HVM大與先前查得的資訊..然後我試著把二維陣列的引數跟cells(列,欄)給它反過來的使用..
因為我要在找得我需要的資料存入陣列後,要保留原資料的前提下.予重新宣告大小.
故只好把它想成陣列(欄,列)的觀念來做腦海中的存放方式..
由於redim時只能改變後維的大小..(在保存資料的前提)
所以這樣反過來..恩..我似成功的給陣列縮表了..
OK..
現在我有了另一個疑問..
例如我的陣列名稱為 myArray(欄,列)
然後存入的資料分別大致如下:
myarray(1,1)=姓名
myarray(2,1)=陳在天
myarray(1,2)=身高
myarray(2,2)=172
myarray(1,3)=血型
myarray(2,3)=O
myarray(1,4)=體重
myarray(2,4)=不詳
myarray(1,5)=年紀
myarray(2,5)=39
.....
....
如此這般...那我想請教的是,有沒有什麼方法可以讓我用關鍵字去回查myArray裡的位置?
例如我想輸入姓名這關鍵字時,就能調出陳在天出來的方法..而不是透過索引編號來調資料....
因為若透由索引編來查,
一來不容易理解,
二來凡日後工作表有插入欄位,或欄位有變動順序時
裡面的編號就會錯位了..
以上再次謝謝..
Orz
Dim a() As Integer, k As Integer
'設定動態陣列
ReDim a(2, 3)
For i = 0 To 2
For j = 0 To 3
a(i, j) = k
Debug.Print a(i, j)
k = k + 1
Next
Next
Debug.Print "我是分割線----------------"
'加Preserve只可改變最後一維的數量,但可以保留原陣列的內容
ReDim Preserve a(2, 1)
For i = 0 To 2
For j = 0 To 1
Debug.Print a(i, j)
Next
Next
Debug.Print "我是分割線----------------"
'重新宣告陣列大小沒加入Preserve時原陣列內容就消失
ReDim a(2, 3)
For i = 0 To 2
For j = 0 To 3
Debug.Print a(i, j)
Next
Next
End Sub
WJS_HVM wrote:
'加Preserve只可改變最後一維的數量,但可以保留原陣列的內容
ReDim Preserve a(2, 1)
For i = 0 To 2
For j = 0 To 1
Debug.Print a(i, j)
Next
Private Sub(恕刪)
您好,我的疑問就是第例子中的第二段..如上
因我查了下,網友的說明好像就是凡二維陣列其語法的規則就是只能改變一維的數量..
且是最後一維..那這裡先撇個話題,若宣告成三維,是否也就只能改變array(x,y,z)的z維大小???
這個可能我目前還更難解些..
所以回到二維..
所以照該語法規則來說,倘若我在分別找予找得的標題、以及該標題所在的欄位丟入到原先宣告的100列,2欄的陣列內(在此先不理解陣列內部引數是先列後欄,還是先欄後列)...
但由於其語法只能在redim時更改最後一維的大小..
所以我無法縮小那100列了..
恩..換言之,我應該把它理解成 陣列(欄,列) 這樣大腦會比較好理解.
我待會試試看..把參數把它顛倒過來再跑跑..最後來看看 ReDim Preserve TArray(x,y)這裡的y是否不會出錯..
先謝謝以上二位的回覆..因為觀念有些模糊,或許理解的有些錯誤..也多請見諒~~
MaverickRay wrote:
(恕刪)
1、若宣告成三維,是否也就只能改變array(x,y,z)的z維大小?
ANS: YES
2、所以照該語法規則來說,倘若我在分別找予找得的標題、以及該標題所在的欄位丟入到原先宣告的100列,2欄的陣列內(在此先不理解陣列內部引數是先列後欄,還是先欄後列)
ANS:只要把你需要改變的列放在最後一維就好,EX:A(欄,列)
3、建議先確認條件符合才增加一個維數來儲存到陣列,而非先宣告一個大數量的陣列丟數值後重新篩選再來縮減陣列,這樣不但耗費資源且效率不佳。
EX:
Option Base 1
Private Sub Command1_Click()
Dim a() As Integer, n As Integer
For i = 1 To 2
For j = 1 To 100
If Cells(j, i) <> "" Then '符合條件再存入資料到陣列
n = n + 1
ReDim Preserve a(2, n)
a(i, n) = Cells(j, i)
End If
Next
Next
For i = 1 To 2
For j = 1 To UBound(a, 2)
Debug.Print a(i, j)
Next
Next
End Sub
內文搜尋

X