作者marki (marki)
看板Visual_Basic
標題[VBA]關於陣列的直接賦值
時間Thu Jan 26 21:58:49 2017
各位大大好,小弟初學vba,想請問陣列要如何直接賦值呢
我試過幾種方法
----------------------------------------------------------------
' 方法一: 失敗
Dim arr(0 To 2) As Integer
A = Array(10, 20, 30)
----------------------------------------------------------------
' 方法二:無法指定至陣列
Dim arr(2)
arr = Array(10, 20, 30)
----------------------------------------------------------------
' 方法三: 成功
Dim arr
arr = Array(10, 20, 30)
我的疑問是
1. 我可以理解Array回傳的是variant型態,可是這樣為什麼方法二也不行呢?
2. 如果一定要使用動態陣列且variant型態,這樣的話會減慢運行的效能嗎?
3. 有什麼方法可以直接將固定儲存格的內容寫進陣列的嗎?例如:
arr = Range("A1:A3").Value 這樣的寫法 (當然這樣寫就失敗了 >.<)
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.239.223.196
※ 文章網址: https://www.ptt.cc/bbs/Visual_Basic/M.1485439131.A.3FE.html
※ 編輯: marki (36.239.223.196), 01/26/2017 22:01:22
推 MashiroX421: 方法一的話,arr跟A並無相關性 01/27 00:06
→ MashiroX421: 方法二,這樣寫等於是把陣列指定到陣列,會有矛盾 01/27 00:07
→ MashiroX421: 寫成式子會像:arr(無,無,無)=Array(10,20,30) 01/27 00:08
→ waiter337: 直接dim的時後就要給值了唷 01/27 01:37
→ waiter337: dim arr(10,20,30) 01/27 01:37
→ waiter337: 但陣列使用上直接賦值我感覺我沒用過(應該是不太會用) 01/27 01:38
→ waiter337: 而且redim 常常幾乎跟著用到 01/27 01:41
→ waiter337: 但我不建議使用redim preserve 01/27 01:42
→ waiter337: 大部份我們不是很專業不是很大量,那就乾脆拿大一點的盤 01/27 01:42
→ waiter337: 子裝花生比較快 01/27 01:42
→ waiter337: 建議基本看看之後直接redim成很大的二維陣列 01/27 01:43
→ waiter337: redim preserve(只限用一維陣列) 一排資料 01/27 01:44
→ waiter337: 無法使用在二維陣列 ,譬如(100列 x 99行)假設要在加陣 01/27 01:46
→ waiter337: 列,我印像是如果增加位置可以,但只能加最底下橫列 01/27 01:47
→ waiter337: 所以一開始我就懶惰的關係,我一開始就會先開好大小 01/27 01:48
→ waiter337: 只要redim 從最後一排+1的位置開始就可以 01/27 01:50
→ waiter337: 或者我記反了,只能增加最右邊那直行 01/27 01:50
→ MashiroX421: 直接dim arr(10,20,30)這樣是一開始就宣告為三維陣列 01/27 07:13
→ MashiroX421: 與原PO一開始使用array放入的一維陣列不一樣 01/27 07:14
→ MashiroX421: 另外redim preserve實際上可以用在二維陣列 01/27 07:25
→ MashiroX421: 雖然它只能用在改變陣列中最後一維的上下限 01/27 07:25
→ MashiroX421: 但可以透過使用工作表函數Transpose,將一、二維進行 01/27 07:26
→ MashiroX421: 互換,再把需要的元素放入後,再轉置過來,亦可達成 01/27 07:27
推 waiter337: 原來如此 01/27 11:21
→ waiter337: 沒錯做到這裡 我都得在試錯個一兩次 經驗還不太多 哈 01/27 11:22
→ waiter337: 哈 01/27 11:22
→ waiter337: 應該是這樣啦 dim arr()={10,20,30} 01/27 11:26
→ waiter337: 假如我要用成 01/27 11:27
→ waiter337: 1,2,3 01/27 11:27
→ waiter337: 4,5,6 01/27 11:27
→ waiter337: 7,8,9 01/27 11:27
→ waiter337: 的3x3 二維陣列 01/27 11:27
→ waiter337: 就要dim arr(,) ={ {1,2,3} , {4,5,6} , {7,8,9} } 01/27 11:28
→ waiter337: 或者 01/27 11:28
→ waiter337: arr(0,0) = 1 01/27 11:28
→ waiter337: arr(0,1) = 2 01/27 11:29
→ waiter337: arr(0,2)=3 01/27 11:29
→ waiter337: arr(1,0)=4 01/27 11:29
→ waiter337: arr(1,1)=5 01/27 11:29
→ waiter337: arr(1,2)=6 01/27 11:29
→ waiter337: arr(2,0)=7 01/27 11:29
→ waiter337: arr(2,1)=8 01/27 11:29
→ waiter337: arr(2,2)=9 01/27 11:30
→ waiter337: 這種一開始要先dim arr 下一行 redim arr(2,2) 01/27 11:30
推 fumizuki: 1. Array 傳回Variant,已固定型態的變數都無法接收 01/27 11:40
→ fumizuki: 2. 宣告時決定陣列大小、維度,亦無法接收 Variant 值 01/27 11:42
→ fumizuki: 是VBA還是.NET ? .NET 才能在宣告變數時初始化 01/27 11:43
→ waiter337: im arr(,) ={ {1,2,3} , {4,5,6} , {7,8,9} } 這個vba 01/27 14:55
→ waiter337: 好像不能用 抱歉 01/27 14:56
→ waiter337: 是vb跟.net才能用 01/27 14:56
→ waiter337: 更正vba在dim的時候不能順便賦值 01/27 14:59
→ waiter337: 包含dim arr(10,20,30) 這個也不行 01/27 14:59
→ waiter337: 你的方法一,因為A跟Arr是兩個不同變數 01/27 15:01
→ waiter337: 感謝,我也學到很多 01/27 15:04
→ waiter337: 可以參考一下唷 01/27 15:05
→ marki: 謝謝各位大大教學 01/28 10:03
→ waiter337: 不過奇怪的是 為什麼arrx是從(1,1)開始的 01/28 18:42