Tự động ẩn hiện dòng (1 người xem)

Liên hệ QC

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

THANHNGUYEN24101994@GMAIL

Thành viên mới
Tham gia
9/9/20
Bài viết
3
Được thích
0
Có anh chị nào biết cách làm tự động ẩn hàng khi hàng đó không có giá trị và tự động hiện ra khi hàng đó có giá trị không ạ! giúp em với. Em cảm ơn ạ
 
Có anh chị nào biết cách làm tự động ẩn hàng khi hàng đó không có giá trị và tự động hiện ra khi hàng đó có giá trị không ạ! giúp em với. Em cảm ơn ạ
Cũng được nhưng nó thuộc phạm vi lập trình, hàm công thức thì không dùng được rồi bạn
Bạn đăng bài mới bên box lập trình kèm file sẽ có người giúp đỡ
 
Tự động ẩn khi không có giá trị thì được rồi. Nhưng tự động hiện khi có giá trị thì đã thấy ai làm chưa hay chỉ tưởng tượng ra? Côt/hàng ẩn thì ghi giá trị cách nào?
 
Tự động ẩn khi không có giá trị thì được rồi. Nhưng tự động hiện khi có giá trị thì đã thấy ai làm chưa hay chỉ tưởng tượng ra? Côt/hàng ẩn thì ghi giá trị cách nào?

Cái này em có nghĩ qua chưa làm,cũng định bảo nhưng lại nghĩ nếu như ô ẩn đó là công thức và chọn giá trị bằng 0 thì ẩn còn khác không thì hiện.Nếu chủ thớt yêu cầu là rỗng thật thì ẩn rồi khó ghi dữ liệu để hiện trừ khi dùng VBA hay gì đó không phải điền tay
 
Cái này em có nghĩ qua chưa làm,cũng định bảo nhưng lại nghĩ nếu như ô ẩn đó là công thức và chọn giá trị bằng 0 thì ẩn còn khác không thì hiện.Nếu chủ thớt yêu cầu là rỗng thật thì ẩn rồi khó ghi dữ liệu để hiện trừ khi dùng VBA hay gì đó không phải điền tay
Cái này thì phải dùng VBA rồi. Bạn thì trọng Lập trình với VBA, khoảng tháng 8 vừa rồi bạn "batman1" có cho tôi một code để ẩn và hiện hàng rất hiệu quả.
Trước tiên chúng ta cần có một cột ghi giá trị hàng cần ẩn với một giá trị nào đó, chẳng hạn 0 để khi thấy 0 thì sẽ ẩn hàng còn khi không có 0 thì không ẩn hàng hoặc hiện ra. Đưa đoạn code vào và cho Private Sub, thì khi bạn mở sheet đó thì nó sẽ hiện ra các hàng mà bạn muốn hiện còn hàng nào bạn không muốn hiện (có giá trị 0) thì ân định. Bạn cũng có thể set một control box để mở hay hiện hàng có giá trị 0 ngay trong sheet.
 
Cái này thì phải dùng VBA rồi. Bạn thì trọng Lập trình với VBA, khoảng tháng 8 vừa rồi bạn "batman1" có cho tôi một code để ẩn và hiện hàng rất hiệu quả.
Trước tiên chúng ta cần có một cột ghi giá trị hàng cần ẩn với một giá trị nào đó, chẳng hạn 0 để khi thấy 0 thì sẽ ẩn hàng còn khi không có 0 thì không ẩn hàng hoặc hiện ra. Đưa đoạn code vào và cho Private Sub, thì khi bạn mở sheet đó thì nó sẽ hiện ra các hàng mà bạn muốn hiện còn hàng nào bạn không muốn hiện (có giá trị 0) thì ân định. Bạn cũng có thể set một control box để mở hay hiện hàng có giá trị 0 ngay trong sheet.
à . đó là tôi đang nêu các khả năng có thể xảy ra theo ý tưởng của thớt và đó là logic nếu có viết code,và tôi chưa thử các khả năng mà tôi đã nêu ra ở bài trên nên tôi viết là chưa có làm qua ( tức chưa viết ra code) vì chưa hiểu rõ ý định chủ thớt chứ đó không phải là nhu cầu của tôi.và tất nhiên là dùng vba để tự động hóa rồi.nhưng vấn đề tôi đang nêu là nếu cái ô mà bạn muốn ẩn đó không có công thức hay link giá trị gì đó,hoặc không dùng vba để điền giá trị tự động. khi thỏa mãn điều kiện ẩn thì nó ẩn đi đúng không?và bạn không thể nhập giá trị vào ô đó bằng tay vì ô đó đã ẩn
 
à . đó là tôi đang nêu các khả năng có thể xảy ra theo ý tưởng của thớt và đó là logic nếu có viết code,và tôi chưa thử các khả năng mà tôi đã nêu ra ở bài trên nên tôi viết là chưa có làm qua ( tức chưa viết ra code) vì chưa hiểu rõ ý định chủ thớt chứ đó không phải là nhu cầu của tôi.và tất nhiên là dùng vba để tự động hóa rồi.nhưng vấn đề tôi đang nêu là nếu cái ô mà bạn muốn ẩn đó không có công thức hay link giá trị gì đó,hoặc không dùng vba để điền giá trị tự động. khi thỏa mãn điều kiện ẩn thì nó ẩn đi đúng không?và bạn không thể nhập giá trị vào ô đó bằng tay vì ô đó đã ẩn
Chắc không ai nghĩ việc phải nhập bằng tay vào 1 ô trong hàng/cột đã ẩn, nhưng với VBA thì có thể. Trong trường hợp đó, việc cần hiện lại dòng/cột đã ẩn là 1 nhu cầu chính đáng.
 

