陣列物件ArrayList 與陣列Array混搭 問題
- 帖子
- 354
- 主題
- 5
- 精華
- 0
- 積分
- 387
- 點名
- 0
- 作業系統
- windows7
- 軟體版本
- vba,vb,excel2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2017-1-8
- 最後登錄
- 2024-8-2
 
|
陣列物件ArrayList 與陣列Array混搭 問題
|
|
|
|
|
|
- 帖子
- 354
- 主題
- 5
- 精華
- 0
- 積分
- 387
- 點名
- 0
- 作業系統
- windows7
- 軟體版本
- vba,vb,excel2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2017-1-8
- 最後登錄
- 2024-8-2
 
|
2#
發表於 2022-2-11 02:35
| 只看該作者
回復 1# singo1232001
自問自答 找到答案了
來源https://www.snb-vba.eu/VBA_Arraylist_en.html |
|
|
|
|
|
|
- 帖子
- 354
- 主題
- 5
- 精華
- 0
- 積分
- 387
- 點名
- 0
- 作業系統
- windows7
- 軟體版本
- vba,vb,excel2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2017-1-8
- 最後登錄
- 2024-8-2
 
|
3#
發表於 2022-2-11 14:36
| 只看該作者
回復 2# singo1232001
繼續追加問題一下
監看器引用 外部物件 常常異常
提問 這是bug嗎?
因為不好文字敘述 還是請看影片比較快
主要是監看式物件永遠出現意想不到的現象
https://www.youtube.com/watch?v=MlxAzvK0jrk |
|
|
|
|
|
|
- 帖子
- 323
- 主題
- 6
- 精華
- 0
- 積分
- 313
- 點名
- 0
- 作業系統
- xp
- 軟體版本
- 2k
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2015-6-24
- 最後登錄
- 2025-5-3
|
4#
發表於 2022-2-11 18:04
| 只看該作者
回復 singo1232001
自問自答 找到答案了
singo1232001 發表於 2022-2-11 02:35 
你確定有找到答案?
2維的還是無法修改值呀 |
|
|
|
|
|
|
- 帖子
- 354
- 主題
- 5
- 精華
- 0
- 積分
- 387
- 點名
- 0
- 作業系統
- windows7
- 軟體版本
- vba,vb,excel2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2017-1-8
- 最後登錄
- 2024-8-2
 
|
5#
發表於 2022-2-12 02:58
| 只看該作者
本帖最後由 singo1232001 於 2022-2-12 03:10 編輯
回復 4# jackyq
有找到一些蛛絲馬跡
1.使用arraylist時 監看式容易異常 不能太過相信 因為是引用外部(.Net framework)的DLL 非VBA自帶 (上面我有傳影片)
2.只要再arraylist陣列之後 或者被arrayList包住 底下就沒有vba陣列 底下的vba陣列會被自動改成arraylist陣列
3.如上述 而在arraylist陣列之前的VBA陣列 不受影響 也就是 VBA陣列能包住arraylist陣列 但arraylist陣列不能包vba陣列 實際操作時被arraylist包住的vba陣列會被強制改成arraylist陣列
4.監看查詢arraylist時 可以用ar.item(0) 或者ar(0)的方式查詢 也可以輸入 但前提是有add一個位置
5.空白的arraylist無法像dctionary(字典)直接連續嵌套arraylist 若要嵌套 必須在嵌套前 新增 ar.add "" 一個佔位用的位置 才可以利用這個位置來重新 Set ar(0) = CreateObject("System.Collections.ArrayList")
6.如上述 很麻煩怎麼辦,這時候可以利用第2點的規則 先創一個你想要的vba的N維陣列
比如
Dim br(3, 3, 3) 或者 redim br(3, 3, 3)
Set ar= CreateObject("System.Collections.ArrayList")
ar.Add ""
ar.Add br
就可以直接創造你想要的嵌套陣列
與字典不同的情況是 字典印象中不會把vba陣列變成arraylist陣列
(但這種方式 不管怎麼嘗試最後好像失敗了 雖然陣列架構也有出現. 而且也能正確執行匯入資料,但完全沒顯示任何資料匯入 資料會直接進入虛空之中 就算debug.print出來也是"空氣" )
Sub Array_Arraylist2()
Dim ar(1)
Dim br(2, 2)
Set ar(0) = CreateObject("System.Collections.ArrayList")
ar(0).Add br
ar(0).Add ""
ar(0)(0)(0, 0) = 555
ar(0)(0)(0, 1) = 666
ar(0)(0)(0, 2) = 777
Debug.Print ar(0)(0)(0, 0)
Debug.Print ar(0)(0)(0, 1)
Debug.Print ar(0)(0)(0, 2)
End Sub
7.展示一個 vba陣列 包 arraylist陣列 並賦值取值的方法 (為了逐步展示 所以不用6的方法)
Sub Array_Arraylist()
Dim ar(1)
Set ar(0) = CreateObject("System.Collections.ArrayList")
ar(0).Add ""
ar(0).Add ""
ar(0).Add Array(11, 12, 13, 14)
Set ar(0)(0) = CreateObject("System.Collections.ArrayList")
ar(0)(0).Add ""
ar(0)(0).Add ""
ar(0)(0).Add ""
ar(0)(0).Add ""
ar(0)(0)(0) = 331
ar(0)(0)(1) = 332
ar(0)(0)(2) = 333
ar(0)(0)(3) = 334
Debug.Print ar(0)(0)(0)
Debug.Print ar(0)(0)(1)
Debug.Print ar(0)(0)(2)
Debug.Print ar(0)(0)(3)
End Sub
研究到最後
若只用arraylist 就可以直接匯入修改
但如果用arraylist 包vba陣列
只有兩個方法能處理 修改
首先避免用arraylist包vba陣列的形式 但vba陣列可以包arraylist
但就想直接arraylist包陣列怎麼辦 包括後面用 .Add Array(1,2,3,4) 這種1維陣列也算
第一 使用add+removeat 或remove的方式修改
第二 匯入vba陣列時 資料就要先輸入好了 輸入好之後就不能再改 |
|
|
|
|
|
|
- 帖子
- 354
- 主題
- 5
- 精華
- 0
- 積分
- 387
- 點名
- 0
- 作業系統
- windows7
- 軟體版本
- vba,vb,excel2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2017-1-8
- 最後登錄
- 2024-8-2
 
|
6#
發表於 2022-2-12 03:16
| 只看該作者
本帖最後由 singo1232001 於 2022-2-12 03:23 編輯
Sub Array_Arraylist3()
Dim ar(1)
Dim br(2, 2)
Set ar(0) = CreateObject("System.Collections.ArrayList")
ar(0).Add br
ar(0).Add ""
ar(0).Add Array(1, 2, 3, 4)
ar(0)(0)(0, 0) = 555
ar(0)(0)(0, 1) = 666
ar(0)(0)(0, 2) = 777
Debug.Print ar(0)(0)(0, 0) & "空白"
Debug.Print ar(0)(0)(0, 1) & "空白"
Debug.Print ar(0)(0)(0, 2) & "空白"
Debug.Print ar(0)(2)(0)
Debug.Print ar(0)(2)(1)
Debug.Print ar(0)(2)(2)
Debug.Print ar(0)(2)(3)
End Sub
上述我使用了兩種不同的arraylist包vba陣列匯入方式
一種是空白vba陣列br(2,2)
一種是原本就有資料的vba陣列 array(1,2,3,4)
最後有資料的是第二種
雖然第一種也能執行 但資料進不去
注意 此案例與上一篇回復的不同
上一篇是使用正規的arraylist嵌套方法
所以ar(0)(0)(0) = 331 有匯入成功
而本篇的
ar(0)(0)(0, 0) = 555 匯入失敗
請高手詳解一下 感謝 相關資料實在找不太到 |
|
|
|
|
|
|
- 帖子
- 354
- 主題
- 5
- 精華
- 0
- 積分
- 387
- 點名
- 0
- 作業系統
- windows7
- 軟體版本
- vba,vb,excel2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2017-1-8
- 最後登錄
- 2024-8-2
 
|
7#
發表於 2022-2-12 03:47
| 只看該作者
回復 6# singo1232001
看這個會更加直觀
Sub Array_Arraylist4()
Dim ar(0): Dim br(2): Dim cr(2)
cr(0) = "97": cr(1) = "98": cr(2) = "99":
Set ar(0) = CreateObject("System.Collections.ArrayList")
ar(0).Add br
ar(0).Add Array(1, 2, 3)
ar(0).Add cr
ar(0)(0)(0) = 555
ar(0)(0)(1) = 666
ar(0)(0)(2) = 777
Debug.Print ar(0)(0)(0) & " br空白"
Debug.Print ar(0)(0)(1) & " br空白"
Debug.Print ar(0)(0)(2) & " br空白"
Debug.Print ar(0)(1)(0) & " Array(1, 2, 3, 4)有東西"
Debug.Print ar(0)(1)(1) & " Array(1, 2, 3, 4)有東西"
Debug.Print ar(0)(1)(2) & " Array(1, 2, 3, 4)有東西"
Debug.Print ar(0)(2)(0) & " cr有東西"
Debug.Print ar(0)(2)(1) & " cr有東西"
Debug.Print ar(0)(2)(2) & " cr有東西"
'----以下是在arraylist後 新增一個正常的arraylist 並且可以賦值取值
ar(0).Add ""
Set ar(0)(3) = CreateObject("System.Collections.ArrayList")
ar(0)(3).Add ""
Set ar(0)(3)(0) = CreateObject("System.Collections.ArrayList")
ar(0)(3)(0).Add "正常的arraylist新增"
Debug.Print ar(0)(3)(0)(0)
ar(0)(3)(0)(0) = "正常的arraylist修改後"
Debug.Print ar(0)(3)(0)(0)
End Sub
這就是arraylist 這個坑很糟糕的原因
但在某些資料量很大又要區分的情況下 又不得不用他 |
|
|
|
|
|
|