返回列表 上一主題 發帖

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

回復 1# asus103
有些數值跟你A、B陣列取得方式有關
以儲存格範圍為陣列為例
  1. Sub nn()
  2. Dim Ar(), Ay(), C(), A, B
  3. A = [B1:D2]: B = [F1:I2]
  4. For i = LBound(A, 1) To UBound(A, 1)
  5.    For j = LBound(A, 2) To UBound(A, 2)
  6.    ReDim Preserve Ar(s)
  7.    Ar(s) = A(i, j) '取得A陣列
  8.    s = s + 1
  9.    Next
  10.    For j = LBound(B, 2) To UBound(B, 2)
  11.    ReDim Preserve Ar(s)
  12.    Ar(s) = B(i, j) '取得B陣列
  13.    s = s + 1
  14.    Next
  15.    ReDim Ay(s)
  16.    For j = 0 To UBound(Ar)
  17.      Ay(j) = Application.Small(Ar, j + 1) '排序
  18.    Next
  19.    ReDim Preserve C(k)
  20.    C(k) = Ay: s = 0: Erase Ay '加入資料到C陣列,把暫存陣列清除
  21.    k = k + 1
  22. Next
  23. [K1].Resize(k, UBound(A, 2) + UBound(B, 2)) = Application.Transpose(Application.Transpose(C))
  24. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 3# asus103

不懂你所謂
並將其餘相對應資料抄錄
請上傳你的範例說明
學海無涯_不恥下問

TOP

本帖最後由 Hsieh 於 2011-1-13 22:28 編輯

回復 5# asus103
  1. Sub ex()
  2. Dim C()
  3. Open "test.txt" For Output As #1 '產生暫存檔
  4. A = [B1:D2]: B = [F1:I2]
  5. For i = LBound(A, 2) To UBound(A, 2)
  6. Print #1, A(1, i) & "," & A(2, i)
  7. Next
  8. For i = LBound(B, 2) To UBound(B, 2)
  9. Print #1, B(1, i) & "," & B(2, i)
  10. Next
  11. Close #1
  12. Shell "sort / " & "test.txt" & " /o " & "temp.txt" '產生排序暫存檔
  13. '偵測直到檔案產生,再繼續後面的動作
  14. While Dir("temp.txt") = ""
  15. Wend
  16. Open "temp.txt" For Input As #1
  17. Do Until EOF(1)
  18. Line Input #1, mystr
  19. ReDim Preserve C(s)
  20. C(s) = Split(mystr, ",")
  21. s = s + 1
  22. Loop
  23. Close #1
  24. Kill "test.txt" '刪除暫存檔
  25. Kill "temp.txt" '刪除排序暫存檔
  26. [B12].Resize(2, s) = Application.Transpose(C)
  27. End Sub
複製代碼
sort指令是Windows原本就有的DOS指令,用於排序純文字檔。
以上程式通過Windows7+Excel2010測試;
若在你的電腦執行有誤,請確認你的電腦裡有 sort.exe 這個執行檔。
學海無涯_不恥下問

TOP

本帖最後由 Hsieh 於 2011-1-13 18:45 編輯

回復 7# asus103
  1. Sub yy() '氣泡排序
  2. Dim Ar(), Ay()
  3. A = [B1:D2]: B = [F1:I2]
  4. For Each y In Array(A, B)
  5. For i = LBound(y, 2) To UBound(y, 2)
  6. ReDim Preserve Ar(s)
  7. ReDim Preserve Ay(s)
  8.   Ar(s) = y(1, i)
  9.   Ay(s) = y(2, i)
  10.   s = s + 1
  11. Next
  12. Next
  13. For i = 0 To UBound(Ar)
  14.     For j = 0 To UBound(Ar) - 1
  15.        If Ar(j + 1) < Ar(j) Then '遞增
  16.      'If Ar(j + 1) > Ar(j) Then  '遞減
  17.       temp = Ar(j)
  18.       temp1 = Ay(j)
  19.       Ar(j) = Ar(j + 1)
  20.       Ar(j + 1) = temp
  21.       Ay(j) = Ay(j + 1)
  22.       Ay(j + 1) = temp1
  23.       
  24.     End If
  25.     Next
  26. Next
  27. [B15].Resize(, s) = Ar
  28. [B16].Resize(, s) = Ay
  29. End Sub
複製代碼
學海無涯_不恥下問

TOP

本帖最後由 Hsieh 於 2011-1-13 22:26 編輯

回復 9# asus103
一般模組
  1. Declare Sub Sleep Lib "kernel32" (ByVal dwmilliseconds As Long) '宣告API的SLEEP函數
  2. Sub nn()
  3. t = Timer '開始計時
  4. For i = 1 To 10
  5.   Sleep 500  '延遲500/1000秒
  6. Next
  7. MsgBox "延遲" & Timer - t & "秒"  "每次延遲0.5秒,十次延遲後共延遲?秒
  8. End Sub
複製代碼
學海無涯_不恥下問

TOP

本帖最後由 Hsieh 於 2011-1-15 11:58 編輯

回復 13# FAlonso
若考慮索引值會重複的情形(第一列相同,但第二列對應值不同)
如圖的資料
您會如何解決?
Array_Sort.zip (10.21 KB)
  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]
  6. For Each y In Array(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))
  9.      d1(y(1, i)) = d1(y(1, i)) + 1
  10.    Next
  11. Next
  12. Do Until d.Count = 0
  13.    ky = Application.Small(d.keys, 1)
  14.    ReDim Preserve C(s)
  15.    C(s) = d(ky)
  16.    s = s + 1
  17.    d.Remove ky
  18. Loop
  19. Sheets(3).[A1].Resize(2, s) = Application.Transpose(C)
  20. Set d = Nothing
  21. Set d1 = Nothing
  22. End Sub
複製代碼
學海無涯_不恥下問

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

回復 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

        靜思自在 : 謊言像一朵盛開的鮮花,外表美麗,生命短暫。
返回列表 上一主題