Code VBA copy dữ liệu

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

VU.NGO

Thành viên mới
Tham gia
1/5/23
Bài viết
22
Được thích
3
Em chào mọi người! (do chưa nhận được 1 câu trả lời nào lên em xin phép đăng lại)
Em có 2 file excel:
* 1 file tên "NTP_Data" ở đường dẫn : D:\Data\ ( đây là file nằm trên ổ chung, mọi người trong công ty đều có thể chỉnh sửa)
* 1 file tên "NTP_Copy" ở đường dẫn : E:\Save\ ( đây là file nằm trên máy tính cá nhân của em- em chỉnh sửa riêng)
Em nhờ các anh chị viết giúp code vba để COPY dữ liệu, code này nằm trong sự kiện mở file Workbook_Open của file thứ 2 ("NTP_Copy"). để mỗi khi mở file excel thứ 2 này(NTP_Copy) thì code vba sẽ tự động copy phần dữ liệu đã được nhập thêm ở trong file excel thứ nhất (NTP_Data) (lưu ý dữ liệu bao gồm cả văn bản và hình ảnh)
Em mong muốn chỉ copy phần dữ liệu được nhập mới vào thôi ạ, vì phần dữ liệu cũ sẽ được chỉnh sửa.
(Nếu code dựa được vào thời gian lưu file dữ liệu --> Sau đó copy tthì tốt, nếu không được chắc phải dựa vào tham số "ngày" ở trong cột B của dữ liệu)
Em cảm ơn cả nhà ạ !!!!!
1683890783549.png
 

File đính kèm

  • NTP_Copy.xlsx
    1.5 MB · Đọc: 7
  • NTP_DATA.xlsx
    2.5 MB · Đọc: 9
làm sao VBA nó biết chọn vùng nào bên data để copy?
 
Upvote 0
Em chào mọi người! (do chưa nhận được 1 câu trả lời nào lên em xin phép đăng lại)
Em có 2 file excel:
* 1 file tên "NTP_Data" ở đường dẫn : D:\Data\ ( đây là file nằm trên ổ chung, mọi người trong công ty đều có thể chỉnh sửa)
* 1 file tên "NTP_Copy" ở đường dẫn : E:\Save\ ( đây là file nằm trên máy tính cá nhân của em- em chỉnh sửa riêng)
Em nhờ các anh chị viết giúp code vba để COPY dữ liệu, code này nằm trong sự kiện mở file Workbook_Open của file thứ 2 ("NTP_Copy"). để mỗi khi mở file excel thứ 2 này(NTP_Copy) thì code vba sẽ tự động copy phần dữ liệu đã được nhập thêm ở trong file excel thứ nhất (NTP_Data) (lưu ý dữ liệu bao gồm cả văn bản và hình ảnh)
Em mong muốn chỉ copy phần dữ liệu được nhập mới vào thôi ạ, vì phần dữ liệu cũ sẽ được chỉnh sửa.
(Nếu code dựa được vào thời gian lưu file dữ liệu --> Sau đó copy tthì tốt, nếu không được chắc phải dựa vào tham số "ngày" ở trong cột B của dữ liệu)
Em cảm ơn cả nhà ạ !!!!!
Bạn chạy file, nếu bị báo lỗi thì bấm debug sửa lại đường dẫn file NTP_Data.xlsx trong code theo trên máy bạn. Còn nếu không báo gì nghĩa là nó đã chép dữ liệu xong. Bạn kiểm tra lại khối dữ liệu đã chép xem.
 

File đính kèm

  • NTP_Copy_VU.NGO.xlsm
    2.5 MB · Đọc: 12
Upvote 0
Bạn chạy file, nếu bị báo lỗi thì bấm debug sửa lại đường dẫn file NTP_Data.xlsx trong code theo trên máy bạn. Còn nếu không báo gì nghĩa là nó đã chép dữ liệu xong. Bạn kiểm tra lại khối dữ liệu đã chép xem.
Cảm ơn bác, code đã hoạt động ra kết quả, nhưng có một số vấn đề như sau :
1- Ngay cả khi file nguồn NTP_DATA không được cập nhập thêm dữ liệu, khi mở file NTP_Copy code vẫn tự nhân lên, sao chép dòng cuối cùng mỗi khi mở file ạ
1684028789047.png


2- Theo em hiểu code của bác đang so sánh 2 DÒNG CUỐI CÙNG ở 2 file NTP_DATA và NTP_Copy, nếu giống nhau thì copy xuống dòng kế tiếp vào file NTP_Copy . Cái này OK ạ.
Tuy nhiên trường hợp trong các cột B,C,D,E,F chỉ cần 1 DÒNG CUỐI của 1 ô nào đó không giống nhau( trường hợp này thường xuyên xảy ra vì dữ liệu sẽ được nhập thêm vào thường xuyên), thì code sẽ copy THÊM toàn bộ dữ liệu từ cũ nhất đến mới nhất
Ví dụ nhập thêm chữ ABC vào dòng cuối file NTP_DATA
1684034933617.png

Thì kết quả sẽ là dữ liệu được copy thêm là: dữ liệu từ cũ nhất đến mới nhất ( tức là gấp đôi lên)
1684035135703.png

3- Code chạy xong sẽ đóng file nguồn, Mà file nguồn ở công ty em đang được dùng trên ổ chung , nên thường xuyên được người khác mở, việc file đang mở mà bị đóng sẽ phiền cho người khác.
Bác sửa giúp em đoạn này:
- nếu file nguồn đang đóng thì mở ra COPY xong rồi đóng,
- nếu file nguồn đang mở thì COPY bình thường không đóng ,cho em được không


4- Em thêm 1 số hình ảnh vào file nguồn, nhưng chưa được copy vào file COPY ạ

1684028994241.png

Bác xem giúp em 1 số điểm trên với ạ.
 

File đính kèm

  • 1684028952438.png
    1684028952438.png
    231.4 KB · Đọc: 6
Upvote 0
Bạn giải thích lòng vòng quá mà không gửi file để xem lỗi thế nào.
 
Upvote 0
Thay bằng code này, nếu trật tính tiếp:
Rich (BB code):
Private Sub Workbook_Open()
Dim sWb As Workbook, tWb As Workbook, sWs As Worksheet, tWs As Worksheet, Wb As Workbook
Dim i&, endR&, startR&
Dim sKey$, sDataName$, bChk As Boolean
    Set tWb = ThisWorkbook
    Set tWs = tWb.Sheets(1)
    sDataName = "D:\GPE_Download\VUNGO\NTP_DATA.xlsx"   'CHU Y: Sua duong dan file
    Application.ScreenUpdating = False
    With tWs
        endR = .Range("B" & Rows.Count).End(xlUp).Row
        sKey = .Range("B" & endR) & "|" & .Range("C" & endR) & "|" & .Range("D" & endR) _
             & "|" & .Range("E" & endR) & "|" & .Range("F" & endR)
        For Each Wb In Workbooks
            If Wb.Name = "NTP_DATA.xlsx" Then
                Set sWb = Wb: bChk = True: Exit For
            End If
        Next
        If bChk = False Then Set sWb = Workbooks.Open(sDataName)
                    
        Set sWs = sWb.Sheets(1)
        endR = sWs.Range("B" & Rows.Count).End(xlUp).Row
        For i = endR To 1 Step -1
            If sWs.Range("B" & i) & "|" & sWs.Range("C" & i) & "|" & sWs.Range("D" & i) _
             & "|" & sWs.Range("E" & i) & "|" & sWs.Range("F" & i) = sKey Then Exit For
        Next
        If i <> 0 Then
            sWs.Range("A" & i + 1 & ":A" & endR + 20).EntireRow.Copy .Range("A" & .Range("B" & Rows.Count).End(xlUp).Row + 1)
        End If
    End With
    If bChk = False Then sWb.Close False
    Application.ScreenUpdating = True
    Set tWb = Nothing
    Set sWb = Nothing
    Set tWs = Nothing
    Set sWs = Nothing

End Sub
 
Upvote 0
Thay bằng code này, nếu trật tính tiếp:
Rich (BB code):
Private Sub Workbook_Open()
Dim sWb As Workbook, tWb As Workbook, sWs As Worksheet, tWs As Worksheet, Wb As Workbook
Dim i&, endR&, startR&
Dim sKey$, sDataName$, bChk As Boolean
    Set tWb = ThisWorkbook
    Set tWs = tWb.Sheets(1)
    sDataName = "D:\GPE_Download\VUNGO\NTP_DATA.xlsx"   'CHU Y: Sua duong dan file
    Application.ScreenUpdating = False
    With tWs
        endR = .Range("B" & Rows.Count).End(xlUp).Row
        sKey = .Range("B" & endR) & "|" & .Range("C" & endR) & "|" & .Range("D" & endR) _
             & "|" & .Range("E" & endR) & "|" & .Range("F" & endR)
        For Each Wb In Workbooks
            If Wb.Name = "NTP_DATA.xlsx" Then
                Set sWb = Wb: bChk = True: Exit For
            End If
        Next
        If bChk = False Then Set sWb = Workbooks.Open(sDataName)
                   
        Set sWs = sWb.Sheets(1)
        endR = sWs.Range("B" & Rows.Count).End(xlUp).Row
        For i = endR To 1 Step -1
            If sWs.Range("B" & i) & "|" & sWs.Range("C" & i) & "|" & sWs.Range("D" & i) _
             & "|" & sWs.Range("E" & i) & "|" & sWs.Range("F" & i) = sKey Then Exit For
        Next
        If i <> 0 Then
            sWs.Range("A" & i + 1 & ":A" & endR + 20).EntireRow.Copy .Range("A" & .Range("B" & Rows.Count).End(xlUp).Row + 1)
        End If
    End With
    If bChk = False Then sWb.Close False
    Application.ScreenUpdating = True
    Set tWb = Nothing
    Set sWb = Nothing
    Set tWs = Nothing
    Set sWs = Nothing

End Sub
Dạ trên có 4 ý thì: Ý 1, 3,4 đã chạy được rồi ạ
Còn ý thứ 2 chưa được ạ.
Ở file nguồn, nếu gõ thêm dữ liệu vào dòng cuối cùng thì từ dòng đó về sau nó không copy được nữa ạ.

1684041138471.png
 

File đính kèm

  • NTP_DATA.xlsx
    2.5 MB · Đọc: 5
  • NTP_Copy_VU.NGO.xlsm
    2.5 MB · Đọc: 4
Upvote 0
Dạ trên có 4 ý thì: Ý 1, 3,4 đã chạy được rồi ạ
Còn ý thứ 2 chưa được ạ.
Ở file nguồn, nếu gõ thêm dữ liệu vào dòng cuối cùng thì từ dòng đó về sau nó không copy được nữa ạ.
Vậy là ổn rồi đó. Chỉ cần thêm 1 thủ thuật nữa là xong.
 
Upvote 0
Dạ cái đó lại là hay dùng nhất bác ạ, hiện tại nếu dòng cuối cùng bên file "NTP_Copy" mà không trùng với dòng cuối bên file nguồn "NTP_Data" code sẽ không chay.
Bác sửa giúp em với.
Tôi đâu có nói là không sửa, chỉ là cần thêm 1 thủ thuật nữa là xong mà.

Nói cho rõ chút là mỗi dòng của một csdl thì luôn có một khóa chính không bao giờ trùng với dòng khác. Vấn đề là có cần thiết phải tạo khoá hay không vì nó sẽ thêm gánh nặng cho csdl. Trường hợp của bạn không có khóa chính thì lấy cả 5 cột để tạo 1 khóa chính là ăn chắc, không ngờ ở file xử lý lại bị tự ý sửa khóa. Lẽ ra muốn ghi chú thì thêm 1 cột mới nhưng đằng này lại gõ thêm vào cột F. Điều đó là không nên.

Bây giờ tôi ghi thêm 1 cột nữa giống hệt cột F để làm nguồn cho khoá chính. Bạn sửa cột F thoải mái, vấn đề 2 sẽ xem như đã được giải quyết.

Nếu bạn thấy: À! chỉ cần ghi chú vào một riêng thì tốt, không cần phải sửa code nữa.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đâu có nói là không sửa, chỉ là cần thêm 1 thủ thuật nữa là xong mà.

