Lập trình VBA với lệnh AutoFilter (1 người xem)

  • Thread starter Thread starter khoa_pr
  • Ngày gửi Ngày gửi
Liên hệ QC

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

khoa_pr

Thành viên hoạt động
Tham gia
16/6/09
Bài viết
141
Được thích
13
Xin chào cộng đồng Giaiphapexcel
tôi làm một danh sách tuyển sinh vào lớp 10, tôi không sử dụng lệnh AutoFiter có sẵn, muốn lập trình VBA. Khi dữ liệu trong ô G5 thay đổi nhờ Data Validation hoặc ComboBox với LítFillRange W8:W15, thì sẽ lọc cột I. Nếu G5 trống thì không lọc. tuy nhiên VBA cứ báo lỗi chỗ ".AutoFilter 9, [G5]". Xin mọi người giúp với.
code:
Private Sub ComboBox1_Change() Application.ScreenUpdating = False
Set chuan = Sheets("Tuyen10THPT").Range(A11: A109)
With Sheets("Tuyen10THPT")
If [G5] <> vbNullString Then
With chuan.Resize(, 9)
.AutoFilter 9, [G5]
End With
End If
Sheets("Tuyen10THPT").AutoFilterMode = False
End With
Application.ScreenUpdating = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
- bạn tải file đính kèm về thử nhé (click nút Test),
- so sánh 2 code khác nhau ở chỗ nào và tự điều chỉnh cho hợp lý. (module 1)
- Sheet Tuyen10THPT hiện tại bạn chưa thống nhất 1 font cho cột Nguyện vọng và G5 -> lọc ko chính xác.

Sao vẫn bị lỗi chỗ này nhỉ:
Lọc cột 9 trong vùng điều kiện là G5.Tạo sao lại bị lỗi nhỉ
 
Upvote 0
Xin chào cộng đồng Giaiphapexcel
tôi làm một danh sách tuyển sinh vào lớp 10, tôi không sử dụng lệnh AutoFiter có sẵn, muốn lập trình VBA. Khi dữ liệu trong ô G5 thay đổi nhờ Data Validation hoặc ComboBox với LítFillRange W8:W15, thì sẽ lọc cột I. Nếu G5 trống thì không lọc. tuy nhiên VBA cứ báo lỗi chỗ ".AutoFilter 9, [G5]". Xin mọi người giúp với.
code:
Private Sub ComboBox1_Change() Application.ScreenUpdating = False
Set chuan = Sheets("Tuyen10THPT").Range(A11: A109)
With Sheets("Tuyen10THPT")
If [G5] <> vbNullString Then
With chuan.Resize(, 9)
.AutoFilter 9, [G5]
End With
End If
Sheets("Tuyen10THPT").AutoFilterMode = False
End With
Application.ScreenUpdating = True
End Sub

Làm lại tất tần tật cho khỏe
1> Cho code này vào Module:
Mã:
Function UniqueList(ParamArray sArray())
  Dim Item, tmpArr, SubArr, tmp
  'On Error Resume Next
  With CreateObject("Scripting.Dictionary")
    For Each SubArr In sArray
      tmpArr = SubArr
      If Not IsArray(tmpArr) Then tmpArr = Array(tmpArr)
      For Each Item In tmpArr
        tmp = CStr(Item)
        If Len(tmp) Then
          If Not .Exists(tmp) Then .Add tmp, ""
        End If
      Next
    Next
    If .Count Then UniqueList = .Keys
  End With
End Function
2> Sửa code của bạn thành:
Mã:
Private Sub ComboBox1_Click()
  With Sheets("Tuyen10THPT").Range("A10:I109")
    .Parent.Range("G5").Value = ComboBox1.Text
    .Parent.AutoFilterMode = False
    .AutoFilter 9, ComboBox1.Text
  End With
End Sub
Private Sub ComboBox1_DropButtonClick()
  Dim aSrc
  aSrc = Worksheets("Tuyen10THPT").Range("I11:I109").Value
  With ComboBox1
    .ListFillRange = ""
    .LinkedCell = ""
    .List() = UniqueList(aSrc)
  End With
End Sub
 

File đính kèm

Upvote 0
Sao vẫn bị lỗi chỗ này nhỉ:

Lọc cột 9 trong vùng điều kiện là G5.Tạo sao lại bị lỗi nhỉ

khà khà +-+-+-+, mò tới mò lui 1 hồi cũng ra.

code sửa thành thế này thì hợp lý hơn
Mã:
Private Sub ComboBox1_Change()
    Range("G5") = ComboBox1.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim chuan As Range
    If Target.Address = "$G$5" Then
    If Target <> vbNullString Then
    Set chuan = Sheets("Tuyen10THPT").Range("A10:I109")
    Application.ScreenUpdating = False
        ActiveSheet.AutoFilterMode = False
        
        With chuan
            .AutoFilter 9, Target.Value
            '.AutoFilter Field:=9, Criteria1:=Target.Value
        End With
        'Sheets("Tuyen10THPT").AutoFilterMode = False '?
    Application.ScreenUpdating = True
    End If
    End If
End Sub

'- - -
file cũ hay bị lỗi + treo máy liên tục , mình nghĩ là do Combobox1 có cài Properties LinkedCell (---> bỏ nó ra thì hết bị)

Link: https://www.mediafire.com/?lgzis3g62gf2uzg
 
Lần chỉnh sửa cuối:
Upvote 0
'- - -
file cũ hay bị lỗi + treo máy liên tục , mình nghĩ là do Combobox1 có cài Properties LinkedCell (---> bỏ nó ra thì hết bị)

Đối với ComboBox1 nằm trên Sheet, nếu đã quyết định dùng code thì nên dẹp hết mấy cái ListFillRange và LinkedCell đi ---> Nó sẽ gây lỗi đến mức nhiều khi không thể khống chế nỗi
 
Upvote 0

1/
Chào bạn phucbugis
Code của bạn nếu dùng ComboBox với ListFillRange thì bị báo lỗi ở ".AutoFilter 9, Target.Value" nếu tôi chép vào file cũ, file của bạn thì chạy tốt, chả hiểu nó lỗi chổ nào. Font chữ như bạn chỉ sai chổ nào hả bạn, vì tất cả đầu là VNI-Times, chỉ khác chổ size 12 và size 13 thôi mà?
Nếu không dùng ComboBox, dùng Data Validation thì nếu G5= Trường Chu Văn An thì nó ẩn toàn bộ, G5 = nguyễn trãi ỏ An Phước thì nó AutoFilter đúng. bạn xem lại code nhé.

2/ Chào bác
ndu96081631
Code của bác hay quá, nhưng sao nó dài quá, trong đó có dùng các hàm ParamArray, Array là hàm về mảng, rồi cả CStr để chuyển đổi . . . tôi rối quá bác ơi. Bác có thể chú thích hoặc giải thích giúp code trong Module để tôi nghiền ngẫm được không ạ ?
Nếu tôi vô hiệu đoạn code "
Private Sub ComboBox1_DropButtonClick() ..........
.List() = UniqueList(aSrc)
End With
End Sub "
thì chương trình vẫn chạy tốt. Nếu vô hiệu code đầu "Private Sub ComboBox1_Click()
With Sheets("Tuyen10THPT").Range("A10:I109")
.............................................
.AutoFilter 9, ComboBox1.Text
End With
End Sub "
thì chương trình không chạy. Theo tôi hiểu code Private Sub ComboBox1_DropButtonClick() có liên quan tới Module, còn Private Sub ComboBox1_Click() nó đâu có gọi Module1 ?

 
Lần chỉnh sửa cuối:
Upvote 0

1/
Chào bạn phucbugis
Code của bạn nếu dùng ComboBox với ListFillRange thì bị báo lỗi ở ".AutoFilter 9, Target.Value" nếu tôi chép vào file cũ, file của bạn thì chạy tốt, chả hiểu nó lỗi chổ nào. Font chữ như bạn chỉ sai chổ nào hả bạn, vì tất cả đầu là VNI-Times, chỉ khác chổ size 12 và size 13 thôi mà?
Nếu không dùng ComboBox, dùng Data Validation thì nếu G5= Trường Chu Văn An thì nó ẩn toàn bộ, G5 = nguyễn trãi ỏ An Phước thì nó AutoFilter đúng. bạn xem lại code nhé.

- mình test lui test tới có thấy bị gì đâu nhỉ (đã thử trên 2 phiên bản 2003, 2013)
Lưu ý: bạn phải test đúng cái file ở #5, mình đã loại bỏ cái Properties LinkCell của combobox đó ra.-0-/.

- còn font thì bạn để ý, file mình gửi lên đó thì mình đã chỉnh lại Font của cột Nguyện vọng rồi, còn file cũ của bạn cột đó ko thống nhất Font, nhìn sơ thì ko bị lỗi nhưng khi click chọn cell ---> bạn nhìn thanh Function thì sẽ thấy, 1 số là font Unicode 1 số là font VNI- => khi lọc sẽ ko ra kết quả chính xác. (cột đó với ô G5 phải thống nhất 1 font với nhau)
 
Lần chỉnh sửa cuối:
Upvote 0
1/ Chào phucbugis
Cám ơn bạn, mình đã phát hiện ra chổ sai của Font rồi. Code chạy tốt.

2/ Chào
ndu96081631
Mình xoá nội dung trong cột Nguyện vọng 1 thế là code bị lỗi chổ ".List() = UniqueList(aSrc)" ?
theo mình yêu cầu như thế này nhé:
- Nếu ComboBox rỗng tức là Nguyện vọng 1 (Cột I) không có dữ liệu thì toàn bộ danh sách hiện bình thường, không có sự kiện (Event) xảy ra. (Nếu không nó sẽ báo lỗi).
- Nếu ComboBox không rỗng tức là Nguyện vọng 1 (Cột I) có dữ liệu, khi Click thì sự kiện AutoFilter diễn ra.
 
Upvote 0
Xin chào cộng đồng Giaiphapexcel
tôi làm một danh sách tuyển sinh vào lớp 10, tôi không sử dụng lệnh AutoFiter có sẵn, muốn lập trình VBA. Khi dữ liệu trong ô G5 thay đổi nhờ Data Validation hoặc ComboBox với LítFillRange W8:W15, thì sẽ lọc cột I. Nếu G5 trống thì không lọc. tuy nhiên VBA cứ báo lỗi chỗ ".AutoFilter 9, [G5]". Xin mọi người giúp với.
code:
Private Sub ComboBox1_Change() Application.ScreenUpdating = False
Set chuan = Sheets("Tuyen10THPT").Range(A11: A109)
With Sheets("Tuyen10THPT")
If [G5] <> vbNullString Then
With chuan.Resize(, 9)
.AutoFilter 9, [G5]
End With
End If
Sheets("Tuyen10THPT").AutoFilterMode = False
End With
Application.ScreenUpdating = True
End Sub
Theo mình thì xóa cái combobox kia đi, chỉ cần G5 thôi là được rồi, dùng sự kiện change trong cell này để lọc
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$G$5" Then Exit Sub
Application.ScreenUpdating = False
With Sheets("Tuyen10THPT").Range("A10:I109")
   If Target <> "" Then .AutoFilter 9, Target Else .AutoFilter
End With
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0


2/ Chào bác
ndu96081631
Code của bác hay quá, nhưng sao nó dài quá,


Thật ra bạn cũng không cần phải hiểu hết toàn bộ, biết áp dụng là được
Code của tôi phân thành 3 đoạn:
1> Hàm UniqueList để lấy danh sách duy nhất ----> Áp dụng vào bài của bạn, nó sẽ lấy danh sách duy nhất ở cột I cho vào ComboBox (tránh bị trùng)
2> Private Sub ComboBox1_DropButtonClick: Code sự kiện này hoạt động khi bạn bấm vào mũi tên xổ xuống của ComboBox. Mục đích là để nạp list.
Bạn có thắc mắc rằng: Bạn vô hiệu hóa Sub này thì mọi chuyện vẫn bình thường? Bởi vì list đã được nạp 1 lần rồi thì sẽ không cần nữa. Nó sẽ thật sự cần khi bạn thay đổi gì đó trên dữ liệu cột I rồi bấm vào ComboBox, khi ấy bạn sẽ thấy có tác dụng (để cập nhật danh sách)
3> Private Sub ComboBox1_Click: Code hoạt động khi bạn chọn vào 1 Item trong ComboBox
 
Upvote 0
Bác ndu96081631
Ta phải thêm điều kiện để khi Cột I bị xoá hết dữ liệu thì nó đừng báo lỗi, chứ không thì nó la làng, nổi lên màu vàng ghê quá ?
 
Upvote 0
Bác ndu96081631
Ta phải thêm điều kiện để khi Cột I bị xoá hết dữ liệu thì nó đừng báo lỗi, chứ không thì nó la làng, nổi lên màu vàng ghê quá ?

Thử suy nghĩ xem. Tôi đề xuất thế này:
Mã:
Private Sub ComboBox1_DropButtonClick()
  Dim aSrc
  aSrc = Worksheets("Tuyen10THPT").Range("I11:I109").Value
  [COLOR=#ff0000]aSrc = UniqueList(aSrc)[/COLOR]
  With ComboBox1
    .ListFillRange = ""
    .LinkedCell = ""
    [COLOR=#ff0000]If IsArray(aSrc) then .List() = aSrc[/COLOR]
  End With
End Sub
Thiếu chi cách.
Cách "bùn" nhất trong trường hợp giải quyết tình thế là: On Error Resume Next, sao không thử?
 
Upvote 0
Trong bài này, tại combobox muốn hiển thị tất cả thì thêm code thế nào để khi click "All" hay dòng rổng sẽ hiển thị tất cả các record?
 
Upvote 0

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

Back
Top Bottom