ADO lien kết tới Excel.xlsm không được nhưng excel.slx OK chỉ giúp (1 người xem)

Liên hệ QC

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

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Khi để đuôi excel là slx thì liên kết ok ( tất nhiên trong code cũng phải đổi đuôi liên kết)
Khi để đuôi excel là slxm thì liên kết không được. mình có thử version viết trong code 8.0, 10.0, 12.0 cũng không được.
ai biết nguyên nhân chỉ giúp với
Mã:
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Option Explicit

Private Sub Command1_Click()
    Set rs = New ADODB.Recordset
        rs.Open "SELECT * FROM [TK$] ", cn, adOpenDynamic, adLockOptimistic
    Set DataGrid1.DataSource = rs
    
End Sub

Private Sub Form_Load()
On Error GoTo ErrHandler
    Set cn = New ADODB.Connection
    cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cn.ConnectionString = "Data Source= " & App.Path & "/[COLOR=#ff0000]TK.xlsm;[/COLOR] Extended Properties=Excel [COLOR=#ff0000]12.0[/COLOR];"
    cn.CursorLocation = adUseClient
    cn.Open
    
Exit Sub
ErrHandler:
    MsgBox "Khong the ket noi voi CSDL"
End Sub

Private Sub Command3_Click()
Unload Me
End Sub
mình đang dùng excel 2007
 

File đính kèm

Hi Bạn

Bạn gửi thiếu file rùi, với lại đoạn code trên bạn dùng "\TK.xlsm" thay cho "/TK.xlsm" nhé.
Với excel 2007 thì bạn dùng "Microsoft.ACE.OLEDB.12.0.
Nếu còn vấn đề gì thì bạn post đủ file lên đây ae giúp cho.


Còn mình thấy có chút vấn đề chỗ kết nối, khi bạn load form lên thì kết nối được mở, chờ đến khi click button mới thực hiện thì không nên, bạn nên viết chung vào button click để khi kích 1 phát thì Open, xử lý rồi đóng lại luôn nhé.

Thân
 
Lần chỉnh sửa cuối:
Hi Bạn

Bạn gửi thiếu file rùi, với lại đoạn code trên bạn dùng "\TK.xlsm" thay cho "/TK.xlsm" nhé.
Với excel 2007 thì bạn dùng "Microsoft.ACE.OLEDB.12.0.
Nếu còn vấn đề gì thì bạn post đủ file lên đây ae giúp cho.


Còn mình thấy có chút vấn đề chỗ kết nối, khi bạn load form lên thì kết nối được mở, chờ đến khi click button mới thực hiện thì không nên, bạn nên viết chung vào button click để khi kích 1 phát thì Open, xử lý rồi đóng lại luôn nhé.

Thân

Cảm ơn bạn nhé. vậy thì excel 2007 được viết là "Microsoft.ACE.OLEDB.12.0." và code này chạy được trên excel 2010 khong? mình chưa thử được nên hỏi vây?
vậy để hiểu hơn giúp mình luôn
excel 2003 viết thế nào "microsof.......
excel 2010 viết thế nào "microsof.......
và cái này "Microsoft.jet.OLEDB.4.0." áp dụng cho excel nào ...?
 
vậy version của excell <12 thì viết trình kết nối là "Microsoft.jet.OLEDB.4.0"
vậy version của excell > 12 thì viết trình kết nối là "Microsoft.ACE.OLEDB.12.0" (2007 và 2010)
mình hiểu thế đúng không????

Bạn đọc đoạn này, tự khắc bạn hiểu:

Mã:
      If Val(Application.Version) < 12 Then
            ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & FullPath & ";" & _
            "Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
      Else
            ConnString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & FullPath & ";" & _
            "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
      End If
 
INSERT Statement bị lỗi.

Hi CẢ Nhà

Mọi người tìm dùm em lỗi trong đoạn code sau nhé, câu lệnh INSERT bị báo lỗi như trong file đính kèm.

Cơ sở dữ liệu mình lưu trong file Access kèm theo. Khi mình bỏ cột ID là Frimary Key trong CSDL thì hết lỗi tuy nhiên dữ liệu Insert vào không theo thứ tự mà tự động chèn vào hàng bất kì.
Bạn nào có cách bỏ ID mà vẫn INSERT theo thứ tự (vào trước nằm trên) thì chỉ giúp mình với.


Thanks
[GPECODE=vb]Sub savetoDataBase(desFile As Variant, desSheet As String, rng As Range)
On Error GoTo Handle
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & desFile & ";"

.Open
End With
lsSQL = "INSERT INTO " & desSheet & " (lot,stock,machine,date,time,eno,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,avgX,S,prog,remark,CA,UTest,UCL,U3,U2,U1,X,L1,L2,L3,LCL,LTest,UCLs,US,CS,LS,LCLs,REV) " & _
" VALUES('" & UCase(rng) & _
"' , '" & UCase([partNo]) & _
"' , '" & UCase([machineName]) & _
"' , '" & Year(rng.Offset(-3, 0)) * 10000 + Month(rng.Offset(-3, 0)) * 100 + Day(rng.Offset(-3, 0)) & _
"' , '" & rng.Offset(-2, 0) & _
"' , " & rng.Offset(-1, 0) & _
" , " & Round(rng.Offset(1, 0), 3) & _
" , " & Round(rng.Offset(2, 0), 3) & _
" , " & Round(rng.Offset(3, 0), 3) & _
" , " & Round(rng.Offset(4, 0), 3) & _
" , " & Round(rng.Offset(5, 0), 3) & _
" , " & Round(rng.Offset(6, 0), 3) & _
" , " & Round(rng.Offset(7, 0), 3) & _
" , " & Round(rng.Offset(8, 0), 3) & _
" , " & Round(rng.Offset(9, 0), 3) & _
" , " & Round(rng.Offset(10, 0), 3) & _
" , " & Round(rng.Offset(11, 0), 3) & _
" , " & Round(rng.Offset(12, 0), 3) & _
" , " & Round(rng.Offset(13, 0), 3) & _
" , '" & rng.Offset(15, 0) & _
"' , '" & rng.Offset(16, 0) & _
"' , " & Round(Sheets("H").[UpperTest], 3) & " , " & Round(Sheets("H").[UCL], 3) & " , " & Round(Sheets("H").[U3_], 3) & " , " & Round(Sheets("H").[U2_], 3) & " , " & Round(Sheets("H").[U1_], 3) & " , " & Round(Sheets("H").[Xavg], 3) & " , " & Round(Sheets("H").[L1_], 3) & " , " & Round(Sheets("H").[L2_], 3) & " , " & Round(Sheets("H").[L3_], 3) & _
" , " & Round(Sheets("H").[LCL], 3) & " , " & Round(Sheets("H").[LowerTest], 3) & " , " & Round(Sheets("H").[UCLs], 3) & " , " & Round(Sheets("H").[US_], 3) & " , " & Round(Sheets("H").[S_], 3) & " , " & Round(Sheets("H").[LS_], 3) & " , " & Round(Sheets("H").[LCLs], 3) & " , '" & Sheets("H").[REV] & _
"')"
MsgBox lsSQL
lrs.Open lsSQL, cnn, 3, 1
Set lrs = Nothing
cnn.Close: Set cnn = Nothing
Exit Sub
Handle:
MsgBox Err.Description
End Sub[/GPECODE]
 

File đính kèm

Lần chỉnh sửa cuối:
Hi CẢ Nhà

Mọi người tìm dùm em lỗi trong đoạn code sau nhé, câu lệnh INSERT bị báo lỗi như trong file đính kèm.

Cơ sở dữ liệu mình lưu trong file Access kèm theo. Khi mình bỏ cột ID là Frimary Key trong CSDL thì hết lỗi tuy nhiên dữ liệu Insert vào không theo thứ tự mà tự động chèn vào hàng bất kì.
Bạn nào có cách bỏ ID mà vẫn INSERT theo thứ tự (vào trước nằm trên) thì chỉ giúp mình với.


Thanks

Bạn tiếc gì mà không gửi cái file excel lên và gửi đầy đủ code để người ta dễ kiểm tra?

Với INSERT chỉ có 2 cấu trúc mà thôi:

1) Không thể hiện Cột, chỉ thể hiện giá trị, bao nhiêu giá trị thì lần lượt theo cột từ trái sang phải mà INSERT vào:

Mã:
[COLOR=#000000]INSERT INTO table_name[/COLOR]
[COLOR=#000000]VALUES (value1, value2, value3,...)
[/COLOR]


2) Vừa thể hiện cột vừa thể hiện giá trị, cột như thế nào giá trị tương ứng.

Mã:
[COLOR=#000000][FONT=courier new]INSERT INTO table_name (column1, column2, column3,...)
[/FONT][/COLOR][COLOR=#000000][FONT=courier new]VALUES (value1, value2, value3,...)[/FONT][/COLOR]


Tại sao có chuyện nó INSERT không phải là hàng cuối chứ? Bạn gửi file đầy đủ lên đây xem sao?
 


Bạn tiếc gì mà không gửi cái file excel lên và gửi đầy đủ code để người ta dễ kiểm tra?

Với INSERT chỉ có 2 cấu trúc mà thôi:

1) Không thể hiện Cột, chỉ thể hiện giá trị, bao nhiêu giá trị thì lần lượt theo cột từ trái sang phải mà INSERT vào:

Mã:
[COLOR=#000000]INSERT INTO table_name[/COLOR]
[COLOR=#000000]VALUES (value1, value2, value3,...)
[/COLOR]


2) Vừa thể hiện cột vừa thể hiện giá trị, cột như thế nào giá trị tương ứng.

Mã:
[COLOR=#000000][FONT=courier new]INSERT INTO table_name (column1, column2, column3,...)
[/FONT][/COLOR][COLOR=#000000][FONT=courier new]VALUES (value1, value2, value3,...)[/FONT][/COLOR]


Tại sao có chuyện nó INSERT không phải là hàng cuối chứ? Bạn gửi file đầy đủ lên đây xem sao?


Hi Bạn

Vì file của mình kích thước lớn với lại rất rắc rối nên mình chụp hình đưa lên thôi. Mình cho msgbox hiển thị câu lệnh, kiểm tra hoài thấy cấu trúc đúng nhưng lại báo lỗi.
Mình đã tìm được nguyên nhân INSERT dữ liệu bị sai:
1/ Đầu tiên mình tạo CSDL có ID, sau đó xoá vài dòng trong CSDL, ID không tự động cập nhật.
2/ Sau đó mình detele cột ID và INSERT vào nên câu lệnh cứ hiểu sai.
3/ Giờ mình tạo mới CSDL thì đúng rùi.

Trong 2 trường hợp của bạn ở trên thì code thứ 2 mình viết không chạy dc (lúc này có ID), còn viết theo cách 1 không có ID thì Ok. trường hợp 2 mình không hiểu sai chỗ nào mà cứ báo lỗi "Syntax error in INSERT INTO statement".

Cảm ơn bạn
 
Lần chỉnh sửa cuối:
Hi Bạn

Vì file của mình kích thước lớn với lại rất rắc rối nên mình chụp hình đưa lên thôi. Mình cho msgbox hiển thị câu lệnh, kiểm tra hoài thấy cấu trúc đúng nhưng lại báo lỗi.
Mình đã tìm được nguyên nhân INSERT dữ liệu bị sai:
1/ Đầu tiên mình tạo CSDL có ID, sau đó xoá vài dòng trong CSDL, ID không tự động cập nhật.
2/ Sau đó mình detele cột ID và INSERT vào nên câu lệnh cứ hiểu sai.
3/ Giờ mình tạo mới CSDL thì đúng rùi.

Trong 2 trường hợp của bạn ở trên thì code thứ 2 mình viết không chạy dc (lúc này có ID), còn viết theo cách 1 không có ID thì Ok. trường hợp 2 mình không hiểu sai chỗ nào mà cứ báo lỗi "Syntax error in INSERT INTO statement".

Cảm ơn bạn

Có 2 điểm bạn cần lưu ý như sau:
  1. Nếu trong bảng có trường ID kiểu dữ liệu là Autonumber thì bạn không nên chọn trường này để insert, do vậy trường này bạn chừa ra và không thể can thiệp gì vào nó.
  2. Nên tránh đặt tên trường và tên bảng là những tên đặc biệt và có cách trắng, nếu lỡ thì dùng 2 dấu [] bao quanh nó lại, ví dụ trường date và time phải là [date], [time]...
 
Hi Bạn

Cảm ơn bạn nhiều nha, mình sửa lại và đã INSERT được rùi.

Thân
 
Web KT

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

Back
Top Bottom