Nói cho rõ chút là mỗi dòng của một csdl thì luôn có một khóa chính không bao giờ trùng với dòng khác. Vấn đề là có cần thiết phải tạo khoá hay không vì nó sẽ thêm gánh nặng cho csdl. Trường hợp của bạn không có khóa chính thì lấy cả 5 cột để tạo 1 khóa chính là ăn chắc, không ngờ ở file xử lý lại bị tự ý sửa khóa. Lẽ ra muốn ghi chú thì thêm 1 cột mới nhưng đằng này lại gõ thêm vào cột F. Điều đó là không nên.

Bây giờ tôi ghi thêm 1 cột nữa giống hệt cột F để làm nguồn cho khoá chính. Bạn sửa cột F thoải mái, vấn đề 2 đã được giải quyết.

Nếu bạn thấy: À! chỉ cần ghi chú vào một riêng thì tốt, không cần phải sửa code nữa.
Em xin lỗi trong khuôn khổ ví dụ, em đã lấy dữ liệu cột F đơn giản, em xin được giải thích thêm chút: . Thực tế trong Dữ liệu nguồn file "NTP_Data" ở cột F là cột nhiều người dùng nhập dữ liệu,dạng hỏi đáp, nên nó thường xuyên được nhập thêm dữ liệu,
.Em đang suy nghĩ: Lấy 5 cột là khóa chính cũng được, trường hợp bị sửa khóa ở file nguồn( hoặc không tìm thấy khóa), thì lấy lên trên 1 dòng (hoặc những dòng phía trên) để làm khóa
bác xem giúp em với ạ.
1684070850568.png
 

File đính kèm

  • NTP_DATA.xlsx
    2.5 MB · Đọc: 5
Upvote 0
Vậy thì tôi gợi ý lấy cột A để đánh số thứ tự dòng và làm khoá chính luôn.

Nếu bạn chấp nhận thì làm luôn, code dễ hơn.
 
Upvote 0
Vậy thì tôi gợi ý lấy cột A để đánh số thứ tự dòng và làm khoá chính luôn.

Nếu bạn chấp nhận thì làm luôn, code dễ hơn.
Dạ file nguồn em không được thay đổi định dạng form. Lấy ngày trong cột B làm khóa chính được không bác, nếu có mấy ngày trùng nhau thì bắt đầu lấy từ dòng ngày đầu tiên , sau đó copy, đè lên ạ ( như ảnh ví dụ nó sẽ copy từ dòng 489 đè dòng 490-493)
1684072417773.png
 
Upvote 0
Dạ file nguồn em không được thay đổi định dạng form. Lấy ngày trong cột B làm khóa chính được không bác, nếu có mấy ngày trùng nhau thì bắt đầu lấy từ dòng ngày đầu tiên , sau đó copy, đè lên ạ ( như ảnh ví dụ nó sẽ copy từ dòng 489 đè dòng 490-493)
View attachment 290159
Thôi, để lấy thứ tự dòng làm khoá chính vậy. Số dòng 2 bên phải bằng nhau. Nếu không bằng thì lấy data qua nhé.
 
Upvote 0
Vậy đây chắc là đáp án cuối cùng :)
Dạ cảm ơn bác, về cơ bản đã giải quyết được công việc ạ. Bác có thể chỉnh sửa thêm giúp em thêm phần: Nếu bên file data bị xóa thì bên file copy cũng bị xóa theo ạ. Hiện tại chỉ có copy thêm vào, chứ xóa dòng bên NTP_DATA thì file "NTP_Copy" nó không xóa theo ạ.
 
Upvote 0
Dạ cảm ơn bác, về cơ bản đã giải quyết được công việc ạ. Bác có thể chỉnh sửa thêm giúp em thêm phần: Nếu bên file data bị xóa thì bên file copy cũng bị xóa theo ạ. Hiện tại chỉ có copy thêm vào, chứ xóa dòng bên NTP_DATA thì file "NTP_Copy" nó không xóa theo ạ.
Tôi tưởng là data chỉ có phát sinh thêm chứ nhỉ :D
 
Upvote 0
Web KT
Back
Top Bottom