Board logo

標題: 變動陣列固定陣列不是以dim和redim區份? [打印本頁]

作者: oak0723-1    時間: 2010-9-7 19:50     標題: 變動陣列固定陣列不是以dim和redim區份?

請問
為何以下的陣列是固定陣列?
With Sheets("1")
rng = .Range(.[c10], .[m83].End(3))
End With
ReDim arr(1 To UBound(rng), 1 To 10)
For i = 1 To UBound(rng)
If rng(i, 11) - rng(i, 10) <> 0 Then
k = k + 1
For j = 1 To 6
arr(k, j) = rng(i, j)
Next
arr(k, 8) = rng(i, 8) - rng(i, 6)
arr(k, 9) = arr(k, 8) - arr(k, 6)
arr(k, 10) = rng(i, 11) + rng(i, 10)
End If
Next
以下為何是變動陣列
a = Sheets("1").[c10].CurrentRegion
    r = 1
    For i = 1 To UBound(a)
        ReDim Preserve arr(1 To 3, 1 To r)
        arr(1, r) = a(i, 1): arr(2, r) = a(i, 2): arr(3, r) = a(i, 3)
        r = r + 6
    Next
作者: oobird    時間: 2010-9-7 20:05

ReDim arr(1 To UBound(rng), 1 To 10)
如ubound(rng)為100
其結果為arr(1 to 100,1 to 10)
當屬固定陣列。
r = 1
    For i = 1 To UBound(a)
        ReDim Preserve arr(1 To 3, 1 To r)
        arr(1, r) = a(i, 1): arr(2, r) = a(i, 2): arr(3, r) = a(i, 3)
        r = r + 6
next
第一個i循環時r=1,arr(1 To 3, 1 To r)=arr(1 to 3,1 to 1)

第2個i循環時r=7,arr(1 To 3, 1 To r)=arr(1 to 3,1 to 7)

第3個i循環時r=13,arr(1 To 3, 1 To r)=arr(1 to 3,1 to 13)
這樣就叫動態陣列。
作者: Hsieh    時間: 2010-9-7 20:08

簡單的說
動態陣列是不確定元素個數
靜態陣列是元素個數固定
所以不論陣列被Dim或Redim成為一個確定大小的陣列就稱為靜態陣列
如:Dim ar(10)或Redim ar(x)
未指定大小Dim ar()
表示還沒給此陣列規範大小
所以要再Redim  ar(1)
要注意的是Preserve關鍵字,是為了要保留原陣列以有元素
所用的關鍵字,因為當陣列被重新宣告大小時
若沒加Preserve關鍵字,那麼原陣列將被清空
要知道更詳細的陣列用法請看VBA說明
作者: oak0723-1    時間: 2010-9-7 20:32

回復 2# oobird


    懂了
感恩~~~
作者: rick4615    時間: 2013-8-16 15:19

回復 3# Hsieh



請問版主  我現在想做動態陣列 (依資料之欄數、列數改變陣列維數)
格式大概如下


1     listname 1       listname2      listname3    <- 這列始終保留
2    itemA               itemB              itemC
3    itemD              itemE               itemF
4    itemG              itemH              itemI


每個陣列都需要要listname這列 並且每個陣列加入第2列或第3列或第四列
並且可能以某個變數(假設為i)做呼叫
這樣是否可以用redim preserve的方法進行呢??
作者: Hsieh    時間: 2013-8-16 15:43

回復 5# rick4615

其實你在工作表內這些資料就已經可視為一個二維陣列
你要讀取這些資料的用處是甚麼?
陣列的觀念中,要知道所謂動態陣列,是程序執行中陣列的大小會改變
而靜態陣列是陣列大小是固定的
所以程序執行中你所要抓取的表格資料,他是一個固定大小陣列
你如果要取某欄資料作為陣列,也只要將該欄資料直接讀取
請將你的目的說明清楚,並上傳檔案說明
作者: rick4615    時間: 2013-8-16 16:11

本帖最後由 rick4615 於 2013-8-16 16:14 編輯

回復 6# Hsieh

抱歉@@ 我沒有講清楚

我現在大概是做到這樣  
  [attach]15790[/attach]
先新增checkbox  看打勾幾個checkbox 並且將checkbox對應之欄位進行輸出的動作
現在是需要將標題 (姓名、身高、體重、腰圍)
與內容(王小明、170、80、34)
做成一個陣列 2* i 之陣列 (i為checkbox打勾的數量)
並且始終保持標題列 內容依情形更改

婀 我這樣講有比較清楚嗎@@ 小弟我不是很擅長表達 QQ
也感謝您的解答 :)
作者: Hsieh    時間: 2013-8-16 23:44

回復 7# rick4615

實在不清楚你的需求為何?
是依據勾選欄位新增到清單內容嗎?
  1. Sub Add_Check() '新增CheckBox
  2. With Sheet1
  3.    For Each a In .Range(.[A3], .[A3].End(xlToRight))
  4.        With .OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=a.Left, Top:=.[A10].Top, Width:=a.Width, Height:=20)
  5.        .Object.Caption = a
  6.        End With
  7.    Next
  8. End With
  9. End Sub
  10. Sub Add_ComboList() '依選取欄位,新增下拉清單內容
  11. Dim Ct As OLEObject, Ay()
  12. With Sheet1
  13. For Each Ct In .OLEObjects
  14.    If Ct.progID = "Forms.CheckBox.1" Then '物件為CheckBox
  15.       If Ct.Object.Value = True Then 'CheckBox被勾選
  16.         Set a = .Rows(3).Find(Ct.Object.Caption, lookat:=xlWhole) '找到欄位
  17.          ar = Application.Transpose(.Range(a, a.End(xlDown))) '欄位向下讀入陣列
  18.          ReDim Preserve Ay(s) '擴充陣列大小
  19.          Ay(s) = ar
  20.          s = s + 1
  21.        End If
  22.     End If
  23. Next
  24. With .ComboBox1
  25. .Clear '清除清單
  26. .List = Application.Transpose(Ay) '將陣列寫入清單
  27. .ColumnCount = s '清單顯示欄位數量
  28. .Width = 80 * s '物件寬度
  29. End With
  30. End With
  31. End Sub
複製代碼

作者: rick4615    時間: 2013-8-19 09:13

本帖最後由 rick4615 於 2013-8-19 09:14 編輯

回復 8# Hsieh

QQ 看了忘記回
婀 我不太懂清單內容是什麼
不過我後來以自己的方法寫出來了
也附上小弟的寫法@@

ReDim Myarray(1, q - 1) As Variant

of = 2
   
    For c = 4 To items + of
        i = 1
        a = 0
        For Each CK In ActiveSheet.OLEObjects   '1 next
            If CK.Name Like "CheckBox*" Then    '2 end 判斷checkbox
                If CK.Object.Value = True Then  '3 end 判斷true/false
                    If q > 1 Then
                            Myarray(0, a) = Cells(3, i)
                            Myarray(1, a) = Cells(c, i)
                            a = a + 1
                    End If
                End If
                i = i + 1
            End If
        Next
        Csvgo.writetext Myarray(0, 0) & "," & Myarray(0, 1) & vbCrLf & Myarray(1, 0) & "," & Myarray(1, 1) & vbCrLf
    Next c




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