[VBA]關於陣列的直接賦值

看板Visual_Basic作者 (marki)時間7年前 (2017/01/26 21:58), 7年前編輯推噓5(5055)
留言60則, 4人參與, 最新討論串1/1
各位大大好,小弟初學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

01/27 00:06, , 1F
方法一的話,arr跟A並無相關性
01/27 00:06, 1F

01/27 00:07, , 2F
方法二,這樣寫等於是把陣列指定到陣列,會有矛盾
01/27 00:07, 2F

01/27 00:08, , 3F
寫成式子會像:arr(無,無,無)=Array(10,20,30)
01/27 00:08, 3F

01/27 00:15, , 4F
問3使用迴圈寫到陣列 http://imgur.com/kfuSNEu.png
01/27 00:15, 4F

01/27 01:37, , 5F
直接dim的時後就要給值了唷
01/27 01:37, 5F

01/27 01:37, , 6F
dim arr(10,20,30)
01/27 01:37, 6F

01/27 01:38, , 7F
但陣列使用上直接賦值我感覺我沒用過(應該是不太會用)
01/27 01:38, 7F

01/27 01:41, , 8F
而且redim 常常幾乎跟著用到
01/27 01:41, 8F

01/27 01:42, , 9F
但我不建議使用redim preserve
01/27 01:42, 9F

01/27 01:42, , 10F
大部份我們不是很專業不是很大量,那就乾脆拿大一點的盤
01/27 01:42, 10F

01/27 01:42, , 11F
子裝花生比較快
01/27 01:42, 11F

01/27 01:43, , 12F
建議基本看看之後直接redim成很大的二維陣列
01/27 01:43, 12F

01/27 01:44, , 13F
redim preserve(只限用一維陣列) 一排資料
01/27 01:44, 13F

01/27 01:46, , 14F
無法使用在二維陣列 ,譬如(100列 x 99行)假設要在加陣
01/27 01:46, 14F

01/27 01:47, , 15F
列,我印像是如果增加位置可以,但只能加最底下橫列
01/27 01:47, 15F

01/27 01:48, , 16F
所以一開始我就懶惰的關係,我一開始就會先開好大小
01/27 01:48, 16F

01/27 01:50, , 17F
只要redim 從最後一排+1的位置開始就可以
01/27 01:50, 17F

01/27 01:50, , 18F
或者我記反了,只能增加最右邊那直行
01/27 01:50, 18F

01/27 07:13, , 19F
直接dim arr(10,20,30)這樣是一開始就宣告為三維陣列
01/27 07:13, 19F

01/27 07:14, , 20F
與原PO一開始使用array放入的一維陣列不一樣
01/27 07:14, 20F

01/27 07:25, , 21F
另外redim preserve實際上可以用在二維陣列
01/27 07:25, 21F

01/27 07:25, , 22F
雖然它只能用在改變陣列中最後一維的上下限
01/27 07:25, 22F

01/27 07:26, , 23F
但可以透過使用工作表函數Transpose,將一、二維進行
01/27 07:26, 23F

01/27 07:27, , 24F
互換,再把需要的元素放入後,再轉置過來,亦可達成
01/27 07:27, 24F

01/27 11:21, , 25F
原來如此
01/27 11:21, 25F

01/27 11:22, , 26F
沒錯做到這裡 我都得在試錯個一兩次 經驗還不太多 哈
01/27 11:22, 26F

01/27 11:22, , 27F
01/27 11:22, 27F

01/27 11:26, , 28F
應該是這樣啦 dim arr()={10,20,30}
01/27 11:26, 28F

01/27 11:27, , 29F
假如我要用成
01/27 11:27, 29F

01/27 11:27, , 30F
1,2,3
01/27 11:27, 30F

01/27 11:27, , 31F
4,5,6
01/27 11:27, 31F

01/27 11:27, , 32F
7,8,9
01/27 11:27, 32F

01/27 11:27, , 33F
的3x3 二維陣列
01/27 11:27, 33F

01/27 11:28, , 34F
就要dim arr(,) ={ {1,2,3} , {4,5,6} , {7,8,9} }
01/27 11:28, 34F

01/27 11:28, , 35F
或者
01/27 11:28, 35F

01/27 11:28, , 36F
arr(0,0) = 1
01/27 11:28, 36F

01/27 11:29, , 37F
arr(0,1) = 2
01/27 11:29, 37F

01/27 11:29, , 38F
arr(0,2)=3
01/27 11:29, 38F

01/27 11:29, , 39F
arr(1,0)=4
01/27 11:29, 39F

01/27 11:29, , 40F
arr(1,1)=5
01/27 11:29, 40F

01/27 11:29, , 41F
arr(1,2)=6
01/27 11:29, 41F

01/27 11:29, , 42F
arr(2,0)=7
01/27 11:29, 42F

01/27 11:29, , 43F
arr(2,1)=8
01/27 11:29, 43F

01/27 11:30, , 44F
arr(2,2)=9
01/27 11:30, 44F

01/27 11:30, , 45F
這種一開始要先dim arr 下一行 redim arr(2,2)
01/27 11:30, 45F

01/27 11:40, , 46F
1. Array 傳回Variant,已固定型態的變數都無法接收
01/27 11:40, 46F

01/27 11:42, , 47F
2. 宣告時決定陣列大小、維度,亦無法接收 Variant 值
01/27 11:42, 47F

01/27 11:43, , 48F
是VBA還是.NET ? .NET 才能在宣告變數時初始化
01/27 11:43, 48F

01/27 14:55, , 49F
im arr(,) ={ {1,2,3} , {4,5,6} , {7,8,9} } 這個vba
01/27 14:55, 49F

01/27 14:56, , 50F
好像不能用 抱歉
01/27 14:56, 50F

01/27 14:56, , 51F
是vb跟.net才能用
01/27 14:56, 51F

01/27 14:59, , 52F
更正vba在dim的時候不能順便賦值
01/27 14:59, 52F

01/27 14:59, , 53F
包含dim arr(10,20,30) 這個也不行
01/27 14:59, 53F

01/27 15:01, , 54F
你的方法一,因為A跟Arr是兩個不同變數
01/27 15:01, 54F

01/27 15:04, , 55F
感謝,我也學到很多
01/27 15:04, 55F

01/27 15:05, , 56F

01/27 15:05, , 57F
可以參考一下唷
01/27 15:05, 57F

01/28 10:03, , 59F
謝謝各位大大教學
01/28 10:03, 59F

01/28 18:42, , 60F
不過奇怪的是 為什麼arrx是從(1,1)開始的
01/28 18:42, 60F
文章代碼(AID): #1OYW2RF- (Visual_Basic)