Làm sao Import dữ liệu từ file Excel vào Access chỉ cập nhật các bản thay đổi

Liên hệ QC

antrung8384

Thành viên mới
Tham gia
10/12/08
Bài viết
26
Được thích
0
Tôi có 1 file access 2003 như đính kèm, và 01 file excel có chứa dữ liệu, file Excel của tôi dữ liệu thay đổi từng ngày, thôgn thường cứ mỗi tuần sẽ lấy file excel đó 1 lần và đưa vào table TỔNG HỢP DỮ LIỆU (trong file đính kèm). Tôi đã tham khảo và mong muốn tạo 1 form để chọn file, rồi import dữ liệu của file excel vào access với yêu cầu như sau:
- File excel có thể chứa các dữ liệu trong access đang có cộng với các bản ghi mới hơn so với thời điểm trước cập nhật vào Access
- Sau khi Import xong, trên table của access phải có nội dung giống hệt nội dung trên file excel -->tôi nghĩ đến phương án là trong cùng 1 lần import, trước hết xóa trống các bản ghi của table trong access rồi import các bản ghi của file excel vào nhưng ko biết làm thế nào.
Câu hỏi của tôi có phần lủng cùng, rất mong các bạn xem và giúp tôi giải pháp tốt nhất cho vấn đề này
Xin cảm ơn!
File đính kèm
01 file access có dữ liệu cũ
01 file excel có dữ liệu mới cần cập nhật.
 

File đính kèm

  • Post4rum_24082011.rar
    415.3 KB · Đọc: 283
Tôi có 1 file access 2003 như đính kèm, và 01 file excel có chứa dữ liệu, file Excel của tôi dữ liệu thay đổi từng ngày, thôgn thường cứ mỗi tuần sẽ lấy file excel đó 1 lần và đưa vào table TỔNG HỢP DỮ LIỆU (trong file đính kèm). Tôi đã tham khảo và mong muốn tạo 1 form để chọn file, rồi import dữ liệu của file excel vào access với yêu cầu như sau:
- File excel có thể chứa các dữ liệu trong access đang có cộng với các bản ghi mới hơn so với thời điểm trước cập nhật vào Access
- Sau khi Import xong, trên table của access phải có nội dung giống hệt nội dung trên file excel -->tôi nghĩ đến phương án là trong cùng 1 lần import, trước hết xóa trống các bản ghi của table trong access rồi import các bản ghi của file excel vào nhưng ko biết làm thế nào.
Câu hỏi của tôi có phần lủng cùng, rất mong các bạn xem và giúp tôi giải pháp tốt nhất cho vấn đề này
Xin cảm ơn!
File đính kèm
01 file access có dữ liệu cũ
01 file excel có dữ liệu mới cần cập nhật.

Bạn lưu ý cách đặt tên file và tên sheet càng gọn càng tốt, và cũng tránh viết Tiếng Việt có dấu cho các trường, tên bảng và tên file để khỏi gặp rắc rối sau này.

Bạn chuẩn bị làm như sau
- Vẽ 1 form.
- Vẽ 1 Command Button. (Name: cmdTimtapTin)
- Vẽ 1 CommonDialog. (Name: dlgTimTapTin)

Code trong form:

Mã:
Private Sub cmdTimtapTin_Click()
With dlgTimTapTin

        .DialogTitle = "Select Excel file"
        .FileName = ""
        .Filter = "Excel Files (*.xls)|*.xls|"
        .ShowOpen
        
       If .FileName = "" Or IsNull(.FileName) Then
          Exit Sub
          Else
            On Error Resume Next
                     
             DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "[COLOR=#0000cd]tblTongHop[/COLOR]", .FileName, True
             MsgBox "Da nhap xong du lieu vao bang", vbInformation
           Exit Sub
      End If
End With

End Sub

Code trên nó sẽ đưa dữ liệu vào Access với tên bảng là tblTongHop. Khi import lần sau thì nó sẽ ghi đè lên lần trước.
 

File đính kèm

  • Import.rar
    436.8 KB · Đọc: 605
Bạn lưu ý cách đặt tên file và tên sheet càng gọn càng tốt, và cũng tránh viết Tiếng Việt có dấu cho các trường, tên bảng và tên file để khỏi gặp rắc rối sau này.

Bạn chuẩn bị làm như sau
- Vẽ 1 form.
- Vẽ 1 Command Button. (Name: cmdTimtapTin)
- Vẽ 1 CommonDialog. (Name: dlgTimTapTin)

Code trong form:

Mã:
Private Sub cmdTimtapTin_Click()
With dlgTimTapTin

        .DialogTitle = "Select Excel file"
        .FileName = ""
        .Filter = "Excel Files (*.xls)|*.xls|"
        .ShowOpen
        
       If .FileName = "" Or IsNull(.FileName) Then
          Exit Sub
          Else
            On Error Resume Next
                     
             DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "[COLOR=#0000cd]tblTongHop[/COLOR]", .FileName, True
             MsgBox "Da nhap xong du lieu vao bang", vbInformation
           Exit Sub
      End If
End With

End Sub

Code trên nó sẽ đưa dữ liệu vào Access với tên bảng là tblTongHop. Khi import lần sau thì nó sẽ ghi đè lên lần trước.

Rất cảm ơn domfootwear đã có câu trả lời rất nhanh cho tôi, tuy nhiên có 2 vấn đề tôi muốn hỏi:
- Tôi đã cài bản full office 2003 nhưng ko thể có đc cái dialog control như bạn nói, vì vậy khi open forrm ra nó cứ báo no coltrol, có cách nào khắc phục vdd này không bạn
- Dữ liệu trên accesss của tôi có các cột: đi muộn có lý do, về sớm có lý do, nghỉ có lý do, không quẹt thẻ có lý do.....(các cột đang trống hoặc có rất ít dữ liệu ở cuối cùng bên tay phải) - các dữ liệu đó tôi làm 1 forrm để cán bộ theo dõi tự nhập bằng tay -- VẬy khi imporrt như bạn làm thì nó sẽ đè lên hết các bản ghi cũ => các dữ liệu gõ bằng tay nằm ở các bản ghi có các cột như trên cũng sẽ bị ghi đè --> thành bản ghi trống. Như vậy sẽ không ổn, vì vậy làm sao để khi imporrt tránh các bản ghi đó ra mà vẫn đảm bảo tính duy nhất của bản ghi như vậy.
Ví dụ có 1 bản ghi cũ như sau
Stt MaNV Gioden GioVe Dimuon Vesom DimuonColydo Somcolydo
1 63 8:00 16:00 0 01:00 1
Làm sao để khi import bản ghi này được giữ lại và không có bản ghi nào trùng lặp với nó về dữ liệu ở các cột stt, manv, gioden, giove, dimuon, vesom
-----------------------------
Rất mong bạn xem giúp tôi, tôi xin cảm ơn!
 
Rất cảm ơn domfootwear đã có câu trả lời rất nhanh cho tôi, tuy nhiên có 2 vấn đề tôi muốn hỏi:
- Tôi đã cài bản full office 2003 nhưng ko thể có đc cái dialog control như bạn nói, vì vậy khi open forrm ra nó cứ báo no coltrol, có cách nào khắc phục vdd này không bạn
- Dữ liệu trên accesss của tôi có các cột: đi muộn có lý do, về sớm có lý do, nghỉ có lý do, không quẹt thẻ có lý do.....(các cột đang trống hoặc có rất ít dữ liệu ở cuối cùng bên tay phải) - các dữ liệu đó tôi làm 1 forrm để cán bộ theo dõi tự nhập bằng tay -- VẬy khi imporrt như bạn làm thì nó sẽ đè lên hết các bản ghi cũ => các dữ liệu gõ bằng tay nằm ở các bản ghi có các cột như trên cũng sẽ bị ghi đè --> thành bản ghi trống. Như vậy sẽ không ổn, vì vậy làm sao để khi imporrt tránh các bản ghi đó ra mà vẫn đảm bảo tính duy nhất của bản ghi như vậy.
Ví dụ có 1 bản ghi cũ như sau
Stt MaNV Gioden GioVe Dimuon Vesom DimuonColydo Somcolydo
1 63 8:00 16:00 0 01:00 1
Làm sao để khi import bản ghi này được giữ lại và không có bản ghi nào trùng lặp với nó về dữ liệu ở các cột stt, manv, gioden, giove, dimuon, vesom
-----------------------------
Rất mong bạn xem giúp tôi, tôi xin cảm ơn!

