Nhờ giúp đỡ giúp, ghi data từ excel vào access với ADO mà không ghi hết được

Liên hệ QC

catlo

Thành viên mới
Tham gia
6/1/09
Bài viết
9
Được thích
0
Mình có đoạn code này
PHP:
Sub Ghi_data_vao_access()
    Dim ArrData
    Dim e As Long, j As Long, i As Long
    Dim objAdoConn As Object, objAdoRcSet As Object
    Dim strAdoConn As String, strPath As String, strSQL1 As String, strSQL2 As String, strSQL3 As String, check_ngay As Date
    Set objAdoConn = CreateObject("ADODB.Connection")
    Set objAdoRcSet = CreateObject("ADODB.RecordSet")
    strPath = "D:\helpme\database\database_qlhui.accdb"
    strAdoConn = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strPath & " ;"
    e = Worksheets("Data_import").Range("A" & Rows.Count).Row
    ArrData = Worksheets("Data_import").Range("A2:R" & e).Value
    objAdoConn.Open strAdoConn
    With objAdoRcSet
        For j = 1 To UBound(ArrData)
            check_ngay = ArrData(j, 5)
            strSQL1 = "SELECT NGAYAL FROM [DATA_CHITIET] WHERE NGAYAL= #" & Format(check_ngay, "m/d/yyyy") & "#  "
            .Open objAdoConn.Execute(strSQL1)
            If .EOF Then 'neu khong ton tai
                strSQL2 = "INSERT INTO [DATA_CHITIET] (MSCHEN,NHOMNGUOI,NGUOICHOI,TENCHEN,NGAYAL)" & _
                        " VALUES ('" & ArrData(j, 1) & "', '" & ArrData(j, 2) & "', '" & ArrData(j, 3) & "', '" & ArrData(j, 4) & "', '" & ArrData(j, 5) & "')"
                    objAdoConn.Execute strSQL2
                objAdoRcSet.Close
            Else
                MsgBox ("Du lieu ton tai khong the ghi them")
                Exit Sub
            End If
        Next j
    End With

    MsgBox ("Ghi du lieu thanh cong")
End Sub

Đang bị vấn đề ở chỗ là check ngày, nếu ngày tồn tại rồi thì không ghi thêm nữa, nhưng mà nó chỉ ghi ngang row 1 xong rồi không ghi được các row tiếp theo do bị thông báo dữ liệu tồn tại, mày mò không biết đặt cái for thế nào để cho no ghi vào hết cả, mình gửi file anh chị giúp đỡ với.
 

File đính kèm

  • helpme.rar
    82.3 KB · Đọc: 2
Mình có đoạn code này
PHP:
Sub Ghi_data_vao_access()
    Dim ArrData
    Dim e As Long, j As Long, i As Long
    Dim objAdoConn As Object, objAdoRcSet As Object
    Dim strAdoConn As String, strPath As String, strSQL1 As String, strSQL2 As String, strSQL3 As String, check_ngay As Date
    Set objAdoConn = CreateObject("ADODB.Connection")
    Set objAdoRcSet = CreateObject("ADODB.RecordSet")
    strPath = "D:\helpme\database\database_qlhui.accdb"
    strAdoConn = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strPath & " ;"
    e = Worksheets("Data_import").Range("A" & Rows.Count).Row
    ArrData = Worksheets("Data_import").Range("A2:R" & e).Value
    objAdoConn.Open strAdoConn
    With objAdoRcSet
        For j = 1 To UBound(ArrData)
            check_ngay = ArrData(j, 5)
            strSQL1 = "SELECT NGAYAL FROM [DATA_CHITIET] WHERE NGAYAL= #" & Format(check_ngay, "m/d/yyyy") & "#  "
            .Open objAdoConn.Execute(strSQL1)
            If .EOF Then 'neu khong ton tai
                strSQL2 = "INSERT INTO [DATA_CHITIET] (MSCHEN,NHOMNGUOI,NGUOICHOI,TENCHEN,NGAYAL)" & _
                        " VALUES ('" & ArrData(j, 1) & "', '" & ArrData(j, 2) & "', '" & ArrData(j, 3) & "', '" & ArrData(j, 4) & "', '" & ArrData(j, 5) & "')"
                    objAdoConn.Execute strSQL2
                objAdoRcSet.Close
            Else
                MsgBox ("Du lieu ton tai khong the ghi them")
                Exit Sub
            End If
        Next j
    End With

    MsgBox ("Ghi du lieu thanh cong")
End Sub

Đang bị vấn đề ở chỗ là check ngày, nếu ngày tồn tại rồi thì không ghi thêm nữa, nhưng mà nó chỉ ghi ngang row 1 xong rồi không ghi được các row tiếp theo do bị thông báo dữ liệu tồn tại, mày mò không biết đặt cái for thế nào để cho no ghi vào hết cả, mình gửi file anh chị giúp đỡ với.

Có 2 lỗi trong code này:
1. Xác định dòng cuối có dữ liệu của cột A: code hiện tại đang lấy toàn bộ hơn 1tr dòng.
e = Worksheets("Data_import").Range("A" & Rows.Count).Row
==> e = Worksheets("Data_import").Range("A" & Rows.Count).End(xlUp).Row

2. Câu lệnh SQL không xác định chính xác những dòng nào đã ghi rồi vì chỉ dựa trên 1 cột [Ngày AL]. Toàn bộ dữ liệu trong file Excel đều có [Ngày AL] giống nhau => code sẽ thông báo dữ liệu đã tồn tại. Do đó phải có thêm một (hoặc vài cột) nào nữa để phân biệt dòng này khác dòng trước. Tôi thấy cột [NguoiChoi] là không trùng giữa các dòng, vì vậy phải đưa thêm điều kiện "Nguoi choi" vào câu lệnh SQL mới xét đúng.

strSQL1 = "SELECT NGAYAL FROM [DATA_CHITIET] WHERE NGUOICHOI Like '" & nguoichoi & "' AND NGAYAL= #" & Format(check_ngay, "mm/dd/yyyy") & "# "
 
Lần chỉnh sửa cuối:
Mình có đoạn code này
PHP:
Sub Ghi_data_vao_access()
    Dim ArrData
    Dim e As Long, j As Long, i As Long
    Dim objAdoConn As Object, objAdoRcSet As Object
    Dim strAdoConn As String, strPath As String, strSQL1 As String, strSQL2 As String, strSQL3 As String, check_ngay As Date
    Set objAdoConn = CreateObject("ADODB.Connection")
    Set objAdoRcSet = CreateObject("ADODB.RecordSet")
    strPath = "D:\helpme\database\database_qlhui.accdb"
    strAdoConn = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strPath & " ;"
    e = Worksheets("Data_import").Range("A" & Rows.Count).Row
    ArrData = Worksheets("Data_import").Range("A2:R" & e).Value
    objAdoConn.Open strAdoConn
    With objAdoRcSet
        For j = 1 To UBound(ArrData)
            check_ngay = ArrData(j, 5)
            strSQL1 = "SELECT NGAYAL FROM [DATA_CHITIET] WHERE NGAYAL= #" & Format(check_ngay, "m/d/yyyy") & "#  "
            .Open objAdoConn.Execute(strSQL1)
            If .EOF Then 'neu khong ton tai
                strSQL2 = "INSERT INTO [DATA_CHITIET] (MSCHEN,NHOMNGUOI,NGUOICHOI,TENCHEN,NGAYAL)" & _
                        " VALUES ('" & ArrData(j, 1) & "', '" & ArrData(j, 2) & "', '" & ArrData(j, 3) & "', '" & ArrData(j, 4) & "', '" & ArrData(j, 5) & "')"
                    objAdoConn.Execute strSQL2
                objAdoRcSet.Close
            Else
                MsgBox ("Du lieu ton tai khong the ghi them")
                Exit Sub
            End If
        Next j
    End With

    MsgBox ("Ghi du lieu thanh cong")
End Sub

Đang bị vấn đề ở chỗ là check ngày, nếu ngày tồn tại rồi thì không ghi thêm nữa, nhưng mà nó chỉ ghi ngang row 1 xong rồi không ghi được các row tiếp theo do bị thông báo dữ liệu tồn tại, mày mò không biết đặt cái for thế nào để cho no ghi vào hết cả, mình gửi file anh chị giúp đỡ với.
Xem có phải lỗi Primary key.Bạn chon cái chế độ trong access ấy.
 
Có 2 lỗi trong code này:
1. Xác định dòng cuối có dữ liệu của cột A: code hiện tại đang lấy toàn bộ hơn 1tr dòng.
e = Worksheets("Data_import").Range("A" & Rows.Count).Row
==> e = Worksheets("Data_import").Range("A" & Rows.Count).End(xlUp).Row

2. Câu lệnh SQL không xác định chính xác những dòng nào đã ghi rồi vì chỉ dựa trên 1 cột [Ngày AL]. Toàn bộ dữ liệu trong file Excel đều có [Ngày AL] giống nhau => code sẽ thông báo dữ liệu đã tồn tại. Do đó phải có thêm một (hoặc vài cột) nào nữa để phân biệt dòng này khác dòng trước. Tôi thấy cột [NguoiChoi] là không trùng giữa các dòng, vì vậy phải đưa thêm điều kiện "Nguoi choi" vào câu lệnh SQL mới xét đúng.

strSQL1 = "SELECT NGAYAL FROM [DATA_CHITIET] WHERE NGUOICHOI Like '" & nguoichoi & "' AND NGAYAL= #" & Format(check_ngay, "mm/dd/yyyy") & "# "
cám ơn anh/chị chạy được rồi, cái like đó mình làm cái generate
PHP:
IF(AND(K76<>0,K76<>"",AL76<>0),INT(RAND()*10000)&AE76&AI76,"")
rand joint thêm 2 colum nữa chắc sẻ không bị trùng
 

File đính kèm

  • generreeee.png
    generreeee.png
    77 KB · Đọc: 6
Mình sửa lại code thêm cái like vô thì nó ghi hết được, nhưng lại không dùng được chức năng trùng dữ liệu, có nghĩa là dữ liệu nào ở cột NGAYAL đã có trong databse rồi thì không được phép ghi vô nữa, anh/chị nào giúp mình với
 
nhờ anh chị giúp đỡ thêm bị phát sinh thêm lỗi " operation is not allowed when the object is open " khi mình update data, mình gửi file anh chị xem giúp với
 

File đính kèm

  • help_update.rar
    89.7 KB · Đọc: 0
Web KT
Back
Top Bottom