返回列表 上一主題 發帖

[發問] 如何加資料

回復 1# basarasy
  1. Sub Ex()
  2. Dim A As Range
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Set d1 = CreateObject("Scripting.Dictionary")
  5. For Each A In Range([A1], [A1].End(xlDown))
  6. mystr = Join(Application.Transpose(Application.Transpose(A.Resize(, 4))), ",")
  7. d(mystr) = d(mystr) + A.Offset(, 4).Value
  8. d1(mystr) = Array(A.Value, A.Offset(, 1).Value, A.Offset(, 2).Value, A.Offset(, 3).Value, d(mystr))
  9. Next
  10. [H:L] = ""
  11. [H1].Resize(d1.Count, 5) = Application.Transpose(Application.Transpose(d1.items))
  12. End Sub
複製代碼
如果把表格加上欄名稱,就可使用樞紐分析
學海無涯_不恥下問

TOP

回復 3# basarasy
這是很直觀的代碼
  1. Sub Ex()
  2. Dim A As Range  '宣告變數為儲存格型態
  3. Set d = CreateObject("Scripting.Dictionary")  '設置字典物件
  4. Set d1 = CreateObject("Scripting.Dictionary")  '設置字典物件
  5. For Each A In Range([A1], [A1].End(xlDown))  '在A欄作迴圈取得位置
  6. mystr = Join(Application.Transpose(Application.Transpose(A.Resize(, 4))), ",")  '變數指定為A欄向右擴展成4欄大小的範圍以逗號連結的字串
  7. d(mystr) = d(mystr) + A.Offset(, 4).Value  '計算以mystr為關鍵字的累加
  8. d1(mystr) = Array(A.Value, A.Offset(, 1).Value, A.Offset(, 2).Value, A.Offset(, 3).Value, d(mystr))  '以mystr為關鍵字加入項目,此項目為一陣列,陣列最後一個值為累加值
  9. Next
  10. [H:L] = ""  '清空目標區
  11. [H1].Resize(d1.Count, 5) = Application.Transpose(Application.Transpose(d1.items))  '將字典物件內容以2次轉置(因為要轉成標準的二維陣列)寫入目標區
  12. End Sub
複製代碼
學海無涯_不恥下問

TOP

本帖最後由 Hsieh 於 2011-1-3 23:35 編輯

回復 6# FAlonso

http://forum.twbts.com/thread-20-1-1.html
http://forum.twbts.com/viewthread.php?tid=2287&extra=pageD1&page=2
這裡有初步的說明,要了解其屬性及方法請參閱VBA說明檔
學海無涯_不恥下問

TOP

回復 6# basarasy


    釋放物件是好習慣
其實物件會隨著程序結束而自動釋放
學海無涯_不恥下問

TOP

完全看不懂妳邏輯
請將須求敘述清楚,實在無法從你錯誤的代碼,找出你的邏輯
學海無涯_不恥下問

TOP

回復 10# FAlonso
  1. Sub Ex()
  2. On Error Resume Next
  3. Dim Mystr(), MyCnt()
  4. i = 1
  5. Do Until Cells(i, 1) = ""
  6.    If IsError(Application.Match(Cells(i, 1) & "," & Cells(i, 2) & "," & Cells(i, 3) & "," & Cells(i, 4), Mystr, 0)) Then
  7.       ReDim Preserve Mystr(s)
  8.       ReDim Preserve MyCnt(s)
  9.       Mystr(s) = Cells(i, 1) & "," & Cells(i, 2) & "," & Cells(i, 3) & "," & Cells(i, 4)
  10.       MyCnt(s) = Cells(i, 5)
  11.       s = s + 1
  12.       Else
  13.       k = Application.Match(Cells(i, 1) & "," & Cells(i, 2) & "," & Cells(i, 3) & "," & Cells(i, 4), Mystr, 0)
  14.       MyCnt(k) = MyCnt(k - 1) + Cells(i, 5)
  15.     End If
  16.     i = i + 1
  17. Loop
  18. For i = 0 To s - 1
  19.    Cells(i + 1, 8).Resize(, 4) = Split(Mystr(i), ",")
  20.    Cells(i + 1, 12) = MyCnt(i)
  21. Next
  22. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 18# FAlonso
