返回列表 上一主題 發帖

變動陣列固定陣列不是以dim和redim區份?

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

TOP

回復 5# rick4615

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

TOP

回復 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
複製代碼
學海無涯_不恥下問

TOP

        靜思自在 : 做好事不能少我一人,做壞事不能多我一人。
返回列表 上一主題