Board logo

標題: 執行VBA上的問題(sorting不完全) [打印本頁]

作者: m09903020    時間: 2012-4-24 19:19     標題: 執行VBA上的問題(sorting不完全)

問題: 執行時sorting不完全...必須按很多次執行才排序完成。 邏輯上語法上都檢查過3便了,應該是沒問題!  所以現在我不知道是什麼問題...以往沒寫過VBA遇到這種問題..所以上來貴版求救

小的在下我今天寫了一個小sorting 排序三筆資料 5 4 3 2 1
                                                                                              5 4 3 2 1
                                                                                              5 4 3 2 1
由小排到大在某些特定cell中(也就是原本的15個格子), 以下是我的程式碼,
Sub sorting_order()
Dim temp As Integer


For i = 2 To 4
For j = 7 To 10

If (Worksheets("Sheet1").Cells(i, j).Value > Worksheets("Sheet1").Cells(i, j + 1).Value) Then

temp = Worksheets("Sheet1").Cells(i, j + 1).Value
Worksheets("Sheet1").Cells(i, j + 1).Value = Worksheets("Sheet1").Cells(i, j).Value
Worksheets("Sheet1").Cells(i, j).Value = temp

End If

Next
Next


End Sub

這只是小小的三筆排序測試,   因為我需要幾千筆的排序 若按完執行不知何時可完整完成排序則會無解= =。

請貴人高抬貴手,謝謝。
作者: register313    時間: 2012-4-24 20:20

本帖最後由 register313 於 2012-4-24 21:30 編輯

回復 1# m09903020
  1. Sub sorting_order()
  2. C = [G2].End(xlToRight).Column - [G2].Column + 1
  3. For Each G In Range([G2], [G2].End(xlDown))
  4.   G.Resize(1, C).Sort Key1:=G, Order1:=xlAscending, Header:=xlGuess, Orientation:=xlLeftToRight
  5. Next
  6. End Sub
複製代碼
  1. Sub sorting_order()
  2. C = [G2].End(xlToRight).Column - [G2].Column + 1
  3. 'C=G2向右最後一欄之欄號-G2欄號+1=11-7+1=5欄
  4. For Each G In Range([G2], [G2].End(xlDown))
  5. '迴圈:共有幾列要排序 第1圈:G=G2,第2圈:G=G3...
  6.   G.Resize(1, C).Sort Key1:=G, Order1:=xlAscending, Header:=xlGuess, Orientation:=xlLeftToRight
  7.   'G2擴大5欄作排序    排序鍵G2 遞增排序             無標題           依列排序
  8.   'G3擴大5欄作排序    排序鍵G3 遞增排序             無標題           依列排序
  9. Next
  10. End Sub
複製代碼

作者: GBKEE    時間: 2012-4-24 20:25

回復 1# m09903020
  1. Option Explicit
  2. Sub sorting_order()
  3. Dim temp As Integer, i As Integer, y As Integer, j As Integer
  4. For i = 2 To 4
  5. For y = 7 To 9              '*****  有有4欄 要跑3 次   ****
  6. For j = 7 To 9               '原本有4欄  第4欄不必跑
  7.    'For j = 7 To 10
  8. If (Worksheets("Sheet1").Cells(i, j).Value > Worksheets("Sheet1").Cells(i, j + 1).Value) Then
  9.    'If j < 10 Then
  10.     temp = Worksheets("Sheet1").Cells(i, j + 1).Value
  11.     Worksheets("Sheet1").Cells(i, j + 1).Value = Worksheets("Sheet1").Cells(i, j).Value
  12.      Worksheets("Sheet1").Cells(i, j).Value = temp
  13.      'End If
  14. End If
  15. Next
  16. Next
  17. Next
  18. End Sub

  19. Sub Ex()
  20. Dim temp As Integer, i As Integer, y As Integer, j As Integer, Ar
  21.     For i = 2 To 4
  22.         Ar = Application.Transpose(Application.Transpose(Range(Cells(i, 7), Cells(i, 10)).Value))
  23.         '將 整列的數值轉至再轉至(為一維陣列) 導入 陣列
  24.        '工作表函數 Small 可在一維陣列中傳回 指定排序第幾個的  最小值  
  25.         For y = 7 To 10
  26.            Cells(i, y) = Application.Small(Ar, y - 6)  '將 陣列 值由最小開始排列
  27.         Next
  28.     Next
  29. End Sub
複製代碼

作者: m09903020    時間: 2012-4-24 21:15

回復 3# GBKEE


    謝謝版大的意見,
作者: m09903020    時間: 2012-4-24 21:17

回復 2# register313


    謝謝R大的意見,我剛試run了您的程式發現可以跑,跟我之前假設的EXCEL編譯問題無關

    可以麻煩你寫點註記嗎? 您的程式蠻精簡的我看不懂  ^^"
作者: m09903020    時間: 2012-4-26 02:02

回復 2# register313


    非常謝謝,我能應用在龐大的數量中了!
作者: GBKEE    時間: 2012-4-26 05:52

回復 2# register313
  1. Sub sorting_order()
  2.     Dim G As Range
  3.     For Each G In Range([G2], [G2].End(xlDown)).CurrentRegion.Rows
  4.         G.Sort Key1:=G, Order1:=xlAscending, Header:=xlGuess, Orientation:=xlLeftToRight
  5.     Next
  6. End Sub
複製代碼





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