Sắp xếp bằng VBA theo tiêu chí dựa trên giá trị của 1 ô (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
941
Được thích
574
Em đã biết dùng VBA để sắp xếp dữ liệu thông qua nút lệnh Command Button. (do em record macro).

Tuy nhiên em chưa biết cách để sắp xếp theo tiêu chí dựa trên giá trị của 1 ô.

Xin các tiền bối giúp
 

File đính kèm

Em đã biết dùng VBA để sắp xếp dữ liệu thông qua nút lệnh Command Button. (do em record macro).

Tuy nhiên em chưa biết cách để sắp xếp theo tiêu chí dựa trên giá trị của 1 ô.

Xin các tiền bối giúp
Bạn làm vầy xem
PHP:
Private Sub CommandButton1_Click()
On Error Resume Next
Range("A7:H50").Sort Key1:=Range([C4].Value & 7), Order1:=xlAscending
End Sub
 
Upvote 0
Bạn làm vầy xem
PHP:
Private Sub CommandButton1_Click()
On Error Resume Next
Range("A7:H50").Sort Key1:=Range([C4].Value & 7), Order1:=xlAscending
End Sub
Bác ơi, sau khi chọn giá trị trong ô C4, mình lại phải nhấn nút lệnh. Em muốn chỉ chọn giá trị trong C4 là việc sắp xếp thưc hiện ngay (Không dùng bất cứ nút lệnh nào). Mong bác giúp tiếp
 
Upvote 0
Bác ơi, sau khi chọn giá trị trong ô C4, mình lại phải nhấn nút lệnh. Em muốn chỉ chọn giá trị trong C4 là việc sắp xếp thưc hiện ngay (Không dùng bất cứ nút lệnh nào). Mong bác giúp tiếp
Thì bạn đưa nó vào sự kiện thôi
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$4" Then Exit Sub
On Error Resume Next
Range("A7:H50").Sort Key1:=Range([C4].Value & 7), Order1:=xlAscending
End Sub
 
Upvote 0
Thì bạn đưa nó vào sự kiện thôi
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$4" Then Exit Sub
On Error Resume Next
Range("A7:H50").Sort Key1:=Range([C4].Value & 7), Order1:=xlAscending
End Sub
Cái chính là em chưa hiểu cái "sự kiện" đấy

Em đã thực hành được rồi

Cảm ơn bác !
 
Upvote 0
Em đã biết dùng VBA để sắp xếp dữ liệu thông qua nút lệnh Command Button. (do em record macro).

Tuy nhiên em chưa biết cách để sắp xếp theo tiêu chí dựa trên giá trị của 1 ô.

Xin các tiền bối giúp

Lời khuyên: Để tránh lỗi không đáng có vì dùng sự kiện change, khuyên bạn nên thay Validation bằng ComboBox
Tôi làm như sau:
- Vẽ 1 ComboBox (Forms), đặt tên là Drpd1
- Nạp list cho combobox tuỳ ý
- Chèn 1 Module với code:
Mã:
Sub [COLOR=#ff0000][B]Drpd1[/B][/COLOR]_Change()
  Dim drp As DropDown
  With Sheet1.Range("A7:K10000")
    Set drp = .Parent.DropDowns("Drpd1")
    .Sort .Cells(1, drp.Value), 1, Header:=xlNo
  End With
End Sub
- Trở ra bảng tính, click phải vào ComboBox, chọn Assign Macro và chỉ đến tên Sub Drpd1_Change rồi OK
- Xong! Giờ thì chọn vào ComboBox để thí nghiệm
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Lời khuyên: Để tránh lỗi không đáng có vì dùng sự kiện change, khuyên bạn nên thay Validation bằng ComboBox
Tôi làm như sau:
- Vẽ 1 ComboBox (Forms), đặt tên là Drpd1
- Nạp list cho combobox tuỳ ý
- Chèn 1 Module với code:
Mã:
Sub [COLOR=#ff0000][B]Drpd1[/B][/COLOR]_Change()
  Dim drp As DropDown
  With Sheet1.Range("A7:K10000")
    Set drp = .Parent.DropDowns("Drpd1")
    .Sort .Cells(1, drp.Value), 1, Header:=xlNo
  End With
End Sub
- Trở ra bảng tính, click phải vào ComboBox, chọn Assign Macro và chỉ đến tên Sub Drpd1_Change rồi OK
- Xong! Giờ thì chọn vào ComboBox để thí nghiệm
Thực sự em cũng đang loay hoay chuyển sang DropDown list như bác gợi ý.
Nhưng mong bác đừng cười, em vẽ lại ComboBox (forms) trên file mà không làm được như bác:
1. Nạp list cho ComboBox như thế nào. (trong Input Range không có)
2. Đặt tên cho ComboBox như thế nào? (Tên ComboBox đã mặc định)
 
Upvote 0
Thực sự em cũng đang loay hoay chuyển sang DropDown list như bác gợi ý.
Nhưng mong bác đừng cười, em vẽ lại ComboBox (forms) trên file mà không làm được như bác:
1. Nạp list cho ComboBox như thế nào. (trong Input Range không có)
2. Đặt tên cho ComboBox như thế nào? (Tên ComboBox đã mặc định)

Add list cho Dropdown bằng tay chắc bạn biết rồi chứ? Tức liên kết với 1 vùng nào đó ấy
Tôi giả sử cái Dropdown ấy đã có list (do add bằng tay) rồi. Giờ ta làm tiếp vài công đoạn sau:
- Dùng chuột chọn vào Dropdown
- Bấm Alt + F11 vào cửa sổ lập trình.
- Bấm tiếp Ctrl + G để mở cửa sổ Immediate
- Gõ vào dòng lệnh: Selection.List = Selection.List Enter
- Trở về bảng tính và xóa vùng liên kết với Dropdown
----------------------------------------
Còn vụ đặt tên thì cứ chọn vào Dropdown rồi gõ tên tùy ý vào hộp Name Box thôi
Xem video clip


[video=youtube;QP8APfdKx8E]http://www.youtube.com/watch?v=QP8APfdKx8E&feature=youtu.be[/video]
 
Upvote 0
Add list cho Dropdown bằng tay chắc bạn biết rồi chứ? Tức liên kết với 1 vùng nào đó ấy
Tôi giả sử cái Dropdown ấy đã có list (do add bằng tay) rồi. Giờ ta làm tiếp vài công đoạn sau:
- Dùng chuột chọn vào Dropdown
- Bấm Alt + F11 vào cửa sổ lập trình.
- Bấm tiếp Ctrl + G để mở cửa sổ Immediate
- Gõ vào dòng lệnh: Selection.List = Selection.List Enter
- Trở về bảng tính và xóa vùng liên kết với Dropdown
----------------------------------------
Còn vụ đặt tên thì cứ chọn vào Dropdown rồi gõ tên tùy ý vào hộp Name Box thôi
Xem video clip

Chân thành cảm ơn bác. Bác đã rất kỳ công, tỷ mỷ hướng dẫn những người mới tập tành VBA như em.
Em đã làm được rồi. Rất mong bác tiếp tục chỉ dẫn cho em về VBA trong 1 vài câu hỏi tới
 
Upvote 0
Lời khuyên: Để tránh lỗi không đáng có vì dùng sự kiện change, khuyên bạn nên thay Validation bằng ComboBox
Tôi làm như sau:
- Vẽ 1 ComboBox (Forms), đặt tên là Drpd1
- Nạp list cho combobox tuỳ ý
- Chèn 1 Module với code:
Mã:
Sub Drpd1_Change()
  Dim drp As DropDown
With Sheet1.Range("A7:K10000")
    Set drp = .Parent.DropDowns("Drpd1")
    .Sort .Cells(1, drp.Value), 1, Header:=xlNo
  End With
End Sub
- Xong! Giờ thì chọn vào ComboBox để thí nghiệm

Các bác cho em hỏi, em thử tí toáy 1 tí bằng cách thêm lệnh
Mã:
Sub Drpd1_Change()
  Dim drp As DropDown
[COLOR=#0000cd][B]UnProtect sheet[/B]  [/COLOR]
With Sheet1.Range("A7:K10000")
    Set drp = .Parent.DropDowns("Drpd1")
    .Sort .Cells(1, drp.Value), 1, Header:=xlNo
  End With
[COLOR=#0000cd][B]Protect sheet[/B][/COLOR]
End Sub
Sao nó báo lỗi nhỉ. Các chỗ khác em vẫn làm mà không thấy bị lỗi |||||
 
Upvote 0
Các bác cho em hỏi, em thử tí toáy 1 tí bằng cách thêm lệnh
Mã:
Sub Drpd1_Change()
  Dim drp As DropDown
[COLOR=#0000cd][B]UnProtect sheet[/B]  [/COLOR]
With Sheet1.Range("A7:K10000")
    Set drp = .Parent.DropDowns("Drpd1")
    .Sort .Cells(1, drp.Value), 1, Header:=xlNo
  End With
[COLOR=#0000cd][B]Protect sheet[/B][/COLOR]
End Sub
Sao nó báo lỗi nhỉ. Các chỗ khác em vẫn làm mà không thấy bị lỗi |||||


Tí toái thì cũng phải tí toái đúng, chứ không đúng nó cự là phải!

Mở khóa sheet thì phải: ActiveSheet.UnProtect ("NeuCoPass")

Và khóa sheet cũng phải: ActiveSheet.Protect ("NeuCoPass")

Cái vụ Protect sheet này chả biết ở đâu ra!
 
Upvote 0
Hehe, các tiền bối thông cảm, em đang mò mẫm về VBA và bắt đầu từ ABV

Ví dụ bạn không biết câu lệnh nó là gì nhưng bằng tay thì bạn biết làm. Vậy thì đơn giản là:
- Bật record macro lên
- Thao tác bằng tay để Protect sheet (hoặc Unprotect sheet)
- Tắt record macro và xem code
ĐÓ LÀ CÁCH HỌC
 
Upvote 0
Ví dụ bạn không biết câu lệnh nó là gì nhưng bằng tay thì bạn biết làm. Vậy thì đơn giản là:
- Bật record macro lên
- Thao tác bằng tay để Protect sheet (hoặc Unprotect sheet)
- Tắt record macro và xem code
ĐÓ LÀ CÁCH HỌC
Vâng em cũng thường làm như thế. Nó rất hay và cho câu lệnh chính xác.
Tuy nhiên câu lệnh thu được từ Record Macro thường rườm rà và nhiều lúc không thể ghi được. Ngoài ra cũng vì vừa record macro, vừa dùng code của diễn đàn nên khi đưa vào vận dụng kết quả là "1 nồi thập cẩm" chẳng biết gọi là lẩu hay cháo nữa.

Hehee
 
Upvote 0
Vâng em cũng thường làm như thế. Nó rất hay và cho câu lệnh chính xác.
Tuy nhiên câu lệnh thu được từ Record Macro thường rườm rà và nhiều lúc không thể ghi được. Ngoài ra cũng vì vừa record macro, vừa dùng code của diễn đàn nên khi đưa vào vận dụng kết quả là "1 nồi thập cẩm" chẳng biết gọi là lẩu hay cháo nữa.

Hehee

Đừng lo, lúc đầu thì nồi thập cẩm, tốc độ ì ạch, rườm rà, sau đó chọn lọc, hiểu rõ bản chất của từng Object, từng Controls, Range, Array v.v... thì sẽ nhanh chóng "nấu ăn ngon" thôi!
 
Upvote 0
Vâng em cũng thường làm như thế. Nó rất hay và cho câu lệnh chính xác.
Tuy nhiên câu lệnh thu được từ Record Macro thường rườm rà và nhiều lúc không thể ghi được. Ngoài ra cũng vì vừa record macro, vừa dùng code của diễn đàn nên khi đưa vào vận dụng kết quả là "1 nồi thập cẩm" chẳng biết gọi là lẩu hay cháo nữa.

Hehee

Thông thường bác Bill theo dõi thao tác của bạn và ghi thành code, vậy nên bất cứ hành động nào (chọn cell, kéo thanh trượt...) ổng cũng ghi tuốt
Khi xem code, bạn cũng phải tự mình suy đoán đâu là đoạn code thừa để mà bỏ bớt chứ
Tôi ví dụ bạn record macro thao tác: Copy A1:B10 và Paste Values vào C1:D10 thì anh Bill sẽ ghi thế này:
Mã:
Sub Macro1()
'
' Macro2 Macro
'

'
    Range("A1:B10").Select
    Selection.Copy
    Range("C1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub
Những đoạn Select gì gì bạn có thể bỏ bớt
Mã:
Sub Macro1()

    Range("A1:B10").Copy
    Range("C1").PasteSpecial Paste:=xlPasteValues
End Sub
vân vân....
Nói chung: Bạn "dũng cảm" vọc thì sẽ có tiến bộ
 
Upvote 0
Lời khuyên: Để tránh lỗi không đáng có vì dùng sự kiện change, khuyên bạn nên thay Validation bằng ComboBox

- Vẽ 1 ComboBox (Forms), đặt tên là Drpd1
- Nạp list cho combobox tuỳ ý
- Chèn 1 Module với code:
Mã:
Sub [COLOR=#ff0000][B]Drpd1[/B][/COLOR]_Change()
  Dim drp As DropDown
  With Sheet1.Range("A7:K10000")
    Set drp = .Parent.DropDowns("Drpd1")
    .Sort .Cells(1, drp.Value), 1, Header:=xlNo
  End With
End Sub

Bác cho em hỏi vì sao bác khuyên là sử dụng ComboBox (Forms) chứ không phải là ComboBox trong ControloToolBox. Khác nhau của 2 thằng này là gì ạ ??
 
Upvote 0
Bác cho em hỏi vì sao bác khuyên là sử dụng ComboBox (Forms) chứ không phải là ComboBox trong ControloToolBox. Khác nhau của 2 thằng này là gì ạ ??

Khác nhau hoàn toàn chứ!

- Với thằng Forms khi Addlist cho nó xong thì xóa nguồn nó vẫn còn trong List, còn thằng kia thì không.

- Với thằng Forms thì không tạo được nhiều cột, thằng kia ngược lại.

- Với thằng Forms giá trị của nó xuất ra là Index, thằng kia là giá trị mà bạn muốn đặt ra.

- Với thằng Forms giao diện đẹp hơn thằng kia.

v.v và v.v...

Tùy theo cách mà bạn ứng dụng thôi.
 
Upvote 0
Khác nhau hoàn toàn chứ!

Tùy theo cách mà bạn ứng dụng thôi.

Đấy, những thông tin dù là rất nhỏ nhưng gà mờ như em là cả vấn đề. Biết đọc sách nào để biết ?. Không thông từ đầu sẽ không có lựa chọn đúng đối tượng khi vận dụng. Lâu dần sẽ thành "tật" khó mà trở thành chuyên nghiệp như các bác được
 
Upvote 0
Đấy, những thông tin dù là rất nhỏ nhưng gà mờ như em là cả vấn đề. Biết đọc sách nào để biết ?. Không thông từ đầu sẽ không có lựa chọn đúng đối tượng khi vận dụng. Lâu dần sẽ thành "tật" khó mà trở thành chuyên nghiệp như các bác được
Có ai dạy bảo gì đâu, nói như Thầy NDU đấy, cứ vọc riết, bị treo máy riết, bị mất dữ liệu riết rồi thành ra kinh nghiệm thôi.

Bạn cần phải vọc thật nhiều mới có được kinh nghiệm xương máu!
 
Upvote 0
Tuy nhiên câu lệnh thu được từ Record Macro thường rườm rà và nhiều lúc không thể ghi được.
Ngoài ra cũng vì vừa record macro, vừa dùng code của diễn đàn nên khi đưa vào vận dụng kết quả là "1 nồi thập cẩm" chẳng biết gọi là lẩu hay cháo nữa.

Hehee
Một khi xài code của diễn đàn, bạn nên dịch hay nhờ người khác dịch từ ngôn ngữ VBA sang ngôn ngữ tiếng Việt cái đã cho chắc ăn;

/(hi đã hiểu hết các câu lệnh, lúc đó mới thực sự trở thành là tri thức của bạn!
 
Upvote 0
Có ai dạy bảo gì đâu, nói như Thầy NDU đấy, cứ vọc riết, bị treo máy riết, bị mất dữ liệu riết rồi thành ra kinh nghiệm thôi.

Bạn cần phải vọc thật nhiều mới có được kinh nghiệm xương máu!

Em cũng thường xuyên vọc ấy chứ. Buổi tối cứ ôm máy tính đến rạng sáng. Trên màn hình có 4 cửa sổ: 1. Cửa sổ Excel, 2. Cửa sổ VBE, 3. Cửa sổ web GPE và cửa sổ Google.
Tuy nhiên cứ như con dã tràng, tuy chẳng tiếc công, nhưng nhiều lúc tắc ở vấn đề rất nhỏ làm mình "điên" lắm
 
Upvote 0
Em cũng thường xuyên vọc ấy chứ. Buổi tối cứ ôm máy tính đến rạng sáng. Trên màn hình có 4 cửa sổ: 1. Cửa sổ Excel, 2. Cửa sổ VBE, 3. Cửa sổ web GPE và cửa sổ Google.
Tuy nhiên cứ như con dã tràng, tuy chẳng tiếc công, nhưng nhiều lúc tắc ở vấn đề rất nhỏ làm mình "điên" lắm

Tôi bị hoài cái vụ "tắc" này, mới viết hôm trước, hôm sau nhìn lại tôi phải nghiệm thật lâu mới nhớ mình viết với mục đích gì, tại sao mình viết như vậy! (chỉ tại cái tật chủ quan, chả chịu ghi chú trên code gì cả, dạo này đang tập ghi chú rồi nè, nhưng cũng hay quên hoài à).
 
Upvote 0
Tôi bị hoài cái vụ "tắc" này, mới viết hôm trước, hôm sau nhìn lại tôi phải nghiệm thật lâu mới nhớ mình viết với mục đích gì, tại sao mình viết như vậy! (chỉ tại cái tật chủ quan, chả chịu ghi chú trên code gì cả, dạo này đang tập ghi chú rồi nè, nhưng cũng hay quên hoài à).

Ghi chú trên code là 1 thói quen cần thiết. Cảm ơn bác đã chia sẻ kinh nghiệm từ cái nhỏ nhất.

Trước đây em cũng khệnh khạng rất ít khi lưu tên bạn bè, người thân trên danh bạ điện thoại của mình. Mình tự tin thái quá vào trí nhớ của mình. Chỉ đến khi bụng đói, mắt mờ, chân chậm, tay run. Vợ gọi, sếp giục, bạn bè réo mới thấy cái tự phụ của mình thật rẻ mạt và làm khổ mình. Bây giờ dù là cái số đt mình thuộc làu em cũng ghi rất chi tiết.

--=0
 
Upvote 0
Bác cho em hỏi vì sao bác khuyên là sử dụng ComboBox (Forms) chứ không phải là ComboBox trong ControloToolBox. Khác nhau của 2 thằng này là gì ạ ??

Tôi đâu có khuyên phải dùng ComboBox Forms
Tôi chỉ nói thay vì dùng sự kiện Change dựa vào sự thay đổi của Validation, bạn nên chuyển nó thành sự kiện của ComboBox
Lý do vì: Sự kiện WorksheetChange vận hành trên toàn bộ sheet, dù bạn có giời hạn vùng hoạt động (If Intersect... gì gì đó) thì nó vẫn cứ hoạt động ngay khi có thay đổi trên sheet. Vậy nên sẽ rất dễ xảy ra lỗi không lường trước (như xóa dòng, xóa cột, chèn dòng, chèn cột... ) khiến bạn đau đầu (mất công phải sửa code)
Thế thì ta nên "giao" nhiệm vụ cho ComboBox làm là chắc ăn nhất... Còn nó là ComboBox gì thì tùy bạn chọn
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom