Duong gia
Thành viên thường trực




- Tham gia
- 15/1/07
- Bài viết
- 352
- Được thích
- 118





làm thế nào để tạo biểu tượng ô nổi trên nền file excel, ví dụ ô "lọc", "không lọc" trong fileAutofilter + VBA.xls
Private Sub CommandButton1_Click() If CommandButton1.Caption = "Loc" Then CommandButton1.Caption = "Khong Loc" Else CommandButton1.Caption = "Loc" End If End Sub
Kéo fill công thức đến A28A10 =IF(SUM(D10:I10)>0,MAX($A$9:A9)+1,"")
Sub Cmd_Click()
DK = Cmd.Caption = "Loc"
Range("A10:A28").SpecialCells(3, 22).EntireRow.Hidden = DK
Cmd.Caption = Choose(-1 * DK + 1, "Loc", "Khong Loc")
End Sub



Em chưa hiểu tham số của SpecialCells(3, 22). Anh có thể giải thích giúp em được không ạ? Em cảm ơn!Với bài toán trên sao ta không tận dụng cột STT làm điều kiện lọc nhỉ? Cần gì AutoFilter? Cần gì cột phụ L?
Tôi sẽ làm như sau:
1> Đặt công thức tại A10:
Kéo fill công thức đến A28
2> Tạo 1 code duy nhất để Hide và Unhide
Xem filePHP:Sub Cmd_Click() DK = Cmd.Caption = "Loc" Range("A10:A28").SpecialCells(3, 22).EntireRow.Hidden = DK Cmd.Caption = Choose(-1 * DK + 1, "Loc", "Khong Loc") End Sub
Em chưa hiểu tham số của SpecialCells(3, 22). Anh có thể giải thích giúp em được không ạ? Em cảm ơn!
xlCellTypeAllFormatConditions. Cells of any format
xlCellTypeAllValidation. Cells having validation criteria
xlCellTypeBlanks. Empty cells
xlCellTypeComments. Cells containing notes
xlCellTypeConstants. Cells containing constants
xlCellTypeFormulas. Cells containing formulas
xlCellTypeLastCell. The last cell in the used range
xlCellTypeSameFormatConditions. Cells having the same format
xlCellTypeSameValidation. Cells having the same validation criteria
xlCellTypeVisible. All visible cells
xlErrors :16
xlLogical : 4
xlNumbers : 1
xlTextValues : 2

Chân thành cảm ơn bác ndu96081631 em đã download file của bàc về để học hỏi. nhưng sao cái Excel trên máy của em báo lổi (em gửi kèm thông báo lỗi), mong bác và diễn đàn Excel chỉ giúp.
Với bài toán trên sao ta không tận dụng cột STT làm điều kiện lọc nhỉ? Cần gì AutoFilter? Cần gì cột phụ L?
Tôi sẽ làm như sau:
1> Đặt công thức tại A10:
Kéo fill công thức đến A28
2> Tạo 1 code duy nhất để Hide và Unhide
Xem filePHP:Sub Cmd_Click() DK = Cmd.Caption = "Loc" Range("A10:A28").SpecialCells(3, 22).EntireRow.Hidden = DK Cmd.Caption = Choose(-1 * DK + 1, "Loc", "Khong Loc") End Sub
Sub Cmd_Click()
DK = Cmd.Caption = "Loc"
With Range("$A$8:$A$28")
If DK Then .AutoFilter Field:=1, Criteria1:="<>" Else .AutoFilter
End With
Cmd.Caption = IIf(DK, "Khong Loc", "Loc")
End Sub

Viết thế này sẽ "đẹp" hơn:Đúng là mỗi Thầy có mỗi kiểu hay riêng biệt. Nếu như cách của Thầy NDU thay vì EntireRow.Hidden thì chọn AutoFilter thì muốn hide hay unhide cũng không được, vã lại, muốn định dạng hoặc kéo cho row rộng một tí thì những row bị ẩn cũng không vì thế mà thay đổi.
(Em mượn File của Thầy chút nhé! Cám ơn Thầy).
(đã bỏ thuộc tính Print Object cho nút lệnh "Lọc")PHP:Sub Cmd_Click() DK = Cmd.Caption = "Loc" With Range("$A$7:$A$28") If DK Then .AutoFilter Field:=1, Criteria1:="<>" Else .AutoFilter End With Cmd.Caption = IIf(DK, "Khong Loc", "Loc") End Sub
Sub Cmd_Click()
DK = Cmd.Caption = "Loc"
With Range("$A$8:$A$28")
If DK Then .AutoFilter 1, "<>", , , False Else .AutoFilter
End With
Cmd.Caption = IIf(DK, "Khong Loc", "Loc")
End Sub


Chẳng hiểu tại sao, khi dùng AutoFilter, mình đã đã chọn địa chỉ quá rõ ràng rồi (như $A$7:$A$28) mà cứ thấy hàng tiếp theo liền nó là nó cứ Filter!..
Sub Cmd_Click()
DK = Cmd.Caption
For i = 1 To 22
If [A6].Offset(i, ).Value = 0 And DK = "Loc" Then [A6].Offset(i, ).EntireRow.Hidden = True
If DK = "Khong Loc" Then [A6].Offset(i, ).EntireRow.Hidden = False
Next i
Cmd.Caption = IIf(DK, "Khong Loc", "Loc")
End Sub
Mình nghĩ khi dùng AutoFilter thì Excel sẽ áp dụng cho cả cột.
Với số lượng dòng ít, có địa chỉ rõ ràng và bên dưới còn dữ liệu không cần lọc thì theo mình nên dùng vòng lặpMã:Sub Cmd_Click() DK = Cmd.Caption For i = 1 To 22 If [A6].Offset(i, ).Value = 0 And DK = "Loc" Then [A6].Offset(i, ).EntireRow.Hidden = True If DK = "Khong Loc" Then [A6].Offset(i, ).EntireRow.Hidden = False Next i Cmd.Caption = IIf(DK, "Khong Loc", "Loc") End Sub
Sub Cmd2_Click()
DK = Cmd.Caption = "Loc"
Range("A10:A28").SpecialCells(3, 22).EntireRow.Hidden = DK
Cmd.Caption = Choose(-1 * DK + 1, "Loc", "Khong Loc")
End Sub

Chào anh & các bạn thành viên!Viết thế này sẽ "đẹp" hơn:
Ẩn luôn mũi tên AutoFilterPHP:Sub Cmd_Click() DK = Cmd.Caption = "Loc" With Range("$A$8:$A$28") If DK Then .AutoFilter 1, "<>", , , False Else .AutoFilter End With Cmd.Caption = IIf(DK, "Khong Loc", "Loc") End Sub
Chào anh & các bạn thành viên!
Trong bài này, nếu ta cùng lúc ẩn thêm cột ( mặc dù cột có số liệu, ví dụ cột B) thì sửa code trên như thế nào?
Xin cảm ơn!
Sub Cmd_Click()
DK = Cmd.Caption = "Loc"
With Range("$A$8:$A$28")
If DK Then
.AutoFilter 1, "<>", , , False
Range("B:B").EntireColumn.Hidden = True
Else
.AutoFilter
Range("B:B").EntireColumn.Hidden = False
End If
End With
Cmd.Caption = IIf(DK, "Khong Loc", "Loc")
End Sub

Cảm ơn bạn minhthien321 đã giúp đỡThì bạn làm như vầy đi:
PHP:Sub Cmd_Click() DK = Cmd.Caption = "Loc" With Range("$A$8:$A$28") If DK Then .AutoFilter 1, "<>", , , False Range("B:B").EntireColumn.Hidden = True Else .AutoFilter Range("B:B").EntireColumn.Hidden = False End If End With Cmd.Caption = IIf(DK, "Khong Loc", "Loc") End Sub


Cảm ơn bạn minhthien321 đã giúp đỡ
Tôi có thêm 01 vấn đề như thế này, trong 01 File có nhiều Sheet trong đó có 12 sheet là có cấu trúc tương đối đồng dạng, nếu áp dụng bài trên thì ta phải Copy code trên vào 12 Sheet và đồng thời tạo ra 12 nút "Cmd".
Bây giờ tôi muốn gom thành một đọan code để ở đâu đó và ta chỉ tạo 12 nút lệnh ở 12 sheet có được không bạn?
Xin cảm ơn

