Code cập nhật dữ liệu!

Liên hệ QC

hongtruong101186

Thành viên mới
Tham gia
10/11/08
Bài viết
40
Được thích
5
Em có 2 danh sách, muốn tự động cập nhật dữ liệu từ sheet này sang sheet kia dựa vào trường mã.

Các anh xem file và giúp e với nha. Trong file đính kèm có yêu cầu rồi à.
 

File đính kèm

  • danh sach.xls
    22 KB · Đọc: 19
Em có 2 danh sách, muốn tự động cập nhật dữ liệu từ sheet này sang sheet kia dựa vào trường mã.

Các anh xem file và giúp e với nha. Trong file đính kèm có yêu cầu rồi à.
Hình như bạn muốn tạo một nút CommandButton, bấm vào để lấy dữ liệu thì phải?
Thử với file này xem sao, dữ liệu nhiều là cỡ bao nhiêu dòng vậy bạn?
Thân
Híc, bài này cho chạy ở sheet DS2 thì hay hơn chứ nhỉ, dốt wá
 

File đính kèm

  • dansach(1).rar
    12.6 KB · Đọc: 37
Lần chỉnh sửa cuối:
Upvote 0
Mình vừa đọc qua code, chưa hiểu lắm, đang nghiền xem thế nào. Nhưng cũng chân thành cảm ơn bạn rất nhiều.
Anh em GPE nhà mình nhiệt tình quá.
 
Upvote 0
concogia có thể ghi chú vào code được không? cho mình dễ hiểu chút. Đọc hơi khó hiểu tí. hihi.
 
Upvote 0
concogia có thể ghi chú vào code được không? cho mình dễ hiểu chút. Đọc hơi khó hiểu tí. hihi.
Bài này có nhiều cách giải
Vì bạn nói dữ liệu của bạn rất nhiều nên mình thử viết giải quyết bằng mảng vì mảng xử lý rất nhanh nhưng hơi khó hiểu
Nếu dữ liệu ít thì bài này ta xử lý trực tiếp trên sheet và dùng phép gán cũng ổn và nhìn code sẽ dễ hiểu hơn
Mã:
Public Sub Sang()
    Dim Vung As Range, Mg(), Ws As Worksheet, DlLay As Range, iHang As Long, Cll As Range, kK As Long
    Set Ws = Sheets("DS2")
    Set DlLay = Ws.Range(Ws.[d4], Ws.[d10000].End(xlUp))
    Set Vung = Range([d4], [d10000].End(xlUp))
    'Khai báo các bien
        ReDim Mg(1 To Vung.Rows.Count, 1 To 3)
        'Khai báo mang 2 chieu Mg có so hàng = so hàng cua bien Vung, so côt = 3
        kK = 1
        'Gán gia tri cho bien kK
            For Each Cll In Vung
            'Cho bien Cll chay trong Vung
                On Error Resume Next
                'Nêu xay ra loi thì nhay xuong làm công viec kê tiep
                iHang = Application.WorksheetFunction.Match(Cll, DlLay, 0)
                'Tìm gia tri cua bien iHang
                    If iHang > 0 Then
                    'neu iHang >0 thì gán gia tri tuong ung o sheet DS2 vào mang
                        Mg(kK, 1) = DlLay(iHang).Offset(, 3)
                        Mg(kK, 2) = DlLay(iHang).Offset(, 4)
                        Mg(kK, 3) = DlLay(iHang).Offset(, 5)
                    Else
                    'Nguoc lai, gán vào mang gia tri trong
                        Mg(kK, 1) = ""
                        Mg(kK, 2) = ""
                        Mg(kK, 3) = ""
                    End If
                        iHang = 0
                        kK = kK + 1
                        'Gán lai gia tri cua bien iHang & kK
            Next
            'thoat vong lap
    [g4].Resize(Vung.Rows.Count, 3) = Mg
    'Gán gia tri cua mang vao vùng muon nhan ket qua o sheet DS1
End Sub
Hy vọng bạn hiểu
Thân
 
Upvote 0
Cơ bản là dữ liệu ở DS2 là động, nó không cố định, không biết có gán được không.
 
Upvote 0
Bài này có nhiều cách giải
Vì bạn nói dữ liệu của bạn rất nhiều nên mình thử viết giải quyết bằng mảng vì mảng xử lý rất nhanh nhưng hơi khó hiểu
Nếu dữ liệu ít thì bài này ta xử lý trực tiếp trên sheet và dùng phép gán cũng ổn và nhìn code sẽ dễ hiểu hơn
Đã dùng mảng thì anh nên dùng cho trọn luôn! Thay vì dùng hàm MATCH, anh nên cho 1 vòng lập For đầu tiên đi "thu thập" các loại MÃ có trong DS1 rồi nạp vào Dictionary... Tiếp theo dùng vòng lập For thứ 2 quét qua các MÃ ở DS2, tra các mã này vào Dictionary và... ra quyết định gì đó
Em nghĩ tuy rằng dùng 2 vòng lập nhưng rất có thể sẽ nhanh hơn MATCH đấy (vì khi ấy anh thao tác hoàn toàn với mảng)
 
Upvote 0
Mình tham gia 1 code, bạn thử xem (Tốc độ khá tốt):

Mã:
Private Sub CommandButton1_Click()
Dim Rg1 As Range, Rg2 As Range, Cl As Range
Dim Fc As WorksheetFunction
Set Fc = WorksheetFunction
Set Rg1 = Sheet1.[D4].Resize(Fc.CountA(Sheet1.[D4:D65536]))
Set Rg2 = Sheet2.[D4].Resize(Fc.CountA(Sheet2.[D4:D65536]))
Rg1.Offset(, 3).Resize(, 3).ClearContents
For Each Cl In Rg1
If Fc.CountIf(Rg2, Cl) > 0 Then Cl.Offset(, 3).Resize(, 3).Value _
= Rg2(Fc.Match(Cl, Rg2, 0)).Offset(, 3).Resize(, 3).Value
Next
Set Rg1 = Nothing: Set Rg2 = Nothing: Set Cl = Nothing : Set Fc=Nothing
End Sub
 
Upvote 0
Nếu dữ liệu nhiều bạn thử code này xem sao
Mã:
Public Sub Chuyen()
    Dim Ws As Worksheet, d As Object, mChuyen, I As Long, kK As Long, mNhan, Mg(), iHang As Long, J As Long, Chuyen1, Chuyen2, Chuyen3, mM As Long
        Set d = CreateObject("scripting.dictionary")
        Set Ws = Sheets("DS2")
        iHang = Range([d4], [d10000].End(xlUp)).Rows.Count
        ReDim Mg(1 To iHang, 1 To 3)
            mNhan = Range([d4], [d10000].End(xlUp)).Value
            mChuyen = Ws.Range(Ws.[d4], Ws.[d1000].End(xlUp)).Value
            Chuyen1 = Ws.Range(Ws.[g4], Ws.[g10000].End(xlUp)).Value
            Chuyen2 = Ws.Range(Ws.[h4], Ws.[h10000].End(xlUp)).Value
            Chuyen3 = Ws.Range(Ws.[i4], Ws.[i10000].End(xlUp)).Value
            kK = 1
                For I = 1 To UBound(mChuyen)
                    If Not d.exists(mChuyen(I, 1)) Then
                        d.Add mChuyen(I, 1), kK
                        kK = kK + 1
                    End If
                Next I
                        For J = 1 To UBound(mNhan)
                            If d.exists(mNhan(J, 1)) Then
                                mM = d.Item(mNhan(J, 1))
                                Mg(J, 1) = Chuyen1(mM, 1): Mg(J, 2) = Chuyen2(mM, 1): Mg(J, 3) = Chuyen3(mM, 1)
                            End If
                        Next J
    [g4].Resize(iHang, 3) = Mg
End Sub
Thân
 
Upvote 0
Mình vừa đọc qua code, chưa hiểu lắm, đang nghiền xem thế nào. Nhưng cũng chân thành cảm ơn bạn rất nhiều.
Anh em GPE nhà mình nhiệt tình quá.
Để đơn giản hóa vấn đề thì tôi nghĩ bạn nên nghiên cứu Advanced Filter, vì nó có thể giải quyết được yêu cầu của bạn đấy
Làm thử cho bạn bằng cách này nha! Đầu tiên gõ vào cell A2 ở sheet DS1 công thức =COUNTIF('DS2'!$D$4:$D$10000,$D4)>0
Tiếp theo là chạy code này
PHP:
Sub FindAndMatch()
  Dim Src1 As Range, Src2 As Range
  Set Src1 = Sheets("DS1").Range("C3").CurrentRegion
  Set Src2 = Sheets("DS2").Range("C3").CurrentRegion
  With Src1
    .AdvancedFilter 1, .Parent.Range("A1:A2")
    .Offset(1).SpecialCells(12).ClearContents
    .Parent.ShowAllData
    .Sort .Cells(1, 1), 1, , , , , , 1
  End With
  With Src1.CurrentRegion
    .Offset(.Rows.Count).Resize(Src2.Rows.Count).Value = Src2.Offset(1).Value
  End With
  With Src1.CurrentRegion
    .Sort .Cells(1, 1), 1, , , , , , 1
  End With
End Sub
Toàn bộ code dựa trên cách làm bằng Advanced Filter đấy (có thể làm bằng tay) và code có thể diển giải như sau:
- Đặt Src1 là vùng dữ liệu tại DS1 và Src2 là vùng dữ liệu tại DS2
- Tại DS1, dùng Advanced Filter lọc tại chổ theo điều kiện đã ghi ở A2
- Xóa toàn bộ kết quả lọc
- Show All dữ liệu
- Sort lại danh sách tăng dần theo cột STT
- Copy dữ liệu ở DS2 dán vào dòng cuối cùng của dữ liệu ở DS1
- Sort lại danh sách tăng dần theo cột STT
===> Rất đơn giản, đúng không?
Bài toán này thực chất là: TÌM DỮ LIỆU CÓ TRONG 2 DANH SÁCH (đã từng đăng trên diễn đàn nhiều lần)
 

File đính kèm

  • dansach(1).xls
    28.5 KB · Đọc: 31
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom