Nhờ các thầy chuyển giúp từ Worksheet_Change sang CommandButton_Click()

Liên hệ QC

ninhtom1

Thành viên hoạt động
Tham gia
26/8/10
Bài viết
106
Được thích
4
Trong file của em sự kiện Worksheets_Change đã lấy được số liệu khi em thay đổi ở cột B. Giờ em muốn gán nó vào sự kiện CommandButton_Click() trong nút lệnh Lọc Dữ Liệu. Nhờ các thầy xem giúp em với. Cả nút Lọc nữa cũng báo lỗi mà em không biết chỉnh thế nào cả. Cảm ơn các thầy.
 
Bạn gán code này vào cmd
PHP:
Private Sub Cmd_Click()

If Cmd.Caption = "Khong loc" Then    
     [$A$5:$j$2000].AutoFilter    
     Cmd.Caption = "Loc"
Else    
     [$A$5:$j$2000].AutoFilter Field:=1, Criteria1:="<>"    
     Cmd.Caption = "Khong loc"

End If
End Sub
 
Upvote 0
Trong file của em sự kiện Worksheets_Change đã lấy được số liệu khi em thay đổi ở cột B. Giờ em muốn gán nó vào sự kiện CommandButton_Click() trong nút lệnh Lọc Dữ Liệu. Nhờ các thầy xem giúp em với. Cả nút Lọc nữa cũng báo lỗi mà em không biết chỉnh thế nào cả. Cảm ơn các thầy.

Bạn mở code trong nút lọc dữ liệu ra, xoa hết và copy dán đoạn code này váo coi sao

Option Explicit
Private Sub Cmd_Click()
Dim Cll, MaPt
Dim DK
Dim Target As Range
On Error Resume Next
With Application
.ScreenUpdating = False
.Calculation = 3
End With

DK = Cmd.Caption = "Loc"
With Range("$A$5:$j$2000")
If DK Then .AutoFilter Field:=1, Criteria1:="<>" Else .AutoFilter
End With
Cmd.Caption = IIf(DK, "Khong Loc", "Loc")

If Not Intersect(Target, Range("b7:b10000")) Is Nothing Then
Set MaPt = Sheets("CDNXT").Range(Sheets("CDNXT").[b7], Sheets("CDNXT").[b50000].End(xlUp))
For Each Cll In MaPt
If Target.Count > 1 Then
Target = ""
Exit Sub
End If
If Cll <> "" Then
If Cll = Target Then
With Target
.Offset(, 1) = Cll.Offset(, 1)
.Offset(, 2) = Cll.Offset(, 2)
.Offset(, 3) = Cll.Offset(, 3)
.Offset(, 4) = Cll.Offset(, 4)
.Offset(, 5) = Cll.Offset(, 5)
.Offset(, 6) = Cll.Offset(, 6)
.Offset(, 7) = Cll.Offset(, 7)
.Offset(, 8) = Cll.Offset(, 8)
.Offset(, 23) = Cll.Offset(, 9)
.Offset(, 24) = Cll.Offset(, 10)
' .Offset(, 3) = .Offset(, 1) * .Offset(, 2)
' .Offset(, 5) = Cll.Offset(, 11)
' .Offset(, 6) = .Offset(, 5) - .Offset(, 5) * 10 / 100
End With
Range([b7], [b10000].End(xlUp)).Offset(, -1) = [row(A:A)]
End If
End If
Next Cll
End If
With Application
.ScreenUpdating = 1
.Calculation = 1
End With
End Sub
 
Upvote 0
Code nút lọc:
Biến DK chưa khai báo, lỗi nó hiện lên rành rành như thế rồi. Chỉ cần thêm Dim DK As Boolean

Code nút cập nhật:

QuangHai: đã test code của mình chưa?
- Sao lại gộp code Filter và cập nhật thành 1 sub?
- Khai báo biến Target nhưng không gán giá trị cho nó, câu If Not Intersect(Target, Range("b7:b10000")) Is Nothing luôn luôn False, code không chạy dòng nào.

Ninh Tôm:
Bạn phải nói rõ bạn muốn gì, vì sự kiện Worksheets_Change căn cứ vào sự thay đổi của target, và theo code, chỉ cập nhật cho 1 dòng của target thôi. Ngoài ra khi chuyển code sang Button_Click, thì biết Target là cái gì mà chuyển?

Nếu muốn cập nhật cho cả 1 bảng từ 1 bảng trắng hoặc xoá đi làm lại, thì phải viết lại hầu như toàn bộ. Vì thuật toán đó nếu áp dụng lần lượt từng ô sẽ rất chậm
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn các anh chị chỉ bảo, vì em cũng mới tập vba nên cũng chỉ biết copy code trên diễn đàn về áp dụng, nên chưa nắm rõ được. Trong bài của em khi em copy hết mã vật tư vào cột B sau đó bấm nút Lấy dữ liệu thì sẽ lấy được tên vật tư, đơn vị tính, tồn đầu kỳ, nhập trong kỳ, xuất trong kỳ bên Sheet "CDNXT".(Nếu bác nào giúp được em cái vụ lọc vật tư xuất cho các phân xưởng KT1, KT2, KT3,... từ bên Sheets "Xuat" nữa thì tốt quá vì em đỡ phải dùng hàm Sumproduct). Sau đó bấm nút Loc sẽ ẩn đi những hàng nào rỗng. Em xin cảm ơn
 
Upvote 0
Web KT

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

Back
Top Bottom