Chào bạn thanhlanh!Muốn sử dụng chung code bạn nên để sub trong module
Tạo một Button từ menu Forms của Excel ---> chuột phải vào Button gán vào Sub trên ---> Copy button vào các sheet khác.
Xem ví dụ:
Chào bạn thanhlanh!
Cách hướng dẫn của bạn nó báo lỗi Run-time error '424' Object required
Tôi gởi File nhờ bạn xem lại! cảm ơn.
Sub LocDieuKien()
With Application
.ScreenUpdating = False: .EnableEvents = False: .Calculation = 3
ActiveSheet.Shapes("MinhThien321").Select
On Error Resume Next
If Selection.Characters.Text = "Loc" Then
Selection.Characters.Text = "Khong Loc"
ActiveSheet.Range("$A$5:$A$28").AutoFilter 1, "<>", , , False
ActiveSheet.Range("C:C").EntireColumn.Hidden = True
Else
Selection.Characters.Text = "Loc"
ActiveSheet.Range("A1").AutoFilter
ActiveSheet.Range("C:C").EntireColumn.Hidden = False
End If
ActiveSheet.Range("A1").Select
.Calculation = 1: .EnableEvents = True: .ScreenUpdating = True
End With
End Sub

Gởi bạn minhthien321!Bạn xóa cái nút đó đi, và thay vào nút của Control Toolbox đó, sau đó đổi tên trong thuộc tính của nó là cmd
Gởi bạn minhthien321!
Trước đó mình đã thử cách này rồi: Vào Control Toolbox --> chọn Command Button, vẽ nó, rồi vào Properties, thay đổi (Name) thành cmd, nhưng nó vẫn điếc! (Code để trong Module)

Hic! Bạn chơi ĐỘC QUYỀN nha!Nếu bạn vẫn giữ nút lệnh đó, thì bạn phải sửa tên thành tên nào đó, trong trường hợp của file tôi gửi lên nút có tên là MinhThien321 và code chạy như sau:
Hic! Bạn chơi ĐỘC QUYỀN nha!
Tôi vẽ một Button ở Sheet mới, chọn nó rồi vào Name đặt tên là minhthien321, vào Assign Macro gán tên Sub vào là Ok!
Chúc bạn một ngày làm việc vui vẻ! Xin cảm ơn
Cứ mỗi lần nhấn lại cộng 1 đơn vị, cái này có vẻ hơi "uổng", đó là chưa kể việc đóng rồi mở file sẽ làm code hoạt động không đúng. Mình cũng có thể vẽ 1 Checkbox (Checkbox1) và cho nó ẩn đi (đặt thuộc tính Visible=False), và thêm 1 câu lệnh ở đầu sub: Checkbox1=Not(Checkbox1), sau đó kiểm tra tình trạng của Checkbox1 và quyết định chạy code ra sao.Tôi nghĩ có thể dùng 1 biến public sau đó gắn thủ tục nếu click thì biến đó cộng 1
Khi thực hiện sub thì kiểm tra xem biến đó là chẵn hay lẻ, rồi thực hiện code theo điều kiện biến
Cách khác: sử dụng ToggleButton thì dễ hơn
(sao phải nháy đúp, nháy 1 lần không được hả bạn)
Vậy thì bạn sử dụng code có dạng như sau cho sheet cần áp dụng:Xin lỗi đã trình bày chưa hết ý,ý của mình là ko dùng nút bấm gì cả, và thay vào đó là dùng nhắp đúp chuột trái vào bảng tính..
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
"Đoạn code cần đưa vào"
End Sub
Thôi như vầy cho nhanh (cho cả bạn và những người sẽ giúp đỡ bạn), bây giờ bạn gửi 1 file mẫu lên, nêu rõ trong đó cần làm những gì. Mình tin rằng sẽ có câu trả lời phù hợp nhất cho bạn.Minh cũng hay dùng code trên để bảo vệ bảng tính,nên muốn kết hợp với đoạn code ẩn dòng trống vào luôn (một công đôi việc)nhưng lại ko biết phải sửa lại đoạn code ẩn dòng trống lại như thế nào(vì đoạn code ẩn dòng trống được viết cho dùng nút lệnh).nhờ các bạn giúp sửa lại.cảm ơn.
Viết thế này sẽ "đẹp" hơn:
Ẩn luôn mũi tên AutoFilterPHP:Sub Cmd_Click() DK = Cmd.Caption = "Loc" With Range("$A$8:$A$28") If DK Then .AutoFilter 1, "<>", , , False Else .AutoFilter End With Cmd.Caption = IIf(DK, "Khong Loc", "Loc") End Sub
bạn ndu ơi,ko biết đoạn code ẩn nút filter là đoạn nào,có thể đưa thêm vào file của mình đã up ở bài trên được ko?

Ở đây có một đống bài giải, bạn không nói rõ muốn ứng dụng bài nào thì ai biết " Cái này em muốn ..." để hướng dẫn cho bạn!Cái này em muốn ...

