Hỏi đoạn mã VBA để copy dữ liệu filter

Thảo luận trong 'Ứng dụng Excel' bắt đầu bởi ke_co_don, 17 Tháng mười 2006.

14,802 lượt xem

  1. ke_co_don

    ke_co_don Thành viên sơ cấp

    Bài viết:
    18
    Đã được thích:
    0
    Nơi ở:
    Hà Nội
    Tớ dùng filter để lọc dữ liệu, sau đó copy đoạn được lọc sang 1 sheet khác. Vậy thì phải dùng đoạn mã VBA như thế này. MỌi người giúp với

    Khi thực hiện thao tác copy thì bình thường, thậm chí dùng cả Go to Special rồi mà không xong.

    THanks mọi người trước.
     
    #1
  2. ruadangyeu

    ruadangyeu Thành viên sơ cấp

    Bài viết:
    143
    Đã được thích:
    2
    Nơi ở:
    Hanoi
    Theo mình cách tốt để học VBA là học từ các macro.
    Bạn ghi macro công việc của mình lại sau đó xem mã chương trình tạo ra.
    Sau đó tỉa tót lại cho đúng theo ý mình.
    Đây chỉ là lý thuyết còn mỗi công việc cần người thực hiện có sự sáng tạo linh hoạt thì mới thực hiện được mục tiêu

    Tất nhiên là nói thì dễ hơn làm nhiều rồi

    Chúc thành công
     
    #2
  3. Yeudoi

    Yeudoi Thành viên thân thiết

    Bài viết:
    88
    Đã được thích:
    0
    Nơi ở:
    Hoi An Quang Nam
    Theo mình thì bạn nên dùng advanced filter để lọc dữ liệu sang sheet khác thì tốt hơn. Để thao tác lại lần sau tự động bạn dùng cách ghi macro như rudangyeu đã nói.
     
    #3
  4. ke_co_don

    ke_co_don Thành viên sơ cấp

    Bài viết:
    18
    Đã được thích:
    0
    Nơi ở:
    Hà Nội
    If Range("C2").Value = "C" Then
    Application.Goto Reference:="TB.Grouping!R300C5"
    Selection.AutoFilter Field:=5, Criteria1:="C"
    Range("A300").Select
    Copy.Selection
    Sheets("A").Select
    Range("A6:A209").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Sheets("TB.Grouping").Select
    Range("F300:F505").Select
    Copy.Selection
    Sheets("A").Select
    Range("E6").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    End If

    Đây là trích đoạn mã bị báo lỗi. Trong đó đoạn bôi đỏ là bị highlight. Khi mày search thông tin trên net thì biết là khi mắc lỗi Error 424 - Object require thì có nghĩa có một form nào đó bị sai. Nhưng thật tình cái nì tôi chưa hiểu nên mong mọi người chỉ giúp. Tự mày mò nên đôi chỗ hơi khó khăn

    @yeudoi and ruadangyeu: Thánk 2 bạn đã advice, tôi cũng mới bập vào VBA nhưng ko đến nỗi ko biết record Macro. He he
     
    #4
  5. Bình_OverAC

    Bình_OverAC Over Abnormal / Crazy

    Bài viết:
    845
    Đã được thích:
    7
    Nơi ở:
    Nha Trang
    selection.copy chứ nhỉ?
    Nhưng mà đoạn code của bác không ổn lắm.
     
    #5
  6. ruadangyeu

    ruadangyeu Thành viên sơ cấp

    Bài viết:
    143
    Đã được thích:
    2
    Nơi ở:
    Hanoi
    đúng như bác Bình nói đoạn mã trên có 2 lỗi sai là
    copy.selection

    chắc bạn đã thu macro thao tác lọc bằng autofilter phải không. Vấn đề là bạn có thấy trong code của bạn các vùng lọc và vùng kết quả là rất cứng không. Khi bạn thay đổi kích thước hay vị trí của vùng cần lọc đoạn mã trên sẽ không hoạt động cho dù điều kiện lọc của trường thứ 5 của bạn vẫn là "C".

    Theo kinh nghiệm của mình với trường hợp trên bạn cần tạo ra một tiến trình:
    Đầu tiên bạn yêu cầu người dùng chọn vùng cần lọc sau đó mới chạy đoạn mã. Và đoạn mã sẽ bắt đầu với Selection.AutoFilter Field:=5, Criteria1:="C"
    Nếu bạn muốn mở rộng thêm bạn có thể đưa một bảng thoại vào để hỏi người dùng xem họ muốn lọc điều kiện như thế nào vào giữa đoạn mã.

    Bạn cứ thử làm đi nếu không được mình sẽ viết ví dụ cho một đoạn

    Chúc thành công
     
    #6
  7. ke_co_don

    ke_co_don Thành viên sơ cấp

    Bài viết:
    18
    Đã được thích:
    0
    Nơi ở:
    Hà Nội
    TRời ơi, mình làm được rồi nè, cám ơn bạn Rùa và anh BÌnh nha. He he. Đoạn code đúng là hơi cứng, mình sẽ cố gắng sửa chữa lại. Vui quá. Là lá la. VBA tuyệt thật. :D
     
    #7
  8. Tran Chau

    Tran Chau Thành viên sơ cấp

    Bài viết:
    149
    Đã được thích:
    0
    Nơi ở:
    TP Ho Chi Minh
    Chào bạn,nếu chịu khó vào trang web nầy nhiều hơn, bạn sẽ gặp nhiều Đoạn code hay và sẽ cảm thấy rất thích nửa. Ví dụ đoạn code của bạn, tôi thử lắp ráp từ các ý khác thì đề nghị như sau:
    ------------
    Sub thu()
    Dim rngMyRange As Range, sourceRange As Range, destrange As Range
    Set rngMyRange = ActiveWorkbook.Worksheets("TB.Grouping").Range("MyData")
    Set sourceRange = Sheets("Sheet1").Range("A1:c10")
    Set destrange = Sheets("A").Range("A6:A209")

    If Range("C2").Value = "C" Then
    rngMyRange.AutoFilter Field:=5, Criteria1:="C"
    destrange.Value = sourceRange.Value
    End If
    End Sub
    ------------
    Tôi chưa chạy thử vì làm biếng lập lại file gốc của bạn, thử sửa lại các tham chiếu cho phù hợp với file của bạn xem sao?
    Chuc cuoi tuần vui vẻ nhé.
     
    #8
  9. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    3
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    Dear ke_co_don,
    Bạn nên tham gia vào Giaiphapexcel thì không những "Vui quá. Là lá la" mà còn "thôi không còn cô đơn" đấy!:byebye:
     
    #9
  10. ke_co_don

    ke_co_don Thành viên sơ cấp

    Bài viết:
    18
    Đã được thích:
    0
    Nơi ở:
    Hà Nội
    Hic, mình mới chập chững nên chưa bập được vào Dim ... Chả hiểu là gì cả! Bạn nào giải thích cho mình với!
     
    #10
  11. aThuan

    aThuan Thành viên thân thiết

    Bài viết:
    347
    Đã được thích:
    5
    Nơi ở:
    Tp.HCM
    Bạn hỏi thật hay chơi thế,
    cũng giống access, vb, c#... cái nào chả phải khai báo biến
    Dim là từ khoa để khai báo biến trong VBA.
     
    #11
  12. ke_co_don

    ke_co_don Thành viên sơ cấp

    Bài viết:
    18
    Đã được thích:
    0
    Nơi ở:
    Hà Nội
    Thật tình tớ cũng biết là khai báo biến roài, nhưng string với boolean và integer là cái chi vậy! Chỉ nhớ mang máng là học pascal ngày xưa thôi! :(, tớ đâu phải dân lập trình, thấy các bạn viết vài đoạn mã phức tạp quá, chả hiểu gì cả. :(
     
    #12
  13. aThuan

    aThuan Thành viên thân thiết

    Bài viết:
    347
    Đã được thích:
    5
    Nơi ở:
    Tp.HCM
    String: dùng để khai báo biến dạng chuỗi.
    Boolean: dùng khai báo biến kiểu luận lý, True/false
    Integer: kiểu số nguyên có giới hạn trong khoảng (tìm hiểu đi).

    Tôi nghĩ những câu hỏi đại loại thế này nên tự mình tìm hiểu sẽ dễ nhớ mà mình cũng biết cách vận dụng,
    góp phần làm cho đề tài không bị spam, những ý tưởng được đưa lên là những ý tưởng cô đọng, những việc thật sự khó giải quyết,
    mình đưa ra 01 câu hỏi, người khác trả lời sau đó lại bảo tôi biết rồi. Thế thì thật sự là thất vọng. đôi lời cùng bạn.
     
    #13
  14. ke_co_don

    ke_co_don Thành viên sơ cấp

    Bài viết:
    18
    Đã được thích:
    0
    Nơi ở:
    Hà Nội
    Spam lần chót: Sorry, mình lười thật! :D! Thanks bạn Thuận nhé. Sẽ rút kinh nghiệm! ;)
     
    #14
  15. Tran Chau

    Tran Chau Thành viên sơ cấp

    Bài viết:
    149
    Đã được thích:
    0
    Nơi ở:
    TP Ho Chi Minh
    Chắc các bạn khác đang bận, thôi thì mình tạm "múa rìu qua mắt thợ" vậy, chủ yếu để bạn khg thấy cô đơn thôi:
    Dim: là chữ viết tắt của Dimension, tương đương với declare... trong ngôn ngữ lt khác;cũng như đa số các ngôn ngữ lập trình đây là phần khai báo biến,tuy nhiên để dể dàng cho ng bắt đầu, VBA defaut khg cần phải dùng Dim. Để xử dụng tốt hơn VBA, các cao thủ đều khuyên nên dùng Dim, để bắt buộc phải khai báo biến tự động, bạn vào VBE\Tools\Options\ check vào require variable declaration. Lúc đó bạn sẽ thấy tất cả các module đều auto có dòng:Option Explicit
     
    #15
  16. takeit

    takeit Thành viên sơ cấp

    Bài viết:
    35
    Đã được thích:
    0
    Nơi ở:
    hcmc
     
    #16
  17. levanduyet

    levanduyet Welcome

    Bài viết:
    535
    Đã được thích:
    11
    Giới tính:
    Nam
    Nơi ở:
    HCM
    Trong đoạn code sau tôi lọc dữ liệu từ một worksheet rồi sau đó đưa ra một sheet khác.
    Ở đây tôi đã đặt khối dữ liệu của tôi là: tb_Bom (Thực sự ra chúng ta có thể dùng đối tượng AutoFilter).
    Các bạn chú ý rằng nếu khối dữ liệu sau khi lọc theo điều kiện của chúng ta:
    Mã:
    Set rngBom = Range("tb_Bom").SpecialCells(xlCellTypeVisible)
    thì sẽ báo lỗi. Tôi đã có bẫy lỗi, các bạn xem code nha.
    Đoạn code cụ thể xin xem đoạn code sau.


    Mã:
    Sub Bom_Filter1()
        Dim wsFilter As Worksheet, wsListCode As Worksheet
        Dim wsReport As Worksheet, wsListNoBom As Worksheet
        Dim rngBom As Range, rngBom1 As Range, rngReportDel As Range, rngNoBomDel As Range
        Dim sMaterialNo As String, i As Long, j As Long, k As Long
        Dim lRowNoBom As Long
        Dim sSemiProNo As String, FirstRowOffset As Long, lLastRow As Long
        Dim vSoLuong
        With Application
            .ScreenUpdating = False
            .Calculation = xlCalculationManual
            .StatusBar = VNI("Ñang tính toùan...Xin chôø trong giaây laùt.")
        End With
        Set wsFilter = Worksheets("BOM")
        Set wsListCode = Worksheets("LIST_TO_EXPORT")
        Set wsReport = Worksheets("REPORT")
        Set wsListNoBom = Worksheets("NO_BOM")
        'Xoa vung truoc khi xuat
        Set rngReportDel = Worksheets("REPORT").Range("tb_Report_Del")
        Set rngNoBomDel = Worksheets("NO_BOM").Range("tb_No_BOM")
        rngReportDel.ClearContents
        rngNoBomDel.ClearContents
        Set rngReportDel = Nothing
        j = 0: FirstRowOffset = 0: lRowNoBom = 4
        lLastRow = LastRow(Sheet3)
        sMaterialNo = Trim(wsListCode.Range("A4").Offset(FirstRowOffset, 0))
        vSoLuong = wsListCode.Range("A4").Offset(FirstRowOffset, 2)
        If Len(sMaterialNo) = 0 Then
            MsgBoxUni VNI("Baïn khoâng coù maõ naøo ñeå xuaát."), vbInformation + vbOKOnly, VNI("Thoâng baùo")
            GoTo Bom_Filter1_Exit
        End If
        'Vong lap de lap lai danh sach
        Do While Len(sMaterialNo) = 10
            wsFilter.Range("A3").AutoFilter Field:=1, Criteria1:=sMaterialNo
            On Error Resume Next
            Set rngBom = Range("tb_Bom").SpecialCells(xlCellTypeVisible)
            If Err.Number = 1004 Then
                wsListNoBom.Cells(lRowNoBom, 1) = sMaterialNo
                lRowNoBom = lRowNoBom + 1
                Err.Clear
                MsgBoxUni VNI("Saûn phaåm chöa coù BOM " & sMaterialNo), vbInformation + vbOKOnly, VNI("Thoâng baùo")
                GoTo Bom_Filter1_End_Loop
            End If
    
            If rngBom.Rows.Count > 0 Then
                For i = 1 To rngBom.Rows.Count
                    sSemiProNo = Trim(rngBom.Cells(i, 9))
                    If Len(sSemiProNo) = 10 Then
    
                        With wsReport.Range("A4")
                            .Offset(j, 0) = rngBom.Cells(i, 1)    'Ma san pham
                            .Offset(j, 1) = rngBom.Cells(i, 2)    'Mo ta san pham
                            .Offset(j, 2) = rngBom.Cells(i, 9)    'Ma Component
                            .Offset(j, 3) = rngBom.Cells(i, 10)    'Mo ta Component
                            .Offset(j, 4) = rngBom.Cells(i, 19) * vSoLuong  'So luong
                            .Offset(j, 5) = rngBom.Cells(i, 20)    'Don vi tinh
                        End With
    
                        j = j + 1
                    End If
                Next i
            End If
    Bom_Filter1_End_Loop:
            FirstRowOffset = FirstRowOffset + 1
            sMaterialNo = Trim(wsListCode.Range("A4").Offset(FirstRowOffset, 0))
            If lLastRow > 3 Then
                Application.StatusBar = VNI("Ñang tính toùan...Xin chôø trong giaây laùt. Ñang thöïc hieän tôùi ") & FirstRowOffset & "/" & (lLastRow - 3)
            End If
        Loop
        If Err.Number <> 0 Then
            MsgBoxUni VNI("Xin baïn xem laïi code! Coù loãi xaõy ra."), vbInformation + vbOKOnly, VNI("Thoâng baùo")
        Else
            MsgBoxUni VNI("Baïn ñaõ hoøan taát xuaát BOM."), vbInformation + vbOKOnly, VNI("Thoâng baùo")
        End If
        'Giai phong bo nho
    Bom_Filter1_Exit:
        Set rngBom = Nothing: Set rngBom1 = Nothing
        Set wsFilter = Nothing: Set wsListCode = Nothing: Set wsReport = Nothing
        With Application
            .ScreenUpdating = True
            .Calculation = xlCalculationAutomatic
            .StatusBar = False
        End With
    End Sub
    
    Chúc bạn thành công.

    Lê Văn Duyệt
     
    #17
  18. Tran Khanh Tri

    Tran Khanh Tri Thành viên sơ cấp

    Bài viết:
    59
    Đã được thích:
    0
    Nơi ở:
    tp Ho Chi Minh
    Học VB ở đâu, mình không có thời gian rãnh đến trung tâm, có trang web nào dạy VB từ căn bản đến nâng cao không, mình thấy VB ứng dụng trong EXEL nhiều lắm
     
    #18
  19. gnudpe

    gnudpe Thành viên sơ cấp

    Bài viết:
    1
    Đã được thích:
    0
    Nơi ở:
    lai chau
    Dim là biến khai báo của VBA ... Hi chắc là bạn bắt đầu mê VBA rui!
     
    #19

Chia sẻ trang này