giúp đỡ việc tạo hàm copy then sắp xếp thứ tự

Liên hệ QC

quanghao262

Thành viên mới
Tham gia
27/4/10
Bài viết
31
Được thích
0
em có file excel như ở dưới.có 2 vùng chọn
vùng 1 ("B3: G27") và vùng 2 là ("J3:O27")
3m muốn copy từng cột trong vùng 1 sang vùng 2 tương ứng sau đó sắp xếp
ví dụ như là
copy ("B1:B27") sang ("J1:J27") rồi sau đó xếp cột này theo thứ tự từ bé đến lớn
sau đó copy cột ("C1:C27") sang ("K1:K27") rồi sau đó xếp cột này theo thứ tự từ bé đên lớn.
..............
và cứ như thế cho đến hết.
em đã thử lập hàm này :
PHP:
Sub copy()
' Keyboard Shortcut: Ctrl+Shift+C
Dim Rng As Range
Dim i As Integer
Set Rng = Range("a3:a27")
For i = 1 To 6
     Rng.Offset(0, i).copy
        Rng.Offset(0, i + 8).PasteSpecial Paste:=xlPasteValues
            With ActiveWorkbook.Worksheets("Sheet1").Sort
             .SetRange Rng.Offset(0, i + 8)
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
            End With
                         
Next i
End Sub
nhưng nó báo lỗi dòng ".Apply"
và khi em bỏ dòng aply thì nó không xếp theo thứ tự được.
mong anh chị giúp đỡ
cám ơn anh chị nhiều.
 

File đính kèm

  • copy then sapxep.xls
    55 KB · Đọc: 16
em có file excel như ở dưới.có 2 vùng chọn
vùng 1 ("B3: G27") và vùng 2 là ("J3:O27")
3m muốn copy từng cột trong vùng 1 sang vùng 2 tương ứng sau đó sắp xếp
ví dụ như là
copy ("B1:B27") sang ("J1:J27") rồi sau đó xếp cột này theo thứ tự từ bé đến lớn
sau đó copy cột ("C1:C27") sang ("K1:K27") rồi sau đó xếp cột này theo thứ tự từ bé đên lớn.
..............
và cứ như thế cho đến hết.
em đã thử lập hàm này :
PHP:
Sub copy()
' Keyboard Shortcut: Ctrl+Shift+C
Dim Rng As Range
Dim i As Integer
Set Rng = Range("a3:a27")
For i = 1 To 6
     Rng.Offset(0, i).copy
        Rng.Offset(0, i + 8).PasteSpecial Paste:=xlPasteValues
            With ActiveWorkbook.Worksheets("Sheet1").Sort
             .SetRange Rng.Offset(0, i + 8)
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
            End With
                         
Next i
End Sub
nhưng nó báo lỗi dòng ".Apply"
và khi em bỏ dòng aply thì nó không xếp theo thứ tự được.
mong anh chị giúp đỡ
cám ơn anh chị nhiều.
Code của bạn chỉ cần sửa thành vầy là đủ:
PHP:
Sub copy()
  Dim i As Long
  With Sheet1.Range("J3:O27")
    .Value = Sheet1.Range("B3:G27").Value
    For i = 1 To .Columns.Count
      .Columns(i).Sort .Cells(1, i), 1, , , , , , 2
    Next
  End With
End Sub
 
Upvote 0
Code của bạn chỉ cần sửa thành vầy là đủ:
PHP:
Sub copy()
  Dim i As Long
  With Sheet1.Range("J3:O27")
    .Value = Sheet1.Range("B3:G27").Value
    For i = 1 To .Columns.Count
      .Columns(i).Sort .Cells(1, i), 1, , , , , , 2
    Next
  End With
End Sub
cám ơn anh,nhưng anh có thể giải thích giùm em câu lệnh :
.Columns(i).Sort .Cells(1, i), 1, , , , , , 2
và vấn đề thứ 2 là :
nếu em muốn xếp cột trên theo thứ tự giảm dần thì phải làm thế nào hả anh?
 
