Phamanh1998
Thành viên thường trực
- Tham gia
- 12/6/20
- Bài viết
- 267
- Được thích
- 41
- Giới tính
- Nữ
Dạ vâng, Để em chép tay vào File exel em đang làm ạ. Em cảm ơn anh nhiều
Anh ơi cho em hỏi phần mềm viết code này là phần mềm nào vậy Anh?
Cái này bữa em tìm hiểu bật terminal cho nó mà tìm mãi mới ra. Em thấy cái VScode thì nó có sẵn luônLà Sublime Text
Bạn dùng code này thế nào, chưa thấy phản hồi nhỉ?Dạ vâng, Để em chép tay vào File exel em đang làm ạ. Em cảm ơn anh nhiều
Bạn có thể tham khảo Hàm UDF được viết bằng VBA dưới đâyEm chào anh/chị.
Em hiện nay có cái phiếu ghi nhận năng suất như theo file đính kèm. Anh chị có thể cho em xin Code VBA để tự ẩn những dòng không có dữ liệu ạ. Em cảm ơn anh chị
Vị trí | Tham số | Kiểu | Chức năng |
1 | Target | Vùng đối tượng | Nhập mảng đối tượng cần xét |
2 | WrapText | Có/Không | Tự động Wraptext |
3 | Show | Có/Không | Hiện lại |
4 | Title | Chuỗi | Tiêu đề đặt cho giá trị trả về của ô nhập (Không cần thiết) |
' _,
' ___ _ _ _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long
Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If
#If Win64 Then
Private gTimerID As LongPtr
#Else
Private gTimerID As Long
#End If
Private Args(), WorkIndex As Integer
Function S_AutoHide( _
Optional ByVal Target As Range, _
Optional ByVal WrapText As Boolean = False, _
Optional ByVal Show As Boolean = False, _
Optional ByVal Title$ = vbNullChar) As Variant
On Error Resume Next
Dim k As Integer, r, Formula$
Set r = Application.Caller
Formula = r(1, 1).Formula
If Title <> vbNullChar Then
S_AutoHide = Title & ": [" & Target.Address(0, 0) & "]"
Else
S_AutoHide = Mid(Formula, 2)
End If
k = UBound(Args)
ReDim Preserve Args(1 To k + 1)
Args(k + 1) = VBA.Array(0, Formula, r, Target, WrapText, Show)
If gTimerID = 0 Then
gTimerID = SetTimer(0&, 0&, 1, AddressOf S_AutoHide_callback)
End If
End Function
Private Sub S_AutoHide_callback()
On Error Resume Next
Call KillTimer(0&, gTimerID): gTimerID = 0
S_AutoHide_working
On Error GoTo 0
End Sub
Private Sub S_AutoHide_working()
On Error Resume Next
Dim UA%, s$
UA = UBound(Args)
If UA > 0 Then
WorkIndex = WorkIndex + 1
Dim A: A = Args(WorkIndex)
If A(0) <> 0 Or A(2).Formula <> A(1) Then
GoTo N
End If
A(0) = 1
'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//
Dim R1 As Range, R2 As Range, R3 As Range
Set R1 = A(3)
Dim RNGs As Range, i As Long, IsUp As Boolean
Dim LR&, LC%
LC = R1.Columns.Count
If A(5) Then
R1.Parent.UsedRange.EntireRow.Hidden = False
Else
'LR = R1.Find("*", After:=R1(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row - R1.Row + 1
LR = R1.Rows.Count
If LR > 0 Then
For i = 1 To LR
Set R2 = R1(i, 1).Resize(1, LC)
Set R3 = R2.Find(What:="*", After:=R2(1, LC), LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
If R3 Is Nothing Then
If RNGs Is Nothing Then
Set RNGs = R2
Else
Set RNGs = Application.Union(RNGs, R2)
End If
End If
Next i
IsUp = Application.ScreenUpdating
If Application.ScreenUpdating Then
Application.ScreenUpdating = False
End If
With R1
.EntireRow.Hidden = False
If A(4) Then
.WrapText = False
.WrapText = True
End If
End With
If Not RNGs Is Nothing Then
RNGs.EntireRow.Hidden = True
End If
If Application.ScreenUpdating <> IsUp Then
Application.ScreenUpdating = IsUp
End If
End If
End If
Set R1 = Nothing
Set R2 = Nothing
Set R3 = Nothing
Set RNGs = Nothing
'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//
N:
If WorkIndex >= UA Then
Erase Args: WorkIndex = 0
Else
gTimerID = SetTimer(0&, 0&, 1, AddressOf S_AutoHide_callback)
End If
End If
On Error GoTo 0
End Sub
Dạ, em đánh code vào file trên chạy tốt rồi anh ạ. Em cảm ơn anh chị rất nhiều ạBạn dùng code này thế nào, chưa thấy phản hồi nhỉ?
Hàm có tác dụng khi dữ liệu không phải là dữ liệu động ... Khi dữ liệu được tìm kiếm bằng hàm vlookup thì code không tự động ẩn hiện được.. Có cách nào khi dùng hàm để ẩn hiện tự động các dòng khi là dữ liệu động không ạBạn có thể tham khảo Hàm UDF được viết bằng VBA dưới đây
TỰ ĐỘNG ẨN DÒNG TRỐNG HIỆN DÒNG CÓ CHỨA GIÁ TRỊ
với Hàm S_AutoHide
Hướng dẫn sử dụng hàm:
Hàm có 4 tham số :
Vị trí Tham số Kiểu Chức năng 1Target Vùng đối tượng Nhập mảng đối tượng cần xét 2WrapText Có/Không Tự động Wraptext 3Show Có/Không Hiện lại 4Title Chuỗi Tiêu đề đặt cho giá trị trả về của ô nhập (Không cần thiết)
Ví dụ cách viết hàm:
=S_AutoHide(A1:F10000,TRUE, False, "Tự động Ẩn/Hiện")
Sao chép mã bên dưới vào một Module mới, và gõ hàm
Lưu ý: Mã chỉ hoạt động trên hệ điều hành Window
----------------------------
JavaScript:' _, ' ___ _ _ _ ___(_) '/ __| / \ | \| | _ | | '\__ \/ \ \| \\ | _ \ | '|___/_/ \_|_|\_|___/_| ' Option Explicit #If VBA7 Then Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long #Else Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long #End If #If Win64 Then Private gTimerID As LongPtr #Else Private gTimerID As Long #End If Private Args(), WorkIndex As Integer Function S_AutoHide( _ Optional ByVal Target As Range, _ Optional ByVal WrapText As Boolean = False, _ Optional ByVal Show As Boolean = False, _ Optional ByVal Title$ = vbNullChar) As Variant On Error Resume Next Dim k As Integer, r, Formula$ Set r = Application.Caller Formula = r(1, 1).Formula If Title <> vbNullChar Then S_AutoHide = Title & ": [" & Target.Address(0, 0) & "]" Else S_AutoHide = Mid(Formula, 2) End If k = UBound(Args) ReDim Preserve Args(1 To k + 1) Args(k + 1) = VBA.Array(0, Formula, r, Target, WrapText, Show) If gTimerID = 0 Then gTimerID = SetTimer(0&, 0&, 1, AddressOf S_AutoHide_callback) End If End Function Private Sub S_AutoHide_callback() On Error Resume Next Call KillTimer(0&, gTimerID): gTimerID = 0 S_AutoHide_working On Error GoTo 0 End Sub Private Sub S_AutoHide_working() On Error Resume Next Dim UA%, s$ UA = UBound(Args) If UA > 0 Then WorkIndex = WorkIndex + 1 Dim A: A = Args(WorkIndex) If A(0) <> 0 Or A(2).Formula <> A(1) Then GoTo N End If A(0) = 1 '//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'// Dim R1 As Range, R2 As Range, R3 As Range Set R1 = A(3) Dim RNGs As Range, i As Long, IsUp As Boolean Dim LR&, LC% LC = R1.Columns.Count If A(5) Then R1.Parent.UsedRange.EntireRow.Hidden = False Else 'LR = R1.Find("*", After:=R1(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row - R1.Row + 1 LR = R1.Rows.Count If LR > 0 Then For i = 1 To LR Set R2 = R1(i, 1).Resize(1, LC) Set R3 = R2.Find(What:="*", After:=R2(1, LC), LookIn:=xlValues, LookAt:= _ xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) If R3 Is Nothing Then If RNGs Is Nothing Then Set RNGs = R2 Else Set RNGs = Application.Union(RNGs, R2) End If End If Next i IsUp = Application.ScreenUpdating If Application.ScreenUpdating Then Application.ScreenUpdating = False End If With R1 .EntireRow.Hidden = False If A(4) Then .WrapText = False .WrapText = True End If End With If Not RNGs Is Nothing Then RNGs.EntireRow.Hidden = True End If If Application.ScreenUpdating <> IsUp Then Application.ScreenUpdating = IsUp End If End If End If Set R1 = Nothing Set R2 = Nothing Set R3 = Nothing Set RNGs = Nothing '//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'//'// N: If WorkIndex >= UA Then Erase Args: WorkIndex = 0 Else gTimerID = SetTimer(0&, 0&, 1, AddressOf S_AutoHide_callback) End If End If On Error GoTo 0 End Sub
Bạn sửa xlPart thành xlWhole thử xem saoHàm có tác dụng khi dữ liệu không phải là dữ liệu động ... Khi dữ liệu được tìm kiếm bằng hàm vlookup thì code không tự động ẩn hiện được.. Có cách nào khi dùng hàm để ẩn hiện tự động các dòng khi là dữ liệu động không ạ