VBA tự động thay đổi tham chiếu vùng (range và cell) khi insert dòng cột trong sheet tính toán (3 người xem)

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

  • Tôi tuân thủ nội quy khi đăng bài

    eagle12

    Thành viên mới
    Tham gia
    18/12/13
    Bài viết
    25
    Được thích
    5
    Chào các bác

    Em có 1 code VBA lọc dữ liệu theo điều kiện như sau, hiện đang được gắn vào vùng data từ "A5:Jxxx" tại sheet "Pv"

    Xin nhờ mọi người có cách nào VBA nhận được tùy biến khi vùng giá trị bảng lọc ban đầu "A5:Jxxx" nó thay đổi khi em chèn thêm cột hoặc xóa bớt dòng không ạ
    Em ví dụ việc thay đổi vùng range như dưới:
    1-Trong TH nếu phải chèn thêm 1 số cột đằng trước cột A ---> vd sheet Pv2: chèn thêm 3 cột thì vùng dữ liệu lọc sẽ thành "D5:Mxxx"
    2-Hoặc em chèn 3 cột trong vùng data ban đầu ---> vd sheet Pv3: chèn 3 cột C,D,F thì vùng dữ liệu lọc sẽ thành "A5:Mxxx"
    3-Hoặc sheet Pv4 ; vừa chèn thêm 3 cột trước cột A + chèn 4 cột sau cột A + xóa 2 dòng trên ---> bảng mới "D3:Qxxx"

    Cám ơn mọi người nhiều

    Mã:
    Sub Filter()
    'Declare a variable
    Dim ws As Worksheet
    Set ws = Worksheets("Pv")
    
    Vol = ">=" & ws.Range("E4").value
    ws.Range("A5:J" & [I100000].End(xlUp).Row).AutoFilter
    ws.Range("A5:J" & [I100000].End(xlUp).Row).AutoFilter Field:=5, Criteria1:=Vol
    
    End Sub
    1762152362185.png1762152469356.png
     

    File đính kèm

    Thứ nhất: Lý ra bạn cần đăng bài vô mục 'Lập trình . . .'; Còn giờ thì phải nhắn tin đến SMOD/MOD nhờ dời bài ;

    Phần bạn hỏi:
    → Bạn đã có các tiêu đề từ [A5...J5]
    Bạn có thể xài phương thức FIND() để tìm ra nội dung ô {A5] cũ hiện đang ở xứ nào trên trang tính;
    Kế tiếp kiểm tra các ô bên phải liền kề với ô vừa tìm ra xem chúng liên tục hay không,. . .
    Hay có thể tìm ngay ô chứa nội dung [J5] cũ trong cùng dòng với ô vừa tìm thấy
    Kết hợp với số dòng mà trang tính bạn đã sử dụng làm vùng mới
    Để thực hiện toàn bộ công cuộc tìm kiếm này; đầu tiên bạn phải xác định vùng đang sử dụng của trang
    Như vậy bạn cần khai báo thêm các tham biến, giả dụ
    Dim Rng As Range, sRng as Range
    Dim Rws As Long
    Ở đây Rng sẽ được gán cho vùng mà trang tính đang chứa dữ liệu; sRng là ô đang chứa nội dung [A5] cũ mà phương thức FIND() cần đi tìm
    Rws là số dòng trang tính đang sử dụng

    CHÚC BẠN THÀNH CÔNG MĨ MÃN!
     
    Upvote 0
    Có thêm 1 cách là dùng 1 name đặt cho bảng dữ liệu (phải là name dộng tự co giãn).
    Tuy vậy, không nên vô cớ chèn cột như vậy, đặc biệt là chèn cột vào giữa bảng. Kể cả chèn dòng. Thiết kế dữ liệu và cấu trúc sheet cho đầy đủ rồi hãy viết code lập trình. Sau đó là nghiêm cấm, ai vi phạm thì tự sửa.
     
    Upvote 0
    Thứ nhất: Lý ra bạn cần đăng bài vô mục 'Lập trình . . .'; Còn giờ thì phải nhắn tin đến SMOD/MOD nhờ dời bài ;

    Phần bạn hỏi:
    → Bạn đã có các tiêu đề từ [A5...J5]
    Bạn có thể xài phương thức FIND() để tìm ra nội dung ô {A5] cũ hiện đang ở xứ nào trên trang tính;
    Kế tiếp kiểm tra các ô bên phải liền kề với ô vừa tìm ra xem chúng liên tục hay không,. . .
    Hay có thể tìm ngay ô chứa nội dung [J5] cũ trong cùng dòng với ô vừa tìm thấy
    Kết hợp với số dòng mà trang tính bạn đã sử dụng làm vùng mới
    Để thực hiện toàn bộ công cuộc tìm kiếm này; đầu tiên bạn phải xác định vùng đang sử dụng của trang
    Như vậy bạn cần khai báo thêm các tham biến, giả dụ
    Dim Rng As Range, sRng as Range
    Dim Rws As Long
    Ở đây Rng sẽ được gán cho vùng mà trang tính đang chứa dữ liệu; sRng là ô đang chứa nội dung [A5] cũ mà phương thức FIND() cần đi tìm
    Rws là số dòng trang tính đang sử dụng

    CHÚC BẠN THÀNH CÔNG MĨ MÃN!
    Cám ơn bác,
    Trình độ VBA của em mới ở đoạn a b c thôi bác, logic bác chỉ em hiểu nhưng tìm code tương ứng thì em chịu rồi
     
    Upvote 0
    Chào các bác

    Em có 1 code VBA lọc dữ liệu theo điều kiện như sau, hiện đang được gắn vào vùng data từ "A5:Jxxx" tại sheet "Pv"

    Xin nhờ mọi người có cách nào VBA nhận được tùy biến khi vùng giá trị bảng lọc ban đầu "A5:Jxxx" nó thay đổi khi em chèn thêm cột hoặc xóa bớt dòng không ạ
    Em ví dụ việc thay đổi vùng range như dưới:
    1-Trong TH nếu phải chèn thêm 1 số cột đằng trước cột A ---> vd sheet Pv2: chèn thêm 3 cột thì vùng dữ liệu lọc sẽ thành "D5:Mxxx"
    2-Hoặc em chèn 3 cột trong vùng data ban đầu ---> vd sheet Pv3: chèn 3 cột C,D,F thì vùng dữ liệu lọc sẽ thành "A5:Mxxx"
    3-Hoặc sheet Pv4 ; vừa chèn thêm 3 cột trước cột A + chèn 4 cột sau cột A + xóa 2 dòng trên ---> bảng mới "D3:Qxxx"

    Cám ơn mọi người nhiều

    Mã:
    Sub Filter()
    'Declare a variable
    Dim ws As Worksheet
    Set ws = Worksheets("Pv")
    
    Vol = ">=" & ws.Range("E4").value
    ws.Range("A5:J" & [I100000].End(xlUp).Row).AutoFilter
    ws.Range("A5:J" & [I100000].End(xlUp).Row).AutoFilter Field:=5, Criteria1:=Vol
    
    End Sub
    Hãy thử tham khảo code sau (Theo gợi ý của Anh @SA_DQ )
    Code chỉ chạy cho ra kết quả mong muốn khi điều kiện lọc nằm ở dòng trên dòng có chứa ô "STT", và dòng đó chỉ chứa duy nhất điều kiện lọc (trong bài là 5000000)
    Code chạy được tất cả các sheet đang hiển thị như trong bài.

    Mã:
    Sub Filter()
    
    Dim ws As Worksheet
    Dim Rng As Range
    Dim i&,j&,Lr&
    Dim Col&, Cot&, Vol
    
    Set ws = ActiveSheet
    
    i = ws.Cells.Find("STT").Row
    j = ws.Cells.Find("STT").Column
    Lr = ws.Cells(ws.Rows.Count, j).End(xlUp).Row
    d = ws.Rows(i - 1).Find("*").Column
    
    Col = ws.Cells(i + 1, ws.Columns.Count).End(xlToLeft).Column
    
    Set Rng = ws.Range(ws.Cells(i, j), ws.Cells(Lr, Col))
    Cot = Rng.Find(ws.Cells(i, d).Value).Column
    If j > 1 Then Cot = Cot - j + 1
    Vol = ">=" & ws.Cells(i - 1, d).Value
    Rng.AutoFilter
    Rng.AutoFilter Field:=Cot, Criteria1:=Vol
    
    End Sub
     
    Upvote 0
    Hãy thử tham khảo code sau (Theo gợi ý của Anh @SA_DQ )
    Code chỉ chạy cho ra kết quả mong muốn khi điều kiện lọc nằm ở dòng trên dòng có chứa ô "STT", và dòng đó chỉ chứa duy nhất điều kiện lọc (trong bài là 5000000)
    Code chạy được tất cả các sheet đang hiển thị như trong bài.
    Dear anh HuongHCKT

    Cám ơn anh rất nhiều, em thử vào file và kết quả đúng như mong đợi anh ạ

    Have nice day anh !
     
    Upvote 0

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

    Back
    Top Bottom