作者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://webptt.com/cn.aspx?n=bbs/Visual_Basic/M.1485439131.A.3FE.html
※ 编辑: marki (36.239.223.196), 01/26/2017 22:01:22
1F:推 MashiroX421: 方法一的话,arr跟A并无相关性 01/27 00:06
2F:→ MashiroX421: 方法二,这样写等於是把阵列指定到阵列,会有矛盾 01/27 00:07
3F:→ MashiroX421: 写成式子会像:arr(无,无,无)=Array(10,20,30) 01/27 00:08
5F:→ waiter337: 直接dim的时後就要给值了唷 01/27 01:37
6F:→ waiter337: dim arr(10,20,30) 01/27 01:37
7F:→ waiter337: 但阵列使用上直接赋值我感觉我没用过(应该是不太会用) 01/27 01:38
8F:→ waiter337: 而且redim 常常几乎跟着用到 01/27 01:41
9F:→ waiter337: 但我不建议使用redim preserve 01/27 01:42
10F:→ waiter337: 大部份我们不是很专业不是很大量,那就乾脆拿大一点的盘 01/27 01:42
11F:→ waiter337: 子装花生比较快 01/27 01:42
12F:→ waiter337: 建议基本看看之後直接redim成很大的二维阵列 01/27 01:43
13F:→ waiter337: redim preserve(只限用一维阵列) 一排资料 01/27 01:44
14F:→ waiter337: 无法使用在二维阵列 ,譬如(100列 x 99行)假设要在加阵 01/27 01:46
15F:→ waiter337: 列,我印像是如果增加位置可以,但只能加最底下横列 01/27 01:47
16F:→ waiter337: 所以一开始我就懒惰的关系,我一开始就会先开好大小 01/27 01:48
17F:→ waiter337: 只要redim 从最後一排+1的位置开始就可以 01/27 01:50
18F:→ waiter337: 或者我记反了,只能增加最右边那直行 01/27 01:50
19F:→ MashiroX421: 直接dim arr(10,20,30)这样是一开始就宣告为三维阵列 01/27 07:13
20F:→ MashiroX421: 与原PO一开始使用array放入的一维阵列不一样 01/27 07:14
21F:→ MashiroX421: 另外redim preserve实际上可以用在二维阵列 01/27 07:25
22F:→ MashiroX421: 虽然它只能用在改变阵列中最後一维的上下限 01/27 07:25
23F:→ MashiroX421: 但可以透过使用工作表函数Transpose,将一、二维进行 01/27 07:26
24F:→ MashiroX421: 互换,再把需要的元素放入後,再转置过来,亦可达成 01/27 07:27
25F:推 waiter337: 原来如此 01/27 11:21
26F:→ waiter337: 没错做到这里 我都得在试错个一两次 经验还不太多 哈 01/27 11:22
27F:→ waiter337: 哈 01/27 11:22
28F:→ waiter337: 应该是这样啦 dim arr()={10,20,30} 01/27 11:26
29F:→ waiter337: 假如我要用成 01/27 11:27
30F:→ waiter337: 1,2,3 01/27 11:27
31F:→ waiter337: 4,5,6 01/27 11:27
32F:→ waiter337: 7,8,9 01/27 11:27
33F:→ waiter337: 的3x3 二维阵列 01/27 11:27
34F:→ waiter337: 就要dim arr(,) ={ {1,2,3} , {4,5,6} , {7,8,9} } 01/27 11:28
35F:→ waiter337: 或者 01/27 11:28
36F:→ waiter337: arr(0,0) = 1 01/27 11:28
37F:→ waiter337: arr(0,1) = 2 01/27 11:29
38F:→ waiter337: arr(0,2)=3 01/27 11:29
39F:→ waiter337: arr(1,0)=4 01/27 11:29
40F:→ waiter337: arr(1,1)=5 01/27 11:29
41F:→ waiter337: arr(1,2)=6 01/27 11:29
42F:→ waiter337: arr(2,0)=7 01/27 11:29
43F:→ waiter337: arr(2,1)=8 01/27 11:29
44F:→ waiter337: arr(2,2)=9 01/27 11:30
45F:→ waiter337: 这种一开始要先dim arr 下一行 redim arr(2,2) 01/27 11:30
46F:推 fumizuki: 1. Array 传回Variant,已固定型态的变数都无法接收 01/27 11:40
47F:→ fumizuki: 2. 宣告时决定阵列大小、维度,亦无法接收 Variant 值 01/27 11:42
48F:→ fumizuki: 是VBA还是.NET ? .NET 才能在宣告变数时初始化 01/27 11:43
49F:→ waiter337: im arr(,) ={ {1,2,3} , {4,5,6} , {7,8,9} } 这个vba 01/27 14:55
50F:→ waiter337: 好像不能用 抱歉 01/27 14:56
51F:→ waiter337: 是vb跟.net才能用 01/27 14:56
52F:→ waiter337: 更正vba在dim的时候不能顺便赋值 01/27 14:59
53F:→ waiter337: 包含dim arr(10,20,30) 这个也不行 01/27 14:59
54F:→ waiter337: 你的方法一,因为A跟Arr是两个不同变数 01/27 15:01
55F:→ waiter337: 感谢,我也学到很多 01/27 15:04
57F:→ waiter337: 可以参考一下唷 01/27 15:05
59F:→ marki: 谢谢各位大大教学 01/28 10:03
60F:→ waiter337: 不过奇怪的是 为什麽arrx是从(1,1)开始的 01/28 18:42