Nhờ sữa đoạn code copy 2 files excel

Liên hệ QC

tuanbonus

Thành viên mới
Tham gia
2/6/12
Bài viết
23
Được thích
3
Nhờ các sư huynh tỉ muội, sữa giúp đoạn code copy 2 files của excel nó bị thiếu gì mà chạy báo lỗi.

HTML:
Public Sub COPY1()
Dim Rng1(), Rng2(), Arr(), Arr2(), Dic As Object, Dic2 As Object
Dim Ws1 As Worksheet, Ws2 As Worksheet, I As Long, J As Long, K As Long
    Set Dic = CreateObject("Scripting.Dictionary")
    Set Dic2 = CreateObject("Scripting.Dictionary")
    Application.Workbooks.Open (ThisWorkbook.Path & "\CHITIET.XLSM")
    Set Ws1 = Workbooks("CHITIET").Worksheets("CHITIET")
    Set Ws2 = Workbooks("KETQUA").Worksheets("KETQUA")
        Rng2 = Ws2.Range(Ws2.[E2], Ws2.[E2].End(xlToRight)).Resize(2).Value
        Rng1 = Ws1.Range(Ws1.[E2], Ws1.[E2].End(xlToRight)).Resize(2).Value
ReDim Arr(1 To 2, 1 To UBound(Rng2, 2) + UBound(Rng1, 2))
    For I = 1 To UBound(Rng2, 2)
        K = K + 1
        Dic.Add Rng2(1, I) & Rng2(2, I), K
        Arr(1, K) = Rng2(1, K): Arr(2, K) = Rng2(2, K)
    Next I
        For J = 1 To UBound(Rng1, 2)
            If Not Dic.exists(Rng1(1, J) & Rng1(2, J)) Then
                K = K + 1
                Dic.Add Rng1(1, J) & Rng1(2, J), K
                Arr(1, K) = Rng1(1, J): Arr(2, K) = Rng1(2, J)
            End If
        Next J
Ws2.[E2].Resize(2, K) = Arr
'----------------------
    Rng2 = Ws2.Range(Ws2.[A4], Ws2.[A65000].End(xlUp)).Resize(, K + 4).Value
ReDim Arr2(1 To UBound(Rng2, 1), 1 To UBound(Rng2, 2))
        For I = 1 To UBound(Rng2, 1)
            If Not Dic2.exists(Rng2(I, 1) & Rng2(I, 2) & Rng2(I, 4)) Then
                Dic2.Add Rng2(I, 1) & Rng2(I, 2) & Rng2(I, 4), I
            End If
                For J = 1 To UBound(Rng2, 2)
                    Arr2(I, J) = Rng2(I, J)
                Next J
        Next I
'---------------
    Rng1 = Ws1.Range(Ws1.[A4], Ws1.[A65000].End(xlUp)).Resize(, Ws1.[E2].End(xlToRight).Column).Value
For I = 1 To UBound(Rng1, 1)
    For J = 5 To UBound(Rng1, 2)
        If Rng1(I, J) > 0 Then
            Arr2(Dic2.Item(Rng1(I, 1) & Rng1(I, 2) & Rng1(I, 4)), Dic.Item(Ws1.Cells(2, J) & Ws1.Cells(3, J)) + 4) = Rng1(I, J)
        End If
    Next J
Next I
            Ws2.[A4].Resize(UBound(Rng2, 1), UBound(Rng2, 2)).Value = Arr2
    Set Dic = Nothing
    Set Dic2 = Nothing
    Set Ws1 = Nothing
    Set Ws2 = Nothing
End Sub

xin cảm ơn trước.
 

File đính kèm

  • NHAPLIEU.rar
    80 KB · Đọc: 29
Bạn sửa :
PHP:
Set Ws1 = Workbooks("CHITIET").Worksheets("CHITIET")
    Set Ws2 = Workbooks("KETQUA").Worksheets("KETQUA")
Thành:
PHP:
 Set Ws1 = Workbooks("CHITIET.XLSM").Worksheets("CHITIET")
    Set Ws2 = Workbooks("KETQUA.XLSM").Worksheets("KETQUA")
 
Upvote 0
hi anh thivantan,

vẫn bị lỗi:
mảng bên dưới không có phần tử gọi ra;
PHP:
Arr2(Dic2.Item(Rng1(I, 1) & Rng1(I, 2) & Rng1(I, 4)), Dic.Item(Ws1.Cells(2, J) & Ws1.Cells(3, J)) + 4) = Rng1(I, J)

tôi mò hoài không biết thiếu gi nữa anh àh.
 
Upvote 0
Theo tôi bạn nên sửa:
PHP:
If Rng1(I, J) > 0 Then
           Arr2(Dic2.Item(Rng1(I, 1) & Rng1(I, 2) & Rng1(I, 4)), Dic.Item(Ws1.Cells(2, J) & Ws1.Cells(3, J)) + 4) = Rng1(I, J)
End If
Thành:

PHP:
If Dic2.exists(Rng1(I, 1) & Rng1(I, 2) & Rng1(I, 4))  Then
           Arr2(Dic2.Item(Rng1(I, 1) & Rng1(I, 2) & Rng1(I, 4)), Dic.Item(Ws1.Cells(2, J) & Ws1.Cells(3, J)) + 4) = Rng1(I, J)
End If
 
Lần chỉnh sửa cuối:
Upvote 0
Theo tôi bạn nên sửa:
..................
PHP:
If Dic2.exists(Rng1(I, 1) & Rng1(I, 2) & Rng1(I, 4)) > 0 Then
           Arr2(Dic2.Item(Rng1(I, 1) & Rng1(I, 2) & Rng1(I, 4)), Dic.Item(Ws1.Cells(2, J) & Ws1.Cells(3, J)) + 4) = Rng1(I, J)
End If

dear anh Thivantan,
nếu sửa lại như anh thì mảng này không thực hiện được, code sẽ dừng lại ở đây
 
Upvote 0
Bạn có thể nói rõ hơn mục đích bạn cần xử lý giữa 02 file trên được không? Theo tôi nếu bạn nói rõ và cụ thể hơn thì có thể nhờ Các anh Ndu, concogia, Bate...là những người am hiểu về Dic giúp cho, chứ tôi thấy bạn hỏi ở nhiều chỗ quá...nhưng đọc lại chưa thực sự biết mục đích là gì.
 
Upvote 0
Bạn có thể nói rõ hơn mục đích bạn cần xử lý giữa 02 file trên được không? Theo tôi nếu bạn nói rõ và cụ thể hơn thì có thể nhờ Các anh Ndu, concogia, Bate...là những người am hiểu về Dic giúp cho, chứ tôi thấy bạn hỏi ở nhiều chỗ quá...nhưng đọc lại chưa thực sự biết mục đích là gì.

Mục đích là copy dữ liệu từ file CHITIET qua file KETQUA. (2 điều kiện)
Điều kiện thứ 1, là copy dữ liệu của 3 cột (A,B,D) nếu các cells (A, B, D) của sheet CHITIET trùng nhau với sheet KETQUA thì bỏ qua, ngược lại không trùng nhau (dữ liệu mới) thì copy qua sheet KETQUA dán nối tiếp phía dưới (không dán đè lên dữ liệu đang có).

Điều kiện thứ 2 là gán số lượng các cột (E, F, G, H, I, J.......) là các cột số lượng, nếu (E2+E3); (F2+F3); (G2+G3)........ là tên các mặt hàng, nếu tên này ở sheet KETQUA trùng với sheet CHITIET thì copy & dán đề lên số lượng củ, còn không trùng nhau thì lấy cột rỗng kế tiếp để gán số lượng tương ứng (không gán đè lên số lượng đang có).

vì file KETQUA như 1 DATABASE sẽ được update thường xuyên từ file CHITIET, còn file CHITET mổi lần update thì clearall để nạp dữ liệu cho lần update tiếp theo, mổi lần update sẽ có sự trùng lập dữ liệu nên cần 2 điều kiện này.

đoạn này trước đây anh BaTe giúp rồi, nhưng chỉ copy 2 sheets trong 1 file thôi, nhưng chuyển qua 2 files thì code bị lổi.
 
Upvote 0
Tôi làm theo hướng dẫn của Anh Bate thấy không phát sinh lỗi như bạn nói. Bạn kiểm tra lại xem sao.
 

File đính kèm

  • NHAPLIEU.rar
    144.9 KB · Đọc: 11
Upvote 0
Web KT
Back
Top Bottom