@THANHNGUYEN24101994@GMAIL

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
 
Lần chỉnh sửa cuối:
Chắc không ai nghĩ việc phải nhập bằng tay vào 1 ô trong hàng/cột đã ẩn, nhưng với VBA thì có thể. Trong trường hợp đó, việc cần hiện lại dòng/cột đã ẩn là 1 nhu cầu chính đáng.
thế đã đọc hết những bài mà tôi đã viết chưa?Nếu không hiểu đoạn nào tôi có thể giải thích lại cho,và trong những bài tôi viết chưa có bài nào nói về nhu cầu chính đáng hay không chính đáng,tôi đang phân tích trường hợp vết code và theo nhu cầu của chủ thót chứ không phải theo nhu cầu của tôi,vì đây là bài mà chủ thớt yêu cầu?đoạn nào không hiểu thì tôi giả thích lại cho hiểu ý
nếu như ô ẩn đó là công thức và chọn giá trị bằng 0 thì ẩn còn khác không thì hiện.Nếu chủ thớt yêu cầu là rỗng thật thì ẩn rồi khó ghi dữ liệu để hiện trừ khi dùng VBA hay gì đó không phải điền tay
à . đó là tôi đang nêu các khả năng có thể xảy ra theo ý tưởng của thớt và đó là logic nếu có viết code,và tôi chưa thử các khả năng mà tôi đã nêu ra ở bài trên nên tôi viết là chưa có làm qua ( tức chưa viết ra code) vì chưa hiểu rõ ý định chủ thớt chứ đó không phải là nhu cầu của tôi.và tất nhiên là dùng vba để tự động hóa rồi.nhưng vấn đề tôi đang nêu là nếu cái ô mà bạn muốn ẩn đó không có công thức hay link giá trị gì đó,hoặc không dùng vba để điền giá trị tự động. khi thỏa mãn điều kiện ẩn thì nó ẩn đi đúng không?và bạn không thể nhập giá trị vào ô đó bằng tay vì ô đó đã ẩn
Bài đã được tự động gộp:

cả bài của tôi và bài bác vetmini điều viết nhằm dự phòng trường hợp mà tác giả chỉ nghĩ mà chưa lường hết các trường hợp có thể xảy ra,và bải #1 chủ thớt cũng không có nêu rõ dữ liệu như thế nào và những trường hợp mà chúng tôi nêu đều có thể xảy ra.trên diễn đàn này không thiếu những bài lên hỏi mà không lường hết trường hợp xảy ra,chứ tôi chưa nhắc gì nhu cầu chính đáng hay không!
 
thế đã đọc hết những bài mà tôi đã viết chưa?Nếu không hiểu đoạn nào tôi có thể giải thích lại cho,và trong những bài tôi viết chưa có bài nào nói về nhu cầu chính đáng hay không chính đáng,tôi đang phân tích trường hợp vết code và theo nhu cầu của chủ thót chứ không phải theo nhu cầu của tôi,vì đây là bài mà chủ thớt yêu cầu?đoạn nào không hiểu thì tôi giả thích lại cho hiểu ý
Gì căng thế? Chỉ nói cái cụm từ chữ đậm của bạn thôi. Ai cũng biết là ẩn rồi thì nhập bằng tay thế nào được. Đoán là chủ thớt nghĩ dòng ẩn có công thức. Khi công thức có giá trị <> 0 hoặc <> "" thì hiện. Vậy thôi.
 
Gì căng thế? Chỉ nói cái cụm từ chữ đậm của bạn thôi. Ai cũng biết là ẩn rồi thì nhập bằng tay thế nào được. Đoán là chủ thớt nghĩ dòng ẩn có công thức. Khi công thức có giá trị <> 0 hoặc <> "" thì hiện. Vậy thôi.
căng đâu,tôi đang giải thích cho nhưng gì mình viết,và thấy những gì mình viết khác với phần kết luận của bạn.vì tôi có nếu mấy trường hợp có thể thay đổi giá trị ô đang ẩn và có nhắc đến vba chứ không hề nói là vba không thể,và chỉ là nếu trường hợp xảy ra chứ không nói nhu cầu chính đáng không,dòng đậm đó nó có liên quan đến cả bài viết
 
Tôi thấy code bạn HeSanbi viết ẩn hiện rows rất nhanh.
Cái bất tiện là phải viết hàm lại TRUE hay FALSE để nó ẩn hay hiện hàng.
Bạn có thể viết lại để kích hoạt code bằng command button giúp được không,
khi click command button thì kích hoạt code này để ẩn hàng thay vì gõ hàm như bạn đề nghị?
Rất cám ơn bạn.
 
Tôi thấy code bạn HeSanbi viết ẩn hiện rows rất nhanh.
Cái bất tiện là phải viết hàm lại TRUE hay FALSE để nó ẩn hay hiện hàng.
Bạn có thể viết lại để kích hoạt code bằng command button giúp được không,
khi click command button thì kích hoạt code này để ẩn hàng thay vì gõ hàm như bạn đề nghị?
Rất cám ơn bạn.
Không đúng bác nhé:
Tham số Show nhận Đối số là True sẽ hiện lại toàn bộ dòng đã ẩn và hủy nhiệm vụ ẩn hiện dòng.
Chức năng này là để không phải dùng tay hiện lại tất cả các dòng đã ẩn khi không còn mục đích ẩn dòng nữa.

Nếu False thì vẫn thực hiện ẩn hiện dòng.


Nếu viết một hàm duy nhất như vậy mà bất tiện thì bác viết gọn:
=S_AutoHide(A1:F10000)
Các đối số còn lại không cần nhập
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom