Code VBA ẩn dòng trống

Liên hệ QC

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ữ
Em 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ị
 

File đính kèm

  • Phiếu năng suất.xlsx
    11.9 KB · Đọc: 31
???
Mã:
Sub Hide_rows()
With Sheets("BC").Range("A5").CurrentRegion.Offset(3)
    .AutoFilter 2, "<>"
End With
End Sub
 
Upvote 0
Em 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ị
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ểuChức năng
1​
TargetVùng đối tượngNhập mảng đối tượng cần xét
2​
WrapTextCó/KhôngTự động Wraptext
3​
ShowCó/KhôngHiện lại
4​
TitleChuỗiTiê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
 
Upvote 0
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ểuChức năng
1​
TargetVùng đối tượngNhập mảng đối tượng cần xét
2​
WrapTextCó/KhôngTự động Wraptext
3​
ShowCó/KhôngHiện lại
4​
TitleChuỗiTiê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
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 ạ
 
Upvote 0
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 sửa xlPart thành xlWhole thử xem sao
 
Upvote 0
Web KT

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

Back
Top Bottom