儲存格指定出來的範圍
不論是1列或多列
excel均將視為二維陣列
經過transpose函數轉置後才會得到正確的維數
所以當你的原陣列是以一維陣列儲存多個陣列成為多維陣列時

Dim Ay()
For i = 0 To 10
   ReDim Preserve Ay(i)
   Ay(i) = Array(i * 1, i * 2, i * 3, i * 4, i * 5)
Next
[A1].Resize(i, 5) = Application.Transpose(Application.Transpose(Ay))
Ay陣列元素是陣列
要以一次寫入就必須使用2次transpose
學海無涯_不恥下問

TOP

本帖最後由 Hsieh 於 2011-1-7 20:27 編輯

回復 20# FAlonso
首先我必須先佩服的求知態度
記得當初剛接觸陣列與dictionary物件時,也有著跟你相同的疑惑
但我就是不求甚解的個性,就把TRANSPOSE函數作為處理陣列問題的方法而已
今天遇到您提出疑問,那就讓我們一起來探討他的奧秘吧!
以下是我個人對陣列與dictionary的理解方式
提供您做參考
若有不是之處,還請各位前輩指正

1.Range("A1:A4")算不算是一個陣列?
是陣列,而且是二維陣列
以下列程式碼測試該陣列狀態
  1. Sub Ex()
  2. Dim j%, i%, Ar As Variant
  3. On Error Resume Next
  4. Ar = [A1:A4]
  5. Do Until j > 2  'j為計算轉置次數的變數
  6. MsgBox IIf(IsArray(Ar), "ar是陣列", "ar不是陣列") '是否為陣列
  7. i = 1
  8. Do Until Err.Number > 0
  9. i = i + 1
  10. k = UBound(Ar, i)
  11. Loop
  12. MsgBox "此陣列為" & i - 1 & "維陣列" & Chr(10) & "被轉置" & j & "次" '第一維上限(列數)
  13. Err.Clear
  14. Ar = Application.Transpose(Ar)
  15. j = j + 1
  16. Loop
  17. End Sub
複製代碼
2.為什麼打直的格子,一次transpose就可以,打橫的要兩次?
那是因為join的引數必須是一維陣列

3.d(mystr) = d(mystr) + A.Offset(, 4).Value這句是怎解釋,為什麼可以作累加的作用?
因為dictionary物件,你可以直接視為陣列,當中的mystr就是索引值(一般陣列會是數值,在此是除了陣列型態以外的任何資料型態),代表此物見某個元素的指定索引
d(mystr)就是d這個物件的mystr位置的那個元素
d(mystr) = d(mystr) + A.Offset(, 4).Value  
變數(新值)=變數(原值)+常數
就好比一個變數了,所以自然就能計算累加值
學海無涯_不恥下問

TOP

Dictionary物件當加入KEY的同時即產生對應該KEY的值為Empty的初始值
整個物件當可視為二維陣列
其第一維則是該物件的數量
其第二維則是該物件的keys與items
該陣列大小表示如下:
ThisArray(d.count,2)
但你無法以INDEX指定該陣列
因為這只是將其視為二維陣列
但實際上他是2個縱列的陣列合起來
所以一般應用上會以其Key直接指定到對應的Item
學海無涯_不恥下問

TOP

回復 25# linshin1999
dim d as object
這是正確宣告,dictionary他是個物件所以宣告為物件沒錯
dictionary這個物件不會因為他的key與item產生資料型態變化
你可將此物件看成一個容器,此容器的內容物並不會改變此容器本身的性質

所以VBA說明中提到
dictionary物件,其key式除了陣列以外的任何資料型態,而item則可為任何形態的資料。
一個關鍵字可對應任何的資料,這是此物件的特性。
學海無涯_不恥下問

TOP

        靜思自在 : 做該做的事是智慧,做不該做的事是愚癡。
返回列表 上一主題