VBA copy ô trong excel khi đang lọc filter (1 người xem)

Liên hệ QC

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
22
Được thích
5
Chào các bác

Em có 1 code VBA đang thực hiện việc copy từ ô active kéo xuống 5 dòng --> được 6 dòng copy --> paste sang sheet2

Nhờ mọi người nâng cấp code lên việc nếu bảng giá trị đang bị filter thì vẫn copy được 6 dòng filter từ ô đang active

Vd: Bảng tính đang lọc tại cột F (lọc những ô màu vàng), để con chuột tại ô G5 ---> sẽ chọn được vùng G5:G21( vùng này có 6 dòng cần copy) ---> Selection.SpecialCells(xlCellTypeVisible).Copy copy được 6 dòng đang lọc ---> sang sheet2 paste vào D3
Thực hiên chọn vùng xong và copy, chuột sẽ nhảy xuông ô G25 - là giá trị lọc thứ 7, để nếu bấm chạy macro sẽ tiếp tục chọn xuông dưới 6 dòng

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

1757577470781.png
Mã:
Sub Copy()

Sheets("Sheet1").Select

Dim rrow As Long
Dim Col As Long

    rrow = ActiveCell.Row
    Col = ActiveCell.Column

    Range(Cells(rrow, Col), Cells(rrow + 5, Col)).Copy
    Cells(rrow + 6, Col).Select
    
Sheets("Sheet2").Select
    Range("D3").PasteSpecial xlPasteValues
    Application.CutCopyMode = False
    
Sheets("Sheet1").Select

End Sub
 

File đính kèm

- Cột Amt đang lọc theo màu và bạn đang muốn copy cột Mã sang sheet 2 bắt đầu từ ô D3, vậy tại sao bạn không copy cả cột mà phải copy 6 dòng rồi lại copy 6 dòng tiếp?
- Copy đoạn G5:G21 paste vào Sheet2 D3 xong chạy macro tiếp đoạn G25:G36 thì paste tiếp vào đâu vậy bạn?
 
- Cột Amt đang lọc theo màu và bạn đang muốn copy cột Mã sang sheet 2 bắt đầu từ ô D3, vậy tại sao bạn không copy cả cột mà phải copy 6 dòng rồi lại copy 6 dòng tiếp?
Mỗi lần chạy, mình cần copy từ ô đặt chuột cột tại cột G (lần đầu mình có thể chọn đặt từ G5, G12 .. hoặc G17 ) và chỉ copy 6 dòng trở xuống thôi bạn, vì nó liên quan đến mảng check mỗi lần 6 mã bên sheet 2 sau này, nên không cần copy cả cột bạn ạ

Sau mỗi lần chạy, quay lại sheet1 sẽ để chuột tại dòng thứ 7 tính từ lần chạy trước đó

- Copy đoạn G5:G21 paste vào Sheet2 D3 xong chạy macro tiếp đoạn G25:G36 thì paste tiếp vào đâu vậy bạn?

Mỗi lần chạy copy đều dán đè lên sheet2-D3 1 lần bạn ạ
 
Vậy bạn thử dùng code này nhé, hy vọng giúp được bạn:
Mã:
Dim StartIndex As Long

Sub CopyFilteredRows()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim cell As Range
    Dim visibleCells As Range
    Dim cellArr As Collection
    Dim i As Long, cnt As Long
    Dim lastCopyRow As Long, PasteRow As Long
    
    Set ws1 = ThisWorkbook.Sheets("Sheet1")
    Set ws2 = ThisWorkbook.Sheets("Sheet2")
    
    lastCopyRow = ws1.Cells(ws1.Rows.Count, "G").End(xlUp).Row
    
    
    On Error Resume Next
    Set visibleCells = ws1.Range("G5:G" & lastCopyRow).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    If visibleCells Is Nothing Then Exit Sub
    
    Set cellArr = New Collection
    For Each cell In visibleCells
        cellArr.Add cell
    Next cell
    
    If StartIndex = 0 Then StartIndex = 1
    
    If StartIndex > cellArr.Count Then
        MsgBox "copy xong"
        StartIndex = 1
        Exit Sub
    End If
    
    PasteRow = 3
    ws2.Range("D3:D8").ClearContents
    
    cnt = 0
    For i = StartIndex To cellArr.Count
        ws2.Cells(PasteRow + cnt, "D").Value = cellArr(i).Value
        cnt = cnt + 1
        If cnt = 6 Then Exit For
    Next i
    
    StartIndex = StartIndex + cnt
End Sub
 
Vậy bạn thử dùng code này nhé, hy vọng giúp được bạn:
Dear LOGANWover

Cám ơn bạn rất nhiều, code chạy copy lần lượt 6 dòng từ dòng có filter đầu tiên rồi bạn

Nếu trong TH mình để xác định start-cell-copy đầu tiên bằng cách để trỏ chuột vào ô đó ---> rồi code sẽ bắt đầu tính start-index từ đó copy xuống có được không bạn

P/S: mình đang chế giải pháp cho việc có thể tùy ý lựa chọn lại start-index là copy vùng đang lọc ra 1 hàng ngang tại B1 ---> chọn mã bắt đầu từ hàng nhang đó --->chạy macro nút 2-copy
Cách này lại tạo thêm 1 hàng dữ liệu không hay lắm
 

File đính kèm

Nếu ý tưởng của bạn là chọn 1 ô bất kì từ G5 trở xuống khi chạy macro sẽ copy 6 ô từ ô được chọn và paste sang vùng D3:D8 thì bạn có thể thêm Application.ActiveCell để xác định.
Mã:
Sub CopyFilteredRows2()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim cell As Range, sel As Range
    Dim visibleCells As Range
    Dim cellArr As Collection
    Dim i As Long, cnt As Long
    Dim lastCopyRow As Long, PasteRow As Long
    Dim StartIndex As Long
    Dim selectedRow As Long

    Set ws1 = ThisWorkbook.Sheets("Sheet1")
    Set ws2 = ThisWorkbook.Sheets("Sheet2")

    lastCopyRow = ws1.Cells(ws1.Rows.Count, "G").End(xlUp).Row

    On Error Resume Next
    Set visibleCells = ws1.Range("G5:G" & lastCopyRow).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If visibleCells Is Nothing Then
        Exit Sub
    End If

    Set cellArr = New Collection
    For Each cell In visibleCells
        cellArr.Add cell
    Next cell

    Set sel = Application.ActiveCell
    If sel Is Nothing Then
        MsgBox "Chua chon o"
        Exit Sub
    End If

    If Intersect(sel, ws1.Range("G5:G" & lastCopyRow)) Is Nothing Then
        MsgBox "Hay chon o G5 tro xuong."
        Exit Sub
    End If

    selectedRow = sel.Row

    For i = 1 To cellArr.Count
        If cellArr(i).Row = selectedRow Then
            StartIndex = i
            Exit For
        End If
    Next i

    If StartIndex = 0 Then
        Exit Sub
    End If

    ws2.Range("D3:D8").ClearContents
    PasteRow = 3
    cnt = 0
    For i = StartIndex To cellArr.Count
        ws2.Cells(PasteRow + cnt, "D").Value = cellArr(i).Value
        cnt = cnt + 1
        If cnt = 6 Then Exit For
    Next i
End Sub
 
Nếu ý tưởng của bạn là chọn 1 ô bất kì từ G5 trở xuống khi chạy macro sẽ copy 6 ô từ ô được chọn và paste sang vùng D3:D8 thì bạn có thể thêm Application.ActiveCell để xác định.
Cám ơn bạn rất nhiều nha
Như nàu activeCell nó vẫn nằm lại ô mình chọn ban đầu,
Có thể cho activecell sau khi chạy macro nhảy xuống ô thứ 7 (dòng có giá trị đang lọc thứ 7) được không bạn
 
Vậy là ý bạn đang muốn chọn 1 ô bất kì cột G ví dụ = G5 trở xuống khi chạy macro sẽ copy 6 ô từ ô được chọn và paste sang vùng D3:D8, sau đó tự động chọn G11 để chờ cho lần chạy tiếp thì bạn thêm vào cuối sub code sau:
Mã:
    If StartIndex + 6 <= cellArr.Count Then
        ws1.Cells(cellArr(StartIndex + 6).Row, "G").Select
    Else
        MsgBox "Copy xong"
        Exit Sub
    End If
 
Mã:
    If StartIndex + 6 <= cellArr.Count Then
        ws1.Cells(cellArr(StartIndex + 6).Row, "G").Select
    Else
        MsgBox "Copy xong"
        Exit Sub
    End If
Dạ đúng rồi bạn ơi, cám ơn bạn rất nhiều

Mình đã loay hoay mãi chỉ biết mấy lệnh copy, paste rồi ... copy ra range mới...để xử lý giải pháp đúng mong muốn

Nhìn code của bạn kiểu hs lớp 1 xem toán bậc ĐH ấy
 

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

Back
Top Bottom