返回列表 上一主題 發帖

[發問]將兩陣列依順序合併問題

[發問]將兩陣列依順序合併問題

各位大大您們好
如果想將兩陣列依由小而大順序合併問題
如:
A  8 4 6               B 7 5 3 9                C 3 4 5 6 7 8 9
    3 4 5                  4 2 1 3                   1 4 2 5 4 3 3
將A,B兩陣列合併成C陣列,並將其餘相對應資料抄錄,
應該如何解決

感謝各位的協助
ASUS

回復 21# Hsieh


    謝謝前輩,謝謝論壇
後學藉此帖練習陣列在字典裡吞吐之間編輯陣列值與 儲存格同字元數橫向排序,練習方案如下
請前輩們指教

資料表(工作表1):

資料表(工作表2):


結果表(工作表3):


Option Explicit
Sub TEST_2()
Application.ScreenUpdating = False
Dim Y, N&, i&, j&, A, C%
Set Y = CreateObject("Scripting.Dictionary")
Sheets(3).UsedRange.Clear
For i = 1 To 2
   Y("表" & i) = Sheets(i).Range("A1").CurrentRegion: A = Y("表" & i)
   Y(i & "/R") = UBound(A): Y(i & "/C") = UBound(A, 2)
   For j = 1 To Y(i & "/C")
      N = N + 1: A(1, j) = Format(A(1, j), "000") & "|" & Format(N, "000")
   Next
   Y("表" & i) = A
Next
Sheets(3).[A1].Resize(Y("1/R"), Y("1/C")) = Y("表1")
Sheets(3).[A1].Item(1, Y("1/C") + 1).Resize(Y("2/R"), Y("2/C")) = Y("表2")
With Sheets(3).UsedRange
   .Sort Key1:=.Item(1), Order1:=xlAscending, Header:=xlNo, _
   Orientation:=xlLeftToRight
   Intersect([1:1], .Cells).Replace "|*", "", Lookat:=xlPart
End With
Set Y = Nothing
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

感謝Hsieh、FAlonso兩位大大
我從這個討論的過程中收穫很多
會再花時間好好吸收其中精華
而且程式碼值得典藏,以後必然尚有機會用到

感謝再三
ASUS

TOP

回復 16# asus103
  1. Sub Dic_Sort()
  2. Dim C()
  3. Set d = CreateObject("Scripting.Dictionary") '
  4. Set d1 = CreateObject("Scripting.Dictionary") '同索引項目數量計數器
  5. '(注意)工作表1跟工作表2的資料列數要相同
  6. a = Sheets(1).Range("A1").CurrentRegion: B = Sheets(2).Range("A1").CurrentRegion '寫入A、B陣列內容
  7. For Each y In Array(a, B) '以迴圈順序讀入A、B陣列到字典物件
  8.    For i = LBound(y, 2) To UBound(y, 2)
  9.      d(y(1, i) + d1(y(1, i)) * 0.1) = Application.Transpose(Application.Index(y, , i)) '因為索引值都是整數,所以索引值加計數的0.1倍當成新索引值,避免與其他索引值重複,對應2列的值
  10.      d1(y(1, i)) = d1(y(1, i)) + 1 '同索引值計數
  11.    Next
  12. Next
  13. Do Until d.Count = 0 '進行迴圈,直到字典內容數量為0跳出迴圈
  14.    ky = Application.Small(d.keys, 1) '得到索引值陣列中最小值
  15.    'ky = Application.Min(d.keys) '得到索引值陣列中最小值,亦可使用MIN函數
  16.    ReDim Preserve C(s)
  17.    C(s) = d(ky) '將最小值的內容存入陣列
  18.    s = s + 1
  19.    d.Remove ky '移除字典中最小值的項目,此時字典內容數量會減少1個
  20. Loop
  21. Sheets(3).[A1].Resize(UBound(a, 1), s) = Application.Transpose(C) '原本C陣列可視為s列(陣列A的列數)欄,所以轉置後成為(陣列A的列數)列s欄,寫入工作表
  22. Set d = Nothing '釋放物件
  23. Set d1 = Nothing '釋放物件
  24. End Sub
複製代碼
Array_Sort.zip (11.64 KB)
學海無涯_不恥下問

TOP

  1. Sub merge_rank2()
  2. Dim myobject As Object, myobject2 As Object
  3. Dim myrange As Range
  4. Dim i As Integer, j As Integer, k As Integer, myrow As Integer
  5. Dim mykey

  6. Set myobject = CreateObject("scripting.dictionary")
  7. Set myobject2 = CreateObject("scripting.dictionary")

  8. myrow = Sheet4.Range("A65536").End(xlUp).Row

  9. With Sheet4
  10. For Each myrange In .Range(.[a1], .[a1].End(xlToRight))
  11. myobject(myrange.Value) = myobject(myrange.Value) + 1
  12. For j = 2 To myrow
  13. myobject2(myrange.Value & "," & myobject(myrange.Value) & "," & j) = myrange.Offset(j - 1).Value
  14. Next
  15. Next
  16. End With

  17. With Sheet5
  18. .Activate
  19. .Range("a1").Activate
  20. For i = 1 To myobject.Count
  21. For j = 1 To myobject(Application.Small(myobject.keys, i))
  22. ActiveCell.Value = Application.Small(myobject.keys, i)
  23. For k = 2 To myrow
  24. ActiveCell.Offset(k - 1, 0).Value = myobject2(Application.Small(myobject.keys, i) & "," & j & "," & k)
  25. Next
  26. ActiveCell.Offset(0, 1).Select
  27. Next
  28. Next
  29. End With

  30. Set myobject = Nothing
  31. Set myobject2 = Nothing

  32. End Sub
