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

  • Thread starter ke_co_don
  • Ngày gửi
K

ke_co_don

Guest
21/3/06
18
0
0
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.
 
Khóa học Quản trị dòng tiền
ruadangyeu

ruadangyeu

Guest
30/9/06
143
1
0
Hanoi
my.opera.com
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
 
Y

Yeudoi

Trung cấp
29/9/05
88
0
6
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.
 
K

ke_co_don

Guest
21/3/06
18
0
0
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
 
ruadangyeu

ruadangyeu

Guest
30/9/06
143
1
0
Hanoi
my.opera.com
đú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
 
K

ke_co_don

Guest
21/3/06
18
0
0
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
 
T

Tran Chau

Guest
23/11/04
149
0
0
65
TP Ho Chi Minh
ke_co_don 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
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é.
 
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
4
18
Khánh Hòa
ke_co_don 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
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:
 
K

ke_co_don

Guest
21/3/06
18
0
0
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!
 
aThuan

aThuan

Cao cấp
27/9/06
347
5
18
Tp.HCM
ke_co_don 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!

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.
 
K

ke_co_don

Guest
21/3/06
18
0
0
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ả. :(
 
aThuan

aThuan

Cao cấp
27/9/06
347
5
18
Tp.HCM
ke_co_don 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ả. :(

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.
 
K

ke_co_don

Guest
21/3/06
18
0
0
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! ;)
 
T

Tran Chau

Guest
23/11/04
149
0
0
65
TP Ho Chi Minh
ke_co_don 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!
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
 
T

takeit

Guest
19/4/04
35
0
0
hcmc
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
------------
Mình có nhu cầu cho "C" di thay đổi, bạn có giải pháp không ?
 
levanduyet

levanduyet

Welcome
16/10/04
537
19
18
HCM
my.opera.com
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
 
T

Tran Khanh Tri

Guest
28/3/06
59
0
6
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
 
G

gnudpe

Guest
22/2/08
1
0
0
53
lai chau
Dim là biến khai báo của VBA ... Hi chắc là bạn bắt đầu mê VBA rui!
 

Xem nhiều

Webketoan Zalo OA