Câu 1: Bạn tải và đăng ký mscomdlg.ocx

Câu 2: Ý bạn là nếu dữ liệu trong bảng của Access nếu có mã NV nào thì loại ra? Không bỏ đi dữ liệu cũ, cũng không ghi thêm dữ liệu mới, chỉ đưa vào những mã NV mới thôi?
 
Câu 1: Bạn tải và đăng ký mscomdlg.ocx

Câu 2: Ý bạn là nếu dữ liệu trong bảng của Access nếu có mã NV nào thì loại ra? Không bỏ đi dữ liệu cũ, cũng không ghi thêm dữ liệu mới, chỉ đưa vào những mã NV mới thôi?

Ý tôi là nếu có dữ liệu tại các cột đi muộn có lý do, về sớm có lý do, nghỉ có lý do, không quẹt thẻ có lý do thì giữ nguyên những bản ghi có dữ liệu đó, không ghi thêm bản ghi có dữ liệu về Stt MaNV Ngay Gioden GioVe Dimuon Vesom trùng với các bản ghi kể trên. Còn lại các bản ghi khác có thể ghi đè bình thường bạn ạ.
 
Ý tôi là nếu có dữ liệu tại các cột đi muộn có lý do, về sớm có lý do, nghỉ có lý do, không quẹt thẻ có lý do thì giữ nguyên những bản ghi có dữ liệu đó, không ghi thêm bản ghi có dữ liệu về Stt MaNV Ngay Gioden GioVe Dimuon Vesom trùng với các bản ghi kể trên. Còn lại các bản ghi khác có thể ghi đè bình thường bạn ạ.

heo tôi nghĩ như sau:]
1/ Dùng ADO lấy dữ liệu của tblTongHop vào 1 recordset (rec).
2/ Xử lý rec (chỉ giữ lại những record cần) và chuyển sang 1 arrayAC.
3/ Dùng ADO mở file ex để đưa vào 1 ArrayEx.
4/ Xóa toàn bộ tblTongHop
5/ Gán lại vào Tbl từ 2 Arr trên.
 
heo tôi nghĩ như sau:]
1/ Dùng ADO lấy dữ liệu của tblTongHop vào 1 recordset (rec).
2/ Xử lý rec (chỉ giữ lại những record cần) và chuyển sang 1 arrayAC.
3/ Dùng ADO mở file ex để đưa vào 1 ArrayEx.
4/ Xóa toàn bộ tblTongHop
5/ Gán lại vào Tbl từ 2 Arr trên.
Cái vụ Arr thì em mù tịt, anh ThuNghi làm thử nhé.
 
Đề xuất 2 hướng xử lý:

Cách 1:
Nghiên cứu chức năng import new record only của access

Cách 2:
open recorset của Excel và ghi từng record vào table Access, nhưng kiểm tra trường khoá, nếu trùng thì không ghi, qua record kế.
Nếu không có trường khoá là quá tệ đấy.
 
Trước hết tôi xin chân thành cảm ơn ý kiến hướng dẫn của các bạn: ptm0412, ThuNghi, domfootwear, Thời gian vừa qua tôi bận quá nên không theo dõi được chủ đề của mình. Bạn ptm0412 có thể hướng dẫn tôi các import new record only trong access được không? (nếu được xin hướng dẫn cả bằng 2 cách là import thông qua Get extenal data và Forrm Import như doom đã hướng dẫn tôi).
Xin chân thành cảm ơn các bạn!
 
Bạn lưu ý cách đặt tên file và tên sheet càng gọn càng tốt, và cũng tránh viết Tiếng Việt có dấu cho các trường, tên bảng và tên file để khỏi gặp rắc rối sau này.

Bạn chuẩn bị làm như sau
- Vẽ 1 form.
- Vẽ 1 Command Button. (Name: cmdTimtapTin)
- Vẽ 1 CommonDialog. (Name: dlgTimTapTin)

Code trong form:

Mã:
Private Sub cmdTimtapTin_Click()
With dlgTimTapTin

        .DialogTitle = "Select Excel file"
        .FileName = ""
        .Filter = "Excel Files (*.xls)|*.xls|"
        .ShowOpen
        
       If .FileName = "" Or IsNull(.FileName) Then
          Exit Sub
          Else
            On Error Resume Next
                     
             DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "[COLOR=#0000cd]tblTongHop[/COLOR]", .FileName, True
             MsgBox "Da nhap xong du lieu vao bang", vbInformation
           Exit Sub
      End If
End With

End Sub

Code trên nó sẽ đưa dữ liệu vào Access với tên bảng là tblTongHop. Khi import lần sau thì nó sẽ ghi đè lên lần trước.

To: Doom
bạn xem lại giúp tôi đoạn code trên với, khi import lần sau dữ liệu không ghi đè lên như bạn nói mà bị ghi tiếp vào các bản ghi tiếp theo. Ví dụ file exxcel có 4 record, import lần 1 thì table trong acêss có 4 bản ghi tương ứng excel, nhưng làm thêm lần nữa thì table trong access có 8 bản ghi. tương tự như vậy là 4*số lần import
 
To: Doom
bạn xem lại giúp tôi đoạn code trên với, khi import lần sau dữ liệu không ghi đè lên như bạn nói mà bị ghi tiếp vào các bản ghi tiếp theo. Ví dụ file exxcel có 4 record, import lần 1 thì table trong acêss có 4 bản ghi tương ứng excel, nhưng làm thêm lần nữa thì table trong access có 8 bản ghi. tương tự như vậy là 4*số lần import

Bạn thêm 1 dòng xóa dữ liệu cũ đi nhé.

Mã:
Private Sub cmdTimtapTin_Click()
With dlgTimTapTin

        .DialogTitle = "Select Excel file"
        .FileName = ""
        .Filter = "Excel Files (*.xls)|*.xls|"
        .ShowOpen
        
       If .FileName = "" Or IsNull(.FileName) Then
          Exit Sub
          Else
            On Error Resume Next
             [B][COLOR=#0000cd]DoCmd.SetWarnings (False)
             DoCmd.RunSQL "DELETE * FROM tblTongHop"[/COLOR][/B]
             DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "tblTongHop", .FileName, True
             MsgBox "Da nhap xong du lieu vao bang", vbInformation
   [B][COLOR=#0000cd]          DoCmd.SetWarnings (True)[/COLOR][/B]
           Exit Sub
      End If
End With

End Sub
 
Bạn thêm 1 dòng xóa dữ liệu cũ đi nhé.

Mã:
Private Sub cmdTimtapTin_Click()
With dlgTimTapTin

        .DialogTitle = "Select Excel file"
        .FileName = ""
        .Filter = "Excel Files (*.xls)|*.xls|"
        .ShowOpen
        
       If .FileName = "" Or IsNull(.FileName) Then
          Exit Sub
          Else
            On Error Resume Next
             [B][COLOR=#0000cd]DoCmd.SetWarnings (False)
             DoCmd.RunSQL "DELETE * FROM tblTongHop"[/COLOR][/B]
             DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "tblTongHop", .FileName, True
             MsgBox "Da nhap xong du lieu vao bang", vbInformation
   [B][COLOR=#0000cd]          DoCmd.SetWarnings (True)[/COLOR][/B]
           Exit Sub
      End If
End With

End Sub
Có cách nào nó tự ghi đè lên các bản ghi trùng nhau không bạn ơi, vì trong bảng tổng hợp của tôi, dữ liệu sẽ grow theo tháng. Nhưng khi import thì dữ liệu tối đa chỉ là dữ liệu của 1 tháng.
Ví dụ: trong bảng tổng hợp có dữ liệu của tháng 8 và 9, ngày tiến hành import dữ liệu là ngày hôm nay tức là dữ liệu từ đầu tháng 9 đến giờ. Nếu delete như bạn nói thì sẽ bị mất hết dữ liệu của tháng 8 bạn ạ. Xem giúp mình nhé. Cảm ơn bạn!
 
Có cách nào nó tự ghi đè lên các bản ghi trùng nhau không bạn ơi, vì trong bảng tổng hợp của tôi, dữ liệu sẽ grow theo tháng. Nhưng khi import thì dữ liệu tối đa chỉ là dữ liệu của 1 tháng.
Ví dụ: trong bảng tổng hợp có dữ liệu của tháng 8 và 9, ngày tiến hành import dữ liệu là ngày hôm nay tức là dữ liệu từ đầu tháng 9 đến giờ. Nếu delete như bạn nói thì sẽ bị mất hết dữ liệu của tháng 8 bạn ạ. Xem giúp mình nhé. Cảm ơn bạn!
Vậy thì xóa dữ liệu của thánh hiện hành, code sửa lại như sau:

Mã:
Private Sub cmdTimtapTin_Click()
With dlgTimTapTin

        .DialogTitle = "Select Excel file"
        .FileName = ""
        .Filter = "Excel Files (*.xls)|*.xls|"
        .ShowOpen
        
       If .FileName = "" Or IsNull(.FileName) Then
          Exit Sub
          Else
            On Error Resume Next
             DoCmd.SetWarnings (False)
             DoCmd.RunSQL "DELETE Month([Ngày]) AS Thang, * " & _
                            "FROM tblTongHop " & _
                            "WHERE (((Month([Ngày])) Like Month(Now())));"
             DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "tblTongHop", .FileName, True
             MsgBox "Da nhap xong du lieu vao bang", vbInformation
             DoCmd.SetWarnings (True)
           Exit Sub
      End If
End With

End Sub
 
Vậy thì xóa dữ liệu của thánh hiện hành, code sửa lại như sau:

Mã:
Private Sub cmdTimtapTin_Click()
With dlgTimTapTin

        .DialogTitle = "Select Excel file"
        .FileName = ""
        .Filter = "Excel Files (*.xls)|*.xls|"
        .ShowOpen
        
       If .FileName = "" Or IsNull(.FileName) Then
          Exit Sub
          Else
            On Error Resume Next
             DoCmd.SetWarnings (False)
             DoCmd.RunSQL "DELETE Month([Ngày]) AS Thang, * " & _
                            "FROM tblTongHop " & _
                            "WHERE (((Month([Ngày])) Like Month(Now())));"
             DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "tblTongHop", .FileName, True
             MsgBox "Da nhap xong du lieu vao bang", vbInformation
             DoCmd.SetWarnings (True)
           Exit Sub
      End If
End With

End Sub
Bạn ơi, theo cách của bạn thì lấy tháng hiện hành đem so sánh và xóa trong tblTonghop, thế nếu ngày 01/09/2011 mới import dữ liệu của tuần cuối cùng trong tháng 08 thì làm thế nào hả bạn? Theo mình nghĩ thì code làm sao để khi import tự động ghi đè lên các bản ghi bị trùng. Bạn cố giúp mình với.
 
Bạn ơi, theo cách của bạn thì lấy tháng hiện hành đem so sánh và xóa trong tblTonghop, thế nếu ngày 01/09/2011 mới import dữ liệu của tuần cuối cùng trong tháng 08 thì làm thế nào hả bạn? Theo mình nghĩ thì code làm sao để khi import tự động ghi đè lên các bản ghi bị trùng. Bạn cố giúp mình với.
Vậy thì không cần xóa dữ liệu gì hết, cứ nhập vào bảng, dùng 1 query để lấy dữ liệu cần, group by hết các trường thì nó sẽ chỉ chọn 1 dữ liệu duy nhất, cho dù bạn import nhiều lần cùng 1 dữ liệu. Bạn thử nhé.
 
Anh Domfootwear cho em hỏi. Thay vi check ngay tháng, em muốn so sanh employeeID thì phải làm như thế nào. Nếu employee trong bảng của excel mà trùng với employeeID trong bảng của Access, nó sẻ tự động chép đè lên. EmployeeID có đinh dạng giống như sau A00781072. Cám ơn anh.
 
Tôi đã thử theo HAI LUA MIEN TAY thì import lần sau lại BỔ SUNG dulieu trước, không phải ghi đè
 
File demo của bạn khi impost nó sẽ ghi thêm vào chứ không ghi đè bạn nhé.
 
Web KT

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

Back
Top Bottom