複製代碼
這個是優化程式,第一行重覆也可使用
我到此為止了.....
80 字節以內
不支持自定義 Discuz! 代碼

TOP

本帖最後由 FAlonso 於 2011-1-15 14:13 編輯

看第20頁,那個是最終程式
80 字節以內
不支持自定義 Discuz! 代碼

TOP

本帖最後由 Hsieh 於 2011-1-15 18:23 編輯

回復 17# FAlonso
作法思考邏輯一樣,排序是用SMALL函數,可將KEY一一移除,取最小值,所以若用MIN也是同樣效果
  1. Sub Dic_Sort()
  2. Dim C()
  3. Set d = CreateObject("Scripting.Dictionary") '
  4. Set d1 = CreateObject("Scripting.Dictionary") '同索引項目數量計數器
  5. A = Sheets(1).[A1:J2]: B = Sheets(2).[A1:J2] '寫入A、B陣列內容
  6. For Each y In Array(A, B) '以迴圈順序讀入A、B陣列到字典物件
  7.    For i = LBound(y, 2) To UBound(y, 2)
  8.      d(y(1, i) + d1(y(1, i)) * 0.1) = Array(y(1, i), y(2, i)) '因為索引值都是整數,所以索引值加計數的0.1倍當成新索引值,避免與其他索引值重複,對應2列的值
  9.      d1(y(1, i)) = d1(y(1, i)) + 1 '同索引值計數
  10.    Next
  11. Next
  12. Do Until d.Count = 0 '進行迴圈,直到字典內容數量為0跳出迴圈
  13.    ky = Application.Small(d.keys, 1) '得到索引值陣列中最小值
  14.    'ky = Application.Min(d.keys) '得到索引值陣列中最小值,亦可使用MIN函數
  15.    ReDim Preserve C(s)
  16.    C(s) = d(ky) '將最小值的內容存入陣列
  17.    s = s + 1
  18.    d.Remove ky '移除字典中最小值的項目,此時字典內容數量會減少1個
  19. Loop
  20. Sheets(3).[A1].Resize(2, s) = Application.Transpose(C) '原本C陣列可視為s列2欄,所以轉置後成為2列s欄,寫入工作表
  21. Set d = Nothing '釋放物件
  22. Set d1 = Nothing '釋放物件
  23. End Sub
複製代碼
學海無涯_不恥下問

TOP

[版主管理留言]
  • Hsieh(2011-1-15 11:59): 已開放下載,程式碼也顯示了 參考看看 多謝參與討論

回復 14# Hsieh
  1. Sub merge_rank()
  2. Dim myobject As Object, myobject2 As Object
  3. Dim myrange As Range
  4. Dim i As Integer, j As Integer

  5. Set myobject = CreateObject("scripting.dictionary")
  6. Set myobject2 = CreateObject("scripting.dictionary")

  7. With Sheet4
  8. For Each myrange In .Range(.[a1], .[a1].End(xlToRight))
  9. myobject(myrange.Value) = myobject(myrange.Value) + 1      'myrange.value為第1 row某數字,myobject作為計數器
  10. myobject2(myrange.Value & "," & myobject(myrange.Value)) = myrange.Offset(1).Value  myobject2輸入第2 row的數字(index為myrange.Value & "," & myobject(myrange.Value,即數字及其出現次數)
  11. Next
  12. End With

  13. With Sheet5
  14. .Activate
  15. .Range("a1").Activate
  16. For i = 1 To myobject.Count   '先數有多少筆不同的資料
  17. For j = 1 To myobject(Application.Small(myobject.keys, i))       '先排列,再找出其出現次數
  18. ActiveCell.Value = Application.Small(myobject.keys, i)            
  19. ActiveCell.Offset(1, 0).Value = myobject2(Application.Small(myobject.keys, i) & "," & j)
  20. ActiveCell.Offset(0, 1).Select
  21. Next
  22. Next
  23. End With

  24. Set myobject = Nothing
  25. Set myobject2 = Nothing

  26. End Sub
複製代碼
80 字節以內
不支持自定義 Discuz! 代碼

TOP

本帖最後由 asus103 於 2011-1-15 03:15 編輯

回復 13# FAlonso

感謝您FAlonso大大
您的IDEA的確很妙,深感佩服
我會根據這個想法再來看看我的程式的改進空間
我的陣列中第1維的確是唯一
但是每一個資料之下卻不只1個
即
A  8 4 6               B 7 5 3 9                C 3 4 5 6 7 8 9
    3 4 5                  4 2 1 3                   1 4 2 5 4 3 3
    1 2 3                  5 4 3 2                   . . . . . . . . . ..

非常感謝您的協助
ASUS

TOP

[版主管理留言]
  • Hsieh(2011-1-14 20:32): 先提出你的解決方式,再解開權限

回復 14# Hsieh
下載不到
80 字節以內
不支持自定義 Discuz! 代碼

TOP

        靜思自在 : 世上有兩件事不能等:一、孝順 二、行善。
返回列表 上一主題