Board logo

標題: [發問] 如何才能用列舉方式來指定整數陣列的內容值 [打印本頁]

作者: luhpro    時間: 2011-4-30 05:22     標題: 如何才能用列舉方式來指定整數陣列的內容值

本帖最後由 luhpro 於 2011-4-30 05:24 編輯

想請問底下程式中的陣列為何不能指定呢?
Dim A(0 To 2) As Integer
A = Array(10, 20, 30)

若改用這樣就可以 :
(取自 Excel 說明中的範例)
Dim A As Variant
A = Array(10, 20, 30)



(以下為我目前用的方式, 也是 取自Excel 說明中的範例, 用起來很不方便)
Dim A%(0 To 2)
A(0) = 10
A(1) = 20
A(0) = 30

難道不能用列舉的方式一次指定整個整數陣列的值嗎?
作者: chin15    時間: 2011-4-30 20:30

難道不能用列舉的方式一次指定整個整數陣列的值嗎?
也許你該解釋一下什麼是用列舉的方式
作者: luhpro    時間: 2011-4-30 20:55

回復 2# chin15

抱歉, 可能是我說的不清楚,
所謂列舉式的方式就是整個陣列的值可以一次就全部指定.
舉例來說:
A(0) = 5
A(1) = 53
A(2) = 52
A(3) = 57
A(4) = 43
A(5) = 0
.
.
.
我稱為逐個給值, 如果整個陣列有 100 個亂數值, 就要打 100 行給值的指令, 而且 A(x) 中的 x 還不能打錯

而底下這個
A = Array(5,53,52,57,43,0,52,72,93,12)

我稱為列舉式給值.
作者: chin15    時間: 2011-4-30 21:06

這是直接賦值,你前面不是已經可以了嗎?
作者: GBKEE    時間: 2011-4-30 21:12

回復 1# luhpro
難道不能用列舉的方式一次指定整個整數陣列的值嗎?
  1. Sub Ex()
  2.     Dim A
  3.     A = Array(10, 20, 30)
  4.     MsgBox A(0)
  5.     A(0) = 50
  6.     MsgBox A(0)
  7. End Sub
複製代碼

作者: luhpro    時間: 2011-4-30 21:55

本帖最後由 luhpro 於 2011-4-30 22:00 編輯

回復 5# GBKEE
回復 4# chin15

前面就是不行啊,
那種方式只能用在 Variant 型態,
但 Integer 型態 Excel 不讓用,
只能用 "逐個給值" (如上述). ><
作者: chin15    時間: 2011-4-30 22:30

這樣的陣列,不管元素是何類型
對陣列本身來說都是Variant 型態的
運行這一段
A = Array(10, 20, 30)
MsgBox TypeName(A)
就知道應該定義為何種類型
作者: Hsieh    時間: 2011-4-30 23:16

  1. Sub nn()
  2. Dim ar(0 To 10) As Integer, ay(0 To 3) As String, y
  3. y = Array(1, "L", 2, "K") '陣列中的資料可以是不同型態資料
  4. MsgBox Join(y, Chr(10))
  5. For i = 0 To 10
  6. ar(i) = i
  7. Next
  8. For i = 0 To 3
  9. ay(i) = i
  10. Next
  11. a = Array(ar, ay)
  12. MsgBox TypeName(a) '顯示變數a的資料型態
  13. For Each c In a
  14.    If TypeName(c) = "String()" Then MsgBox Join(c, Chr(10)) '如果是字串一維陣列就顯示內容
  15.    If TypeName(c) = "Integer()" Then MsgBox Application.Sum(c) '如果是整數一維陣列就顯示加總結果
  16. Next
  17. End Sub
複製代碼
Array是函數,其中的元素就等同函數的引數,所以它是傳回一個陣列型態的變數,他是Variant 型態
這個Variant 型態的元素是可以為任何型態(包含陣列)的元素
用Array函數建立的陣列,傳回的值,其型態就是Variant
這就是VBA說明中所說:Variant 變數可以含有任何型態的陣列,除了固定長度字串和 使用者自訂型態以外

以Dim宣告的陣列是布置一個陣列空間,而不是直接賦值,所以必須針對每個空間一一給值
當你在DIM宣告時沒有指定陣列大小時,該陣列就是動態陣列
所以必須使用REDIM來重新定義空間大小,才能再將元素寫入該陣列

我曾用一個比喻
Array函數,就是一碗盛好東西的碗,裡面的東西是可以裝入不同的物品
Dim宣告的變數他是一個空的碗,如果沒有宣告型態時,他是可以裝任何不同物品的空碗,不過在宣告時並沒有裝物品
所以要裝物品時,要先準備好數量足夠的空碗才能將一堆物品有規則的放進碗裡
作者: GBKEE    時間: 2011-5-1 06:22

本帖最後由 GBKEE 於 2011-5-1 06:26 編輯

回復 6# luhpro
[無法指定至陣列] VBA的說明
陣列中的各元素,必須個別指定其值。這個錯誤的起因與解決方法如下所示:
您試圖將一個值指定給一個陣列變數,但沒有指定要將這個值指定給哪個元素。
要設定一個陣列中的元素,您就必須指定此元素的註標。例如,若 MyArray 為一個整數陣列,則運算式 MyArray = 5 是不正確的,下列的運算式才是正確的:
MyArray(UBound(MyArray)) = 5
  1. Sub 可行()
  2.     Dim A()
  3.     A = Array(1, 2)
  4.     ReDim Preserve A(UBound(A) + 1)
  5.     A(UBound(A)) = 10
  6.     MsgBox UBound(A)
  7. End Sub
  8. '''''''''''''''''''''''''''''''''''''''''''''
  9. Sub 不可行()
  10. Dim A(1)
  11. A = Array(1,2)
  12. End Sub
複製代碼

作者: luhpro    時間: 2011-5-1 07:33

本帖最後由 luhpro 於 2011-5-1 07:45 編輯

回復 7# chin15
謝謝 chin15

因為以前用過 Turbo C 設定整數陣列的方式可以是
int *A[] = { 5, 53, 52, 57, 43, 0, 52, 72, 93, 12};
這樣的方式來設定整數陣列,
所以才會想 VBA 是否也有類似的方法可以用列舉式對整數陣列給值.

回復 9# GBKEE
謝謝 GBKEE
簡單的說用 Variant 彈性很大,
而某些變數一但定義下去,
想要變更內容可能指令就要不一樣了.

回復 8# Hsieh
謝謝 Hsieh
因為程式環境需求上需要對記憶體空間斤斤計較,
所以才會希望該陣列能不要用 Variant 型態(太佔空間了),
仔細思考了一下我打算採用下列的方式 :
Dim iAr%(0 To 99), iI%
Dim vA

vA = Array(5, 53, 52, 57, 43, 0, 52, 72, 93, 12, _
    26, 40, 84, 45, 59, 45, 91, 5, 97, 21, _
    14, 47, 59, 61, 91, 5, 73, 94, 41, 33, _
    5, 55, 80, 95, 54, 89, 29, 65, 13, 51, _
    54, 78, 35, 86, 49, 48, 95, 25, 10, 76, _
    96, 59, 47, 11, 59, 50, 73, 26, 2, 26, _
    76, 39, 46, 74, 8, 56, 23, 8, 29, 1, _
    86, 54, 42, 81, 59, 80, 9, 28, 54, 7, _
    47, 46, 51, 2, 92, 27, 55, 32, 51, 36, _
    92, 47, 25, 96, 43, 75, 38, 31, 24, 25)

For iI = 0 To 99
  iAr(iI) = vA(iI)
Next iI
  
Set vA = Nothing
雖然還是會多佔一些逐個給值的時間(此處與假設原列舉式給值VBA可以接受做比較)與一個 Variant 空間,
但當陣列較大時卻應該可以省掉滿多記憶體空間, (例如需要動態新增一個 Sheet 並給定一些 Row 與 Column 的屬性之類的)
程式會比較容易判讀即便列印也不會太長.




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)