Lưu dữ liệu từ Excel sang Access bằng ADO

Liên hệ QC

moihocvba

Thành viên thường trực
Tham gia
16/8/20
Bài viết
207
Được thích
49
Chào anh chị GPE, em đang học và tìm hiểu ADO, xin anh chị giúp em với nhé!

Thay vì Lưu hóa đơn bán hàng sang sheet TongHop như thông thường thì em muốn đẩy nó vào Access thông qua ADO.
Em có tạo một file database Access gồm những cột như mong muốn.

Sau khi đưa dữ liệu vào mảng thì từ mảng đó mình đưa vào Access như thế nào ạ?
Anh chị hãy giúp em điền tiếp dữ liệu ở code bên dưới để đưa vào file data Access với.

Đây là mẫu hóa đơn:
1612251122990.png

Đây là code em mới viết tới đây:

Mã:
Sub LuuHoaDon_ADO()
Dim lr As Long, i As Long, a As Long
Dim darr(), sarr(), lrData As Long

'1. Dua du lieu vao mang
 darr = Range("B11:G25").Value
ReDim sarr(1 To UBound(darr, 1), 1 To 12)

         For i = 1 To UBound(darr)
            If darr(i, 1) <> "" Then
                a = a + 1
                sarr(a, 1) = darr(i, 1) ' ten hang
                sarr(a, 2) = darr(i, 2) ' DVT
                sarr(a, 3) = darr(i, 3) ' Sl
                sarr(a, 4) = darr(i, 4) ' don gia
                sarr(a, 5) = darr(i, 5) ' thanh tien
                sarr(a, 6) = darr(i, 6) ' ghi chu
                sarr(a, 7) = Range("G1").Value  'so HD
                sarr(a, 8) = Range("G2").Value  ' ngay
                sarr(a, 9) = Range("B3").Value ' ten kh
                sarr(a, 10) = Range("B4").Value  ' dia chi
                sarr(a, 11) = Range("F4").Value   ' dien thoai
            End If
        Next i
        
'With Sheets("TongHop")
'    lr = .Range("A" & Rows.Count).End(xlUp).Row + 1
'    .Range("A" & lr).Resize(a, 11).Value = sarr
'End With

' dua du lieu vao access
Dim cnn As Object: Dim rst As Object
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
    With cnn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\db.accdb;Persist Security Info=False;"
        .Open
    End With
    
' tiep theo

'Sort du lieu trong Access

End Sub

Em có gửi File đính kèm gồm file Excel và file data access ạ!

Em xin cảm ơn nhiều. Em mới học nên cho phép em xin hỏi từng bước từng bước ạ!
 

File đính kèm

  • Thuc hanh ADO.rar
    33.8 KB · Đọc: 12
Access là CSDL Liên Hệ.
Trong bảng của CSDL LH, không có khái niệm sắp xếp. Trên nguyên tắc, Access không lý tới việc dòng nào nằm trên dòng nào.
Chuyện sắp xếp chỉ xảy ra khi truy vấn và xuất dữ liệu thôi (dùng từ khoá Order by lúc truy vấn).
 
Chào anh chị GPE, em đang học và tìm hiểu ADO, xin anh chị giúp em với nhé!

Thay vì Lưu hóa đơn bán hàng sang sheet TongHop như thông thường thì em muốn đẩy nó vào Access thông qua ADO.
Em có tạo một file database Access gồm những cột như mong muốn.

Sau khi đưa dữ liệu vào mảng thì từ mảng đó mình đưa vào Access như thế nào ạ?
Anh chị hãy giúp em điền tiếp dữ liệu ở code bên dưới để đưa vào file data Access với.

Đây là mẫu hóa đơn:
View attachment 253857

Đây là code em mới viết tới đây:

Mã:
Sub LuuHoaDon_ADO()
Dim lr As Long, i As Long, a As Long
Dim darr(), sarr(), lrData As Long

'1. Dua du lieu vao mang
darr = Range("B11:G25").Value
ReDim sarr(1 To UBound(darr, 1), 1 To 12)

         For i = 1 To UBound(darr)
            If darr(i, 1) <> "" Then
                a = a + 1
                sarr(a, 1) = darr(i, 1) ' ten hang
                sarr(a, 2) = darr(i, 2) ' DVT
                sarr(a, 3) = darr(i, 3) ' Sl
                sarr(a, 4) = darr(i, 4) ' don gia
                sarr(a, 5) = darr(i, 5) ' thanh tien
                sarr(a, 6) = darr(i, 6) ' ghi chu
                sarr(a, 7) = Range("G1").Value  'so HD
                sarr(a, 8) = Range("G2").Value  ' ngay
                sarr(a, 9) = Range("B3").Value ' ten kh
                sarr(a, 10) = Range("B4").Value  ' dia chi
                sarr(a, 11) = Range("F4").Value   ' dien thoai
            End If
        Next i
       
'With Sheets("TongHop")
'    lr = .Range("A" & Rows.Count).End(xlUp).Row + 1
'    .Range("A" & lr).Resize(a, 11).Value = sarr
'End With

' dua du lieu vao access
Dim cnn As Object: Dim rst As Object
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
    With cnn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\db.accdb;Persist Security Info=False;"
        .Open
    End With
   
' tiep theo

'Sort du lieu trong Access

End Sub

Em có gửi File đính kèm gồm file Excel và file data access ạ!

Em xin cảm ơn nhiều. Em mới học nên cho phép em xin hỏi từng bước từng bước ạ!
Bạn thử code sau nhé:
Mã:
Sub LuuDL_HLMT()
    Dim strSQL As String
    With Sheet1
        strSQL = "INSERT INTO DataBanHang " & _
                    "SELECT F1 AS TENHANG,F2 AS DVT,F3 AS SOLUONG,F4 AS DONGIA,F5 AS THANHTIEN,F6 AS GHICHU,'" & _
                    .Range("G1") & "' AS SOHD,'" & .Range("G2") & "' AS NGAYHD,'" & .Range("B3") & "' AS KHACHHANG,'" & .Range("B4") & "' AS DIACHI,'" & .Range("F4") & "' AS DIENTHOAI " & _
                    "FROM [EXCEL 12.0;HDR=NO;Database=" & ThisWorkbook.FullName & "].[HD$B11:G25] WHERE F1 IS NOT NULL"
    End With
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\db.accdb"
        .Execute (strSQL)
    End With
End Sub
 
Bạn thử code sau nhé:
Mã:
Sub LuuDL_HLMT()
    Dim strSQL As String
    With Sheet1
        strSQL = "INSERT INTO DataBanHang " & _
                    "SELECT F1 AS TENHANG,F2 AS DVT,F3 AS SOLUONG,F4 AS DONGIA,F5 AS THANHTIEN,F6 AS GHICHU,'" & _
                    .Range("G1") & "' AS SOHD,'" & .Range("G2") & "' AS NGAYHD,'" & .Range("B3") & "' AS KHACHHANG,'" & .Range("B4") & "' AS DIACHI,'" & .Range("F4") & "' AS DIENTHOAI " & _
                    "FROM [EXCEL 12.0;HDR=NO;Database=" & ThisWorkbook.FullName & "].[HD$B11:G25] WHERE F1 IS NOT NULL"
    End With
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\db.accdb"
        .Execute (strSQL)
    End With
End Sub
Dạ, con cảm ơn chú. Chú cho con hỏi khi lưu vào Access thì nó thứ tự hóa đơn từ nhỏ đến lớn, con muốn lưu xong sắp xếp lại hóa đơn thì lớn đến nhỏ luôn được ko ạ?
 
Dạ, con cảm ơn chú. Chú cho con hỏi khi lưu vào Access thì nó thứ tự hóa đơn từ nhỏ đến lớn, con muốn lưu xong sắp xếp lại hóa đơn thì lớn đến nhỏ luôn được ko ạ?
Như bài #4 mà anh @VetMini đã nói. Bạn dựa vào CSDL đó để tạo báo biểu, ở báo biểu mới sắp xếp, "xào nấu" theo ý.
 
Như bài #4 mà anh @VetMini đã nói. Bạn dựa vào CSDL đó để tạo báo biểu, ở báo biểu mới sắp xếp, "xào nấu" theo ý.
Không biết tại sao giải thích vậy mà người ta vẫn không chịu hiểu. Dân GPE lì thiệt.
Ghi records vào bảng giống như thảy đồ vật vào thùng chứa. Lúc lấy đồ ra (tương đương với lộn ngược thùng lên) thì sẽ lấy những món thảy vào trước ra trước. Tuy nhiên, việc này chỉ gần đúng thôi chứ không bao giờ được bảo đảm. Vì thùng chứa lớn, ta không thể bảo đảm vật thảy vào sau nằm đè lên vật trước nó. Mà với dữ liệu thì "không bảo đảm" coi như không thể tin cậy.
Lúc lấy đồ ra, bạn không thể bảo đảm là chọn đúng món đã thảy vào đầu tiên.

Vì nguyên tắc này, việc ghi dữ liệu theo thứ tự không thể bảo đảm. Chỉ có thể bảo đảm lúc lấy ra thì sort theo thứ tự khoá của nó thôi.

(*) nếu miễn cưỡng thêm một trường timestamp thì có thể biết cái nào vào trước và cái nào vào sau.

(**) phiên bản cũ của Access dùng loại file ISAM, cho nên có thể nói "cái nào vào trước thì nằm trên". Tuy nhiên không có gì bảo đảm sau khi sửa xoá thì nó dồn lại, thứ tự trở nên khác.
 
Không biết tại sao giải thích vậy mà người ta vẫn không chịu hiểu. Dân GPE lì thiệt.
Ghi records vào bảng giống như thảy đồ vật vào thùng chứa. Lúc lấy đồ ra (tương đương với lộn ngược thùng lên) thì sẽ lấy những món thảy vào trước ra trước. Tuy nhiên, việc này chỉ gần đúng thôi chứ không bao giờ được bảo đảm. Vì thùng chứa lớn, ta không thể bảo đảm vật thảy vào sau nằm đè lên vật trước nó. Mà với dữ liệu thì "không bảo đảm" coi như không thể tin cậy.
Lúc lấy đồ ra, bạn không thể bảo đảm là chọn đúng món đã thảy vào đầu tiên.

Vì nguyên tắc này, việc ghi dữ liệu theo thứ tự không thể bảo đảm. Chỉ có thể bảo đảm lúc lấy ra thì sort theo thứ tự khoá của nó thôi.

(*) nếu miễn cưỡng thêm một trường timestamp thì có thể biết cái nào vào trước và cái nào vào sau.

(**) phiên bản cũ của Access dùng loại file ISAM, cho nên có thể nói "cái nào vào trước thì nằm trên". Tuy nhiên không có gì bảo đảm sau khi sửa xoá thì nó dồn lại, thứ tự trở nên khác.
Cộng thêm là ta không thể nào lấy hết cái dữ liệu được ghi đó và bê nguyên xi ra cái báo cáo. Bạn ấy đã thêm 1 trường ID với kiểu dữ liệu là AutoNumber thì có thể ra báo cáo dựa vào trường này anh ạ.
 
records vào bảng giống như thảy đồ vật vào
Không biết tại sao giải thích vậy mà người ta vẫn không chịu hiểu. Dân GPE lì thiệt.
Ghi records vào bảng giống như thảy đồ vật vào thùng chứa. Lúc lấy đồ ra (tương đương với lộn ngược thùng lên) thì sẽ lấy những món thảy vào trước ra trước. Tuy nhiên, việc này chỉ gần đúng thôi chứ không bao giờ được bảo đảm. Vì thùng chứa lớn, ta không thể bảo đảm vật thảy vào sau nằm đè lên vật trước nó. Mà với dữ liệu thì "không bảo đảm" coi như không thể tin cậy.
Lúc lấy đồ ra, bạn không thể bảo đảm là chọn đúng món đã thảy vào đầu tiên.

Vì nguyên tắc này, việc ghi dữ liệu theo thứ tự không thể bảo đảm. Chỉ có thể bảo đảm lúc lấy ra thì sort theo thứ tự khoá của nó thôi.

(*) nếu miễn cưỡng thêm một trường timestamp thì có thể biết cái nào vào trước và cái nào vào sau.

(**) phiên bản cũ của Access dùng loại file ISAM, cho nên có thể nói "cái nào vào trước thì nằm trên". Tuy nhiên không có gì bảo đảm sau khi sửa xoá thì nó dồn lại, thứ tự trở nên khác.
Dạ cảm ơn anh VetMini.
Em đang đọc bài này của a levanduyet cũng hiểu thêm nhiều cái hay ho https://www.giaiphapexcel.com/diendan/threads/kết-nối-thao-tác-giữa-excel-và-access.65492/page-2
 
Không biết tại sao giải thích vậy mà người ta vẫn không chịu hiểu. Dân GPE lì thiệt.
Ghi records vào bảng giống như thảy đồ vật vào thùng chứa. Lúc lấy đồ ra (tương đương với lộn ngược thùng lên) thì sẽ lấy những món thảy vào trước ra trước. Tuy nhiên, việc này chỉ gần đúng thôi chứ không bao giờ được bảo đảm. Vì thùng chứa lớn, ta không thể bảo đảm vật thảy vào sau nằm đè lên vật trước nó. Mà với dữ liệu thì "không bảo đảm" coi như không thể tin cậy.
Lúc lấy đồ ra, bạn không thể bảo đảm là chọn đúng món đã thảy vào đầu tiên.

Vì nguyên tắc này, việc ghi dữ liệu theo thứ tự không thể bảo đảm. Chỉ có thể bảo đảm lúc lấy ra thì sort theo thứ tự khoá của nó thôi.

(*) nếu miễn cưỡng thêm một trường timestamp thì có thể biết cái nào vào trước và cái nào vào sau.

(**) phiên bản cũ của Access dùng loại file ISAM, cho nên có thể nói "cái nào vào trước thì nằm trên". Tuy nhiên không có gì bảo đảm sau khi sửa xoá thì nó dồn lại, thứ tự trở nên khác.
Em cũng đang mới tập học về việc đẩy dữ liệu vào access bằng ADO, nhưng vẫn có thói quen check lại xem đưa vào database có đúng không (trường hợp ghi thiếu, ghi trùng dữ liệu). Nên em nghĩ có thể đoạn code sort này mới phát sinh.
Tiện thể có thể cho em hỏi, em cũng đang lưu database theo ngày, làm thế nào để check được ngày hôm đó em đã bấm 2 lần nút lưu không anh :wacko::wacko:
Bài đã được tự động gộp:

Loại dữ liệu của em thường là khoảng 20k dòng mỗi ngày. 1619421736871.png
 
đẩy dữ liệu vào access bằng ADO, nhưng vẫn có thói quen check lại xem đưa vào database có đúng không (trường hợp ghi thiếu, ghi trùng dữ liệu).

Bạn "đẩy dữ liệu vào Access" phải hiểu theo cách nào? mỗi kiểu sẽ có cách xử lý khác nhau.
- Nhập liệu ở form nhập liệu và ghi thẳng vào Table Access theo từng record hay
- Ghi hàng loạt (Update Batch) dòng hoặc import hàng loạt vào Table Access?
 
Web KT
Back
Top Bottom