Lần chỉnh sửa cuối:
Upvote 0
cám ơn anh,nhưng anh có thể giải thích giùm em câu lệnh :
.Columns(i).Sort .Cells(1, i), 1, , , , , , 2
và vấn đề thứ 2 là :
nếu em muốn xếp cột trên theo thứ tự giảm dần thì phải làm thế nào hả anh?
Xét vòng lặp For trong code của anh ndu:
PHP:
Sub copy()
  Dim i As Long
  With Sheet1.Range("J3:O27")
    .Value = Sheet1.Range("B3:G27").Value
    For i = 1 To .Columns.Count
      .Columns(i).Sort .Cells(1, i), 1, , , , , , 2
    Next
  End With
End Sub
Vòng lặp này lần lượt sắp xếp các cột từ đầu đến cuối của vùng J3:O27. Và tại câu lệnh trong vòng For:
+ .Columns(i).Sort cho biết đang sắp xếp cột thứ i (.Columns.Count là số cột của vùng J3:O27 và biến i chạy từ 1 đến số cột này)
+ .Cells(1, i) là ô đầu tiên của cột thứ i. Đây chính là Key1, tương ứng với vị trí Sort by trong hộp thoại Sort của Excel 2003 trở xuống.
+ Số 1 chính là Order1, tức là kiểu sắp xếp ứng với Key1. Có 2 tùy chọn cho vị trí này: 1=Ascending (tăng) và 2=Descending (giảm).
+ Số 2 chính là tùy chọn Header, tương ứng với vị trí Header row trong hộp thoại Sort (quy định việc vùng dữ liệu sắp xếp có chứa hàng tiêu đề hay không). Có 3 tùy chọn cho vị trí này: 0=Excel tự thiết lập (xlGuess), 1=Có tiêu đề (xlYes) và 2=Không có tiêu đề (xlNo).
Như vậy, nếu bạn muốn xếp theo thứ tự giảm dần thì chỉ cần thay số 1 trong câu lệnh trên bởi số 2 là được.

Bạn nên kiên nhẫn chờ câu trả lời, không nên mở topic mới để hỏi nhé (http://www.giaiphapexcel.com/forum/...iải-thích-câu-lệnh-sắp-xếp-thứ-tự-của-anh-NDU...)
 
Lần chỉnh sửa cuối:
Upvote 0
nhưng tại sao khi em copy nguyên hàm của anh Ndu vào rồi thử viết lại dòng
.Columns(i).Sort .Cells(1, i), 1, , , , , , 2
thì nó báo lỗi ở dấu " , " màu đỏ trên a?
tại sao lại có tới 6 dấu " ," ở giữa 2 số 1 và 2 ( 1,,,,,,2)???

thêm 1 vấn đề nữa em muốn hỏi đó là:
giả sử tên sheet mình đang làm không phải là "sheet1" mà là một cái tên bất kỳ khác ví dụ như "tinhtoan"
thì nó sẽ thay đổi những gì?
thanhk 4 all.
 
Lần chỉnh sửa cuối:
Upvote 0
nhưng tại sao khi em copy nguyên hàm của anh Ndu vào rồi thử viết lại dòng
.Columns(i).Sort .Cells(1, i), 1, , , , , , 2
thì nó báo lỗi ở dấu " , " màu đỏ trên a?
tại sao lại có tới 6 dấu " ," ở giữa 2 số 1 và 2 ( 1,,,,,,2)???

thêm 1 vấn đề nữa em muốn hỏi đó là:
giả sử tên sheet mình đang làm không phải là "sheet1" mà là một cái tên bất kỳ khác ví dụ như "tinhtoan"
thì nó sẽ thay đổi những gì?
thanhk 4 all.

- Bạn đã thử như thế nào?
- Nếu không phải là Sheet1 mà là sheet bất kỳ thì bạn sửa thành:
Sheets("ten sheet")
Trong trường hợp cụ thể thì của bạn là: Sheets("tinhtoan")
Chúc bạn thành công!
 
Upvote 0
Câu lệnh đó có cách viết không tường minh, để hiểu được nó ta fải trình tự như sau

Cố trang tính như sau:

|A|B
2 ||
3 | Ma | HTen |
4 |GPE01|Hồ Li
5 |GPE07|Đỗ Ky
6 |GPE11|Lê La
7 |GPE91|Võ An
|. . |. . .
34 |GPE41|Vy Na

Bạn bật bộ thu macro le6n & thực hiện fương thức sắp xếp theo cột 'A', sau đó đến cột 'B', sau đó ta có dòng lệnh sau:

PHP:
Option Explicit
Sub Sort()
    Selection.Sort Key1:=Range("A4"), Order1:=xlAscending, Key2:=Range("B4") _
        , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
        False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
        :=xlSortNormal
End Sub

(|) Điều trước tiên mình muốn nói với bạn là hãy đếm xem trong dòng lệnh của fương thức có bao nhiêu dấu ','

(|) Ta tiến hành từ dòng lệnh tường minh như trên chuyển sang không tường minh của NDU, như các bước sau:

+ Bạn thấy trong dòng lệnh hàng hà cụm từ ':=' Ta tiến hành bỏ hết các cụm từ này cùng với từ dính liền trước nó; Kết quả sẽ như sau:
PHP:
Sub Sort1()
Selection.Sort Range("A4"), xlAscending, Range("B4") _
  , xlAscending, xlGuess, 1, False, xlTopToBottom, xlSortNormal, xlSortNormal
 End Sub

Sau xử lý ta cho macro này chạy, kết quả vẫn cho như macro nguyên thuỷ;

+ Tiếp đó ta đối chiếu giữa dòng lệnh rút gọn này với dòng lệnh của NDU & thấy rằng của chúng ta có chỉ một số 1, ít hơn của NDU & những con số của NDU là gì?

Thực ra trong dòng lệnh này chứa rất nhiều tham số, mỗi 1 từ có tiếp đầu ngữ xl là 1 con số đó; Chuyện này bạn nên tìm hiểu kỹ thông qua cửa số Immediate (Thông qua CS này, ta giao tiếp với máy đó bạn)

+ Cuối cùng (sau khi bạn cùng tôi nghiền ngẫm kỹ các tham số) là bước bỏ đi các mặc định của VBA là ta thành của NDU thôi;

(|) Nhưng cũng còn 1 cách viết nữa, ta có thể bỏ qua các dấu fết đó đi, bằng cách lấy lại 1 số cụm từ mà là đã bỏ đi ở giai đoản 2, như

PHP:
    Selection.Sort Range("A4"), Order1:=1, Orientation:=xlLeftToRight

/)/hững mong giúp được ít nhiều cho bạn & thân ái!
 
Lần chỉnh sửa cuối:
Upvote 0
nhưng tại sao khi em copy nguyên hàm của anh Ndu vào rồi thử viết lại dòng
.Columns(i).Sort .Cells(1, i), 1, , , , , , 2
thì nó báo lỗi ở dấu " , " màu đỏ trên a?
tại sao lại có tới 6 dấu " ," ở giữa 2 số 1 và 2 ( 1,,,,,,2)???

thêm 1 vấn đề nữa em muốn hỏi đó là:
giả sử tên sheet mình đang làm không phải là "sheet1" mà là một cái tên bất kỳ khác ví dụ như "tinhtoan"
thì nó sẽ thay đổi những gì?
thanhk 4 all.
Đúng ra bạn tự mình record macro quá trình sort bằng tay rồi nghiên cứu code là biết liền
Hic... để đở mất công "đếm" mấy dấu phẩy thì sửa thành vầy:
PHP:
Sub copy()
  Dim i As Long
  With Sheet1.Range("J3:O27")
    .Value = Sheet1.Range("B3:G27").Value
    For i = 1 To .Columns.Count
      .Columns(i).Sort .Cells(1, i), 1, Header:=xlNo
    Next
  End With
End Sub
 
Upvote 0
em thử lập hàm như sau
PHP:
Sub goalseek()
Dim i As Long
Dim Rng As Range
Set Rng = Range("J3:O27")
Rng.Value = Range("B3:G27").Value
With Rng
For i = 1 To Rng.Columns.Count
.Columns(i).sort.cells(1,i),1,Header:=xlNo
..........

End Sub
đấy ạ,chỉ mới đến dòng
.Columns(i).sort.cells(1,i),1,Header:=xlNo
thì nó báo lỗi ngay ở " , " ,có khi nào trong mấy câu lệnh đầu em làm sai ở đâu anh nhỉ?
rồi ngay cả hàm thế này cũng thế :
khi em tự viết lại hàm của anh Ndu thì nó vẫn bị lỗi dấu phẩy ","
PHP:
Sub goalseek()
Dim i As Long
With Sheet1.Range("J3:O27")
.Value = Sheet1.Range("B3:G27").Value
For i = 1 To .Columns.Count
.Columns(i).sort.cells(i,1),1,header=xlno

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
em thử lập hàm như sau
PHP:
Sub goalseek()
Dim i As Long
Dim Rng As Range
Set Rng = Range("J3:O27")
Rng.Value = Range("B3:G27").Value
With Rng.Value
For i = 1 To Rng.Columns.Count
.Columns(i).sort.cells(1,i),1,Header:=xlNo
..........

End Sub
đấy ạ,chỉ mới đến dòng
.Columns(i).sort.cells(1,i),1,Header:=xlNo
thì nó báo lỗi ngay ở " , " ,có khi nào trong mấy câu lệnh đầu em làm sai ở đâu anh nhỉ?
With Rng.Value là sai ---> Phải là With Rng mới đúng (With thì phải đi với Object)
.Columns(i).sort.cells(1,i),1,Header:=xlNo ---> Sai vì giữa chữ sort.cells(1,i) phải có 1 khoảng trắng. Thế này đây:
.Columns(i).sort .cells(1,i),1,Header:=xlNo
Sửa lại:
PHP:
Sub goalseek()
  Dim i As Long
  Dim Rng As Range
  Set Rng = Range("J3:O27")
  Rng.Value = Range("B3:G27").Value
  With Rng
    For i = 1 To .Columns.Count
      .Columns(i).Sort .Cells(1, i), 1, Header:=xlNo
    Next
  End With
End Sub
Rng thì chính là Range("J3:O27"), vậy With Rng làm gì? Sao không viết thẳng vào luôn thành With Range("J3:O27")?
Nếu là tôi thì tôi sẽ viết:
PHP:
Sub goalseek()
  Dim i As Long
  With Range("J3:O27")
    .Value = Range("B3:G27").Value
    For i = 1 To .Columns.Count
      .Columns(i).Sort .Cells(1, i), 1, Header:=xlNo
    Next
  End With
End Sub
Có phải gọn hơn không?
Code này nếu không dùng With... End With thì nó sẽ thế này:
PHP:
Sub goalseek()
  Dim i As Long
  Range("J3:O27").Value = Range("B3:G27").Value
  For i = 1 To Range("J3:O27").Columns.Count
    Range("J3:O27").Columns(i).Sort Range("J3:O27").Cells(1, i), 1, Header:=xlNo
  Next
End Sub
Cảm thấy thằng Range("J3:O27") bị lập lại nhiều lần nên đặt thành thừa số chung bằng cách dùng With... End With. Thế thôi!
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác cho mình hỏi với cái code này thì làm thế nào để rút gọn nó và tùy biến nó để có thể áp dụng cho nhiều cách sắp xếp khác nhau?

Cám ơn các bác nhiều!

Tốt nhất nên kèm file then và mô tả bạn muốn thế nào thì mọi người xem giúp cho
 
Upvote 0
Web KT
Back
Top Bottom