返回列表 上一主題 發帖

陣列物件ArrayList 與陣列Array混搭 問題

陣列物件ArrayList 與陣列Array混搭 問題

本帖最後由 singo1232001 於 2022-2-11 02:12 編輯

Screenshot 2022-02-11 020526.png
2022-2-11 02:06
Screenshot 2022-02-11 015804.png
2022-2-11 01:58


Sub ttttt()
Set arL = CreateObject("System.Collections.ArrayList")
Dim br(4)
For i = 1 To 2
arL.Add br
Next
arL(1)(0) = 4
arL.Add 3
arL.Add Array("red", "white", "green")
Debug.Print arL(1)(0)
End Sub

如圖匯入後 找不到資料

請問
如何將資料依  列號 or 名稱 正確匯入?
如何將單一資料依  列號 or 名稱 正確 提取?

另外我在網路上找到一個很特殊的用法
Sub ReadRangeExample()
Dim MyList1 As Object
Set MyList = CreateObject("System.Collections.ArrayList")
'Dim MyList As New ArrayList, MyList1 As Object
MyList.Add "Item1"
MyList.Add "Item2"
MyList.Add "Item3"
MyList.Add "Item6"
MyList.Add "Item4"
MyList.Add "Item7"
Set MyList1 = MyList.GetRange(2, 4)
For Each I In MyList1
    MsgBox I
Next I
End Sub

嘗試 觀察監看式  發現  物件不是消失 而是會被暫時輪流關閉

回復 1# singo1232001

自問自答 找到答案了
Screenshot 2022-02-11 023500.png
2022-2-11 02:35



來源https://www.snb-vba.eu/VBA_Arraylist_en.html

TOP

回復 2# singo1232001

繼續追加問題一下
監看器引用 外部物件 常常異常
    提問  這是bug嗎?
因為不好文字敘述 還是請看影片比較快
主要是監看式物件永遠出現意想不到的現象
https://www.youtube.com/watch?v=MlxAzvK0jrk

TOP

回復  singo1232001

自問自答 找到答案了
singo1232001 發表於 2022-2-11 02:35



你確定有找到答案?
2維的還是無法修改值呀

TOP

本帖最後由 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出來也是"空氣" )
Screenshot 2022-02-12 025711.png
2022-2-12 02:57

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的方法)
Screenshot 2022-02-12 024158.png
2022-2-12 02:42

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陣列時 資料就要先輸入好了 輸入好之後就不能再改

TOP

本帖最後由 singo1232001 於 2022-2-12 03:23 編輯

Screenshot 2022-02-12 031251.png
2022-2-12 03:13

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 匯入失敗

請高手詳解一下  感謝 相關資料實在找不太到

TOP

回復 6# singo1232001


看這個會更加直觀
Screenshot 2022-02-12 034632.png
2022-2-12 03:46

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 這個坑很糟糕的原因
   
但在某些資料量很大又要區分的情況下 又不得不用他

TOP

        靜思自在 : 【生命在呼吸間】佛陀說:「生命在呼吸間。」人無法管住自己的生命,更無法擋住死期,讓自己永住人間。既然生命去來這麼無常,我們更應該好好地愛惜它、利用它、充實它,讓這無常、寶貴的生命,散發它真善美的光輝,映照出生命真正的價值。
返回列表 上一主題