Tổng hợp dữ liệu từ file khác (10 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

ketoanvien1985

Thành viên mới
Tham gia
8/7/15
Bài viết
33
Được thích
0
Xin chào anh chị GPE,

Em có tìm hiểu trên web nhưng nhiều dạng quá, em k biết áp dụng theo cái nào nên nhờ anh chị giúp em code VBA.
Em muốn lấy dữ liệu từ file data để cập nhật vào file Tonghopdulieu theo các yêu cầu sau:

1- File Data: Nếu C = "" thì copy từ [D:F] ( lưu ý chỉ copy những dòng có C ="")

2- File Tonghopdulieu:

- cells D2 bên Data sẽ được copy vào cells A4 bên file TongHop

- D, E, F bên Data sẽ được copy vào B,C,D bên file TongHop

> Nếu tại cột C, D đã có giá trị giống E,F bên file Data thì so sánh tiếp cột E, nếu cột E đã có dữ liệu thì bỏ qua, ngược lại nếu E trắng thì copy đè lên C,D bình thường

Em miêu tả nếu chưa rõ chổ nào mong anh chị góp ý giúp nha.
 

File đính kèm

Xin chào anh chị GPE,

Em có tìm hiểu trên web nhưng nhiều dạng quá, em k biết áp dụng theo cái nào nên nhờ anh chị giúp em code VBA.
Em muốn lấy dữ liệu từ file data để cập nhật vào file Tonghopdulieu theo các yêu cầu sau:

1- File Data: Nếu C = "" thì copy từ [D:F] ( lưu ý chỉ copy những dòng có C ="")

2- File Tonghopdulieu:

- cells D2 bên Data sẽ được copy vào cells A4 bên file TongHop

- D, E, F bên Data sẽ được copy vào B,C,D bên file TongHop

> Nếu tại cột C, D đã có giá trị giống E,F bên file Data thì so sánh tiếp cột E, nếu cột E đã có dữ liệu thì bỏ qua, ngược lại nếu E trắng thì copy đè lên C,D bình thường

Em miêu tả nếu chưa rõ chổ nào mong anh chị góp ý giúp nha.
đọc tới đọc lui cũng muốn viết một cái code cho bạn nhưng ko biết bạn muốn gì .....bạn mô tả lại kết quả bạn mong muốn trên file Tonghopdulieu mình coi nếu được mình làm cho
 
Upvote 0
đọc tới đọc lui cũng muốn viết một cái code cho bạn nhưng ko biết bạn muốn gì .....bạn mô tả lại kết quả bạn mong muốn trên file Tonghopdulieu mình coi nếu được mình làm cho

Cảm ơn anh Kieu manh đã thông tin,

Anh xem file em gửi lên nha, cụ thể em muốn copy dữ liệu từ file data sang file Tonghopdulieu nhưng theo điều kiện là:

Nếu bên file Data có số PO và số HĐ trùng với bên file Tonghopdulieu thì nó phải xem cột E có dữ liệu hay không, nếu có thì nó bỏ qua số PO và Số HĐ đó, tiếp tục copy các dòng còn lại. Còn nếu cột E mà chưa có dữ liệu gì cả thì nó sẽ copy đè cái mới lên.

Ví dụ trong file mẫu:
Dòng 5 và 9 sẽ giữ nguyên khi em lấy dữ liệu từ file Data. Các dòng khác sẽ được cập nhật lại giá trị từ file Data.

Anh Kieumanh xem đã đủ thông tin chưa nha.
 

File đính kèm

Upvote 0
bạn diễn tả sao tôi không hiểu . tôi cứ lấy những dòng C="" của file Data.xlsx ghi nối vào sheet1 của file TongHopdulieu
chờ bạn giải thích thêm
 

File đính kèm

Upvote 0
bạn diễn tả sao tôi không hiểu . tôi cứ lấy những dòng C="" của file Data.xlsx ghi nối vào sheet1 của file TongHopdulieu
chờ bạn giải thích thêm
Cảm ơn anh doveandrose,
em diễn đạt hơi kém, để em diễn đạt theo lập trình xem sao nha
dim NCC_DATA as NCC trên file Data
dim PO_DATA as PO trên file Data
dim HD_DATA as HD trên file Data
dim PO_TONGHOP as PO trên file TONGHOP
dim HD_TONGHOP as HD trên file TONGHOP
dim ND_TONGHOP as ND trên file TONGHOP
with file data
Copy NCC_DATA
Copy PO_DATA
Copy HD_DATA
End with
With file TONGHOP
IF PO_DATA = PO_TONGHOP then
IF HD_DATA = HD_TONGHOP then
IF ND_TONGHOP = "" then
Paste (NCC_DATA, PO_DATA, HD_DATA)
Else
Bỏ qua
End if
End if
Else
Paste (NCC_DATA, PO_DATA, HD_DATA)
End if
End With

Vì file này em sẽ lấy dữ liệu nhiều lần từ file data nên chỉ cần thêm vào những cái thay đổi mà thôi.

File của anh hình như phải đặt file Data chung folder với file Tonghop mới chạy được, anh giúp em chuyển dạng GetopenFile giúp em nha.

Cảm ơn anh rất nhiều
 
Upvote 0
Nếu bên file Data có số PO và số HĐ trùng với bên file Tonghopdulieu thì nó phải xem cột E có dữ liệu hay không, nếu có thì nó bỏ qua số PO và Số HĐ đó, tiếp tục copy các dòng còn lại. Còn nếu cột E mà chưa có dữ liệu gì cả thì nó sẽ copy đè cái mới lên.
trong file tonghopdulieu bạn đưa lên thì cột Số HĐ trống trơn mà bạn biểu tôi đi so sánh ? bạn đang đùa giỡn ????
 
Upvote 0
trong file tonghopdulieu bạn đưa lên thì cột Số HĐ trống trơn mà bạn biểu tôi đi so sánh ? bạn đang đùa giỡn ????
!$@!! Em đang cần giúp mà đùa giỡn gì đâu anh. anh xem trong sheet mẫu của em đó
Số HĐ trống thì cứ thế nó paste giá trị mới vào anh ơi, lần đầu thì bên bảng Tonghop chưa có thông số gì thì trống là đúng rồi, a sẽ lấy dữ liệu từ Data sang, nhưng nếu anh lấy dữ liệu lần 2, lần 3 thì nó mới bắt đầu so sánh các trường hợp như trên.
 
Upvote 0
!$@!! Em đang cần giúp mà đùa giỡn gì đâu anh. anh xem trong sheet mẫu của em đó
Số HĐ trống thì cứ thế nó paste giá trị mới vào anh ơi, lần đầu thì bên bảng Tonghop chưa có thông số gì thì trống là đúng rồi, a sẽ lấy dữ liệu từ Data sang, nhưng nếu anh lấy dữ liệu lần 2, lần 3 thì nó mới bắt đầu so sánh các trường hợp như trên.
ý của bạn là muốn lọc duy nhất theo số Số HĐ từ File Data lên phải ko vậy

NẾU VẬY sử dụng
dictionary là giải quyết Ok
 
Lần chỉnh sửa cuối:
Upvote 0
ý của bạn là muốn lọc duy nhất theo số Số HĐ từ File Data lên phải ko vậy

NẾU VẬY sử dụng
dictionary là giải quyết Ok

Bắt đầu rối lên rồi,hjc hjc.

Em gửi lên lại cái file, trong sheet1, đang có 3 dòng dữ liệu, các anh làm cách nào mà copy Nhà Cung Cấp, Số PO, Số HĐ vào đó giúp em nhưng phải giữ lại được giúp em dòng 5 và dòng 7 ( vì 2 dòng này cột Nội dung đang có dữ liệu), các dòng khác cứ paste số liệu mới từ data vào.
 

File đính kèm

Upvote 0
Bắt đầu rối lên rồi,hjc hjc.

Em gửi lên lại cái file, trong sheet1, đang có 3 dòng dữ liệu, các anh làm cách nào mà copy Nhà Cung Cấp, Số PO, Số HĐ vào đó giúp em nhưng phải giữ lại được giúp em dòng 5 và dòng 7 ( vì 2 dòng này cột Nội dung đang có dữ liệu), các dòng khác cứ paste số liệu mới từ data vào.
lỡ tham gia rồi +-+-+-+... bài #4 viết cho bạn bằng ADO rồi vậy mình viết cho bạn bằng VBA từ code lấy dữ liệu File đóng đó coi mà chế nha....khó hiểu quá nên đành vậy đi --=0--=0--=0
PHP:
Sub LayDuLieu_ABC()
Application.ScreenUpdating = False
    Dim Arr(), Res(), i As Long, j As Long, k As Long
    With Workbooks.Open(ThisWorkbook.Path & "\Data.xlsx", 0)
       With .Sheets("Sheet1")
          Arr = .Range("D4", .[D65536].End(3)).Resize(, 3).Value
       End With
       .Close False
    End With
    ReDim Res(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))     
    For i = 1 To UBound(Arr, 1)
         If Arr(i, 3) <> Empty Then
             k = k + 1
             For j = 1 To UBound(Arr, 2)
                   Res(k, j) = Arr(i, j)
             Next
        End If
    Next
    Range("B4:D65536").ClearContents
    Range("B4").Resize(UBound(Arr, 1), UBound(Arr, 2)) = Res
    Range("D4").Resize(k, 1).NumberFormat = "@"
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
lỡ tham gia rồi +-+-+-+... bài #4 viết cho bạn bằng ADO rồi vậy mình viết cho bạn bằng VBA từ code lấy dữ liệu File đóng đó coi mà chế nha....khó hiểu quá nên đành vậy đi --=0--=0--=0
PHP:
Sub LayDuLieu_ABC()
Application.ScreenUpdating = False
    Dim Arr(), Res(), i As Long, j As Long, k As Long
    With Workbooks.Open(ThisWorkbook.Path & "\Data.xlsx", 0)
       With .Sheets("Sheet1")
          Arr = .Range("D4", .[D65536].End(3)).Resize(, 3).Value
       End With
       .Close False
    End With
    ReDim Res(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))     
    For i = 1 To UBound(Arr, 1)
         If Arr(i, 3) <> Empty Then
             k = k + 1
             For j = 1 To UBound(Arr, 2)
                   Res(k, j) = Arr(i, j)
             Next
        End If
    Next
    Range("B4:D65536").ClearContents
    Range("B4").Resize(UBound(Arr, 1), UBound(Arr, 2)) = Res
    Range("D4").Resize(k, 1).NumberFormat = "@"
Application.ScreenUpdating = True
End Sub
Cảm ơn anh Kieumanh,

Code này lấy dữ liệu ok rồi, nhưng anh đang đi sai hướng, số HĐ = "" vẫn copy bình thường k sao đâu anh.
Để em giải thích lại nha, em nghĩ cách này đơn giản hơn

Khi anh chạy code:

1- Bên form Tonghop, tại cột E các dòng = "" sẽ bị xóa.

2- Copy dữ liệu lại từ data sang, nhưng k được trùng các mã số PO, và số HĐ đang có trong form Tonghop. ( Các dòng mới thêm vào sẽ nằm tiếp theo các dòng hiện tại trong form Tonghop)


Em nghĩ cách giải thích này ok hơn đúng k anh, em không giỏi trình bày, mong các anh thông cảm

Nhờ anh chỉnh lại giúp em nha
 
Upvote 0
lỡ tham gia rồi +-+-+-+... bài #4 viết cho bạn bằng ADO rồi vậy mình viết cho bạn bằng VBA từ code lấy dữ liệu File đóng đó coi mà chế nha....khó hiểu quá nên đành vậy đi --=0--=0--=0
PHP:
Sub LayDuLieu_ABC()
Application.ScreenUpdating = False
    Dim Arr(), Res(), i As Long, j As Long, k As Long
    With Workbooks.Open(ThisWorkbook.Path & "\Data.xlsx", 0)
       With .Sheets("Sheet1")
          Arr = .Range("D4", .[D65536].End(3)).Resize(, 3).Value
       End With
       .Close False
    End With
    ReDim Res(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))     
    For i = 1 To UBound(Arr, 1)
         If Arr(i, 3) <> Empty Then
             k = k + 1
             For j = 1 To UBound(Arr, 2)
                   Res(k, j) = Arr(i, j)
             Next
        End If
    Next
    Range("B4:D65536").ClearContents
    Range("B4").Resize(UBound(Arr, 1), UBound(Arr, 2)) = Res
    Range("D4").Resize(k, 1).NumberFormat = "@"
Application.ScreenUpdating = True
End Sub
Cảm ơn anh Kieumanh,

Code này lấy dữ liệu ok rồi, nhưng anh đang đi sai hướng, số HĐ = "" vẫn copy bình thường k sao đâu anh.
Để em giải thích lại nha, em nghĩ cách này đơn giản hơn

Khi anh chạy code:

1- Bên form Tonghop, tại cột E các dòng = "" sẽ bị xóa. >> các dòng có dữ liệu sẽ gôm lại gần nhau

2- Copy dữ liệu lại từ data sang, nhưng k được trùng các mã số PO, và số HĐ đang có trong form Tonghop. ( Các dòng mới thêm vào sẽ nằm tiếp theo các dòng hiện tại trong form Tonghop)


Em nghĩ cách giải thích này ok hơn đúng k anh, em không giỏi trình bày, mong các anh thông cảm

Nhờ anh chỉnh lại giúp em nha
 
Upvote 0
Cảm ơn anh Kieumanh,

Code này lấy dữ liệu ok rồi, nhưng anh đang đi sai hướng, số HĐ = "" vẫn copy bình thường k sao đâu anh.
Để em giải thích lại nha, em nghĩ cách này đơn giản hơn

Khi anh chạy code:

1- Bên form Tonghop, tại cột E các dòng = "" sẽ bị xóa. >> các dòng có dữ liệu sẽ gôm lại gần nhau

2- Copy dữ liệu lại từ data sang, nhưng k được trùng các mã số PO, và số HĐ đang có trong form Tonghop. ( Các dòng mới thêm vào sẽ nằm tiếp theo các dòng hiện tại trong form Tonghop)


Em nghĩ cách giải thích này ok hơn đúng k anh, em không giỏi trình bày, mong các anh thông cảm

Nhờ anh chỉnh lại giúp em nha
Cái này là cái gì vậy số HĐ = "" Tiếng viết ko ra tiếng việt code ko ra code ...lai căng tùm lum
mình viết cho bạn xét theo cột Số HĐ nếu có mới lấy mà coi lại đi....
 
Upvote 0
Cái này là cái gì vậy số HĐ = "" Tiếng viết ko ra tiếng việt code ko ra code ...lai căng tùm lum
mình viết cho bạn xét theo cột Số HĐ nếu có mới lấy mà coi lại đi....
Số HĐ là Số Hóa Đơn đó anh. HĐ = "" cột HĐ k có giá trị
Có số PO mà không có số HĐ cũng copy luôn anh nha, miễn là khi copy qua Tonghop,nếu bên Tonghop đã có số PO và Số HĐ đó rồi thì nó ko copy thêm lần nữa
 
Upvote 0
Code lấy lên nối đuôi nhau và xóa dữ liệu cột D trống nếu muốn thay đổi cột khác thì sửa lại code
PHP:
Sub LayDuLieu_ABC2()
Application.ScreenUpdating = False
    On Error Resume Next
    Dim Arr(), Res(), i As Long, j As Long, k As Long
    With Workbooks.Open(ThisWorkbook.Path & "\Data.xlsx", 0)
       With .Sheets("Sheet1")
          Arr = .Range("D4", .[D65536].End(3)).Resize(, 3).Value
       End With
       .Close False
    End With
    ReDim Res(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    For i = 1 To UBound(Arr, 1)
        If Arr(i, 3) <> Empty Then
            k = k + 1
            For j = 1 To UBound(Arr, 2)
                Res(k, j) = Arr(i, j)
            Next
        End If
    Next
    Range("D4", [D65536].End(3)).SpecialCells(4).EntireRow.Delete
    Range("B65536").End(3)(2).Resize(UBound(Arr, 1), UBound(Arr, 2)) = Res    
    Range("B4", [B65536].End(3)).Offset(, -1) = [row(A:A)]
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Code lấy lên nối đuôi nhau và xóa dữ liệu cột D trống nếu muốn thay đổi cột khác thì sửa lại code
PHP:
Sub LayDuLieu_ABC2()
Application.ScreenUpdating = False
    On Error Resume Next
    Dim Arr(), Res(), i As Long, j As Long, k As Long
    With Workbooks.Open(ThisWorkbook.Path & "\Data.xlsx", 0)
       With .Sheets("Sheet1")
          Arr = .Range("D4", .[D65536].End(3)).Resize(, 3).Value
       End With
       .Close False
    End With
    ReDim Res(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    For i = 1 To UBound(Arr, 1)
        If Arr(i, 3) <> Empty Then
            k = k + 1
            For j = 1 To UBound(Arr, 2)
                Res(k, j) = Arr(i, j)
            Next
        End If
    Next
    Range("D4", [D65536].End(3)).SpecialCells(4).EntireRow.Delete
    Range("B65536").End(3)(2).Resize(UBound(Arr, 1), UBound(Arr, 2)) = Res    
    Range("B4", [B65536].End(3)).Offset(, -1) = [row(A:A)]
Application.ScreenUpdating = True
End Sub
Cảm ơn anh Kieumanh nhiều.
Code này sẽ kế tiếp nhau hoài luôn, như thế sẽ có nhiều hàng trùng nhau,nhờ anh giúp em 1 đoạn code nữa để delete các hàng trùng nhau nha. sao cho các hàng trùng nhau thì chỉ giữ lại hàng trên cùng thôi, còn lại xóa hết.

Chú ý: Các dòng phải giống nhau cả số PO và Số HĐ thì mới được xóa.
 
Upvote 0
Cảm ơn anh Kieumanh nhiều.
Code này sẽ kế tiếp nhau hoài luôn, như thế sẽ có nhiều hàng trùng nhau,nhờ anh giúp em 1 đoạn code nữa để delete các hàng trùng nhau nha. sao cho các hàng trùng nhau thì chỉ giữ lại hàng trên cùng thôi, còn lại xóa hết.

Chú ý: Các dòng phải giống nhau cả số PO và Số HĐ thì mới được xóa.
Một lần cuối nha......Sử dụng Dic lọc duy nhất code cơ bản là vậy nếu thích kiểu khác tự chế lại theo yêu cầu của mình ......chào Bạn Mình Chạy nhé+-+-+-+--=0
PHP:
Sub Dic_LayDuLieu()
Application.ScreenUpdating = False
    Dim Arr(), Res(), i As Long, k As Long
    With Workbooks.Open(ThisWorkbook.Path & "\Data.xlsx", 0)
       With .Sheets("Sheet1")
          Arr = .Range("D4", .[D65536].End(3)).Resize(, 3).Value
       End With
       .Close False
    End With
    ReDim Res(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    With CreateObject("scripting.dictionary")
        For i = 1 To UBound(Arr, 1)
           If Not .Exists(Arr(i, 3)) Then
                If Arr(i, 3) <> Empty Then
                    k = k + 1
                    .Add Arr(i, 3), k
                    Res(k, 1) = Arr(i, 1)
                    Res(k, 2) = Arr(i, 2)
                    Res(k, 3) = Arr(i, 3)
                End If
            End If
        Next
        Range("A4:D65536").ClearContents
        Range("B4").Resize(UBound(Arr, 1), UBound(Arr, 2)) = Res
    End With
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Một lần cuối nha......Sử dụng Dic lọc duy nhất code cơ bản là vậy nếu thích kiểu khác tự chế lại theo yêu cầu của mình ......chào Bạn Mình Chạy nhé+-+-+-+--=0
PHP:
Sub Dic_LayDuLieu()
Application.ScreenUpdating = False
    Dim Arr(), Res(), i As Long, k As Long
    With Workbooks.Open(ThisWorkbook.Path & "\Data.xlsx", 0)
       With .Sheets("Sheet1")
          Arr = .Range("D4", .[D65536].End(3)).Resize(, 3).Value
       End With
       .Close False
    End With
    ReDim Res(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    With CreateObject("scripting.dictionary")
        For i = 1 To UBound(Arr, 1)
           If Not .Exists(Arr(i, 3)) Then
                If Arr(i, 3) <> Empty Then
                    k = k + 1
                    .Add Arr(i, 3), k
                    Res(k, 1) = Arr(i, 1)
                    Res(k, 2) = Arr(i, 2)
                    Res(k, 3) = Arr(i, 3)
                End If
            End If
        Next
        Range("A4:D65536").ClearContents
        Range("B4").Resize(UBound(Arr, 1), UBound(Arr, 2)) = Res
    End With
Application.ScreenUpdating = True
End Sub
Chưa biết gì về cái này, nhưng dù sao cũng cảm ơn anh Kieumanh nhiều nha.
 
Upvote 0
Web KT

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

Back
Top Bottom