Bài tập về ADO căn bản.

Liên hệ QC
Bạn thay đổi đoạn code nay thêm dấu nháy vào
PHP:
"WHERE stt ='3'"
Vì dữ liệu ở file data là kiểu text nên nó không hiểu khi bạn dùng where stt=3 khi đó là kiểu số
 
Bạn thay đổi đoạn code nay thêm dấu nháy vào
PHP:
"WHERE stt ='3'"
Vì dữ liệu ở file data là kiểu text nên nó không hiểu khi bạn dùng where stt=3 khi đó là kiểu số

Thank bạn nhé! đúng là tiền bối đi trước có khác!
Mã:
mysql = "UPDATE [data$] " & _
         "SET sl=[COLOR=#ff0000]'[/COLOR]12345[COLOR=#ff0000]'[/COLOR]" & _
         "WHERE stt like '3'"
Vậy đồng nghĩa với chỗ gán sl = 12345 cũng phải cho trong dấu nháy " ' "
 
Lần chỉnh sửa cuối:
Thank bạn nhé! đúng là tiền bối đi trước có khác!
Mã:
mysql = "UPDATE [data$] " & _
         "SET sl=[COLOR=#ff0000]'[/COLOR]12345[COLOR=#ff0000]'[/COLOR]" & _
         "WHERE stt like '3'"
Vậy đồng nghĩa với chỗ gán sl = 12345 cũng phải cho trong dấu nháy " ' "
Có thể không dùng dấu nháy đơn như trên.
[GPECODE=sql]Sub ghidl3()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
With cn
.ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
"data source=" & ThisWorkbook.Path & _
"\data.xlsm;extended properties=""excel 12.0;HDR=yes;"";"
.Open
.Execute "UPDATE [data$] " & _
"SET sl=12345 " & _
"WHERE VAL(stt)=3"
End With
cn.Close: Set cn = Nothing
End Sub[/GPECODE]
 
Bạn dùng code sau nhé:

[GPECODE=sql]Private Sub UserForm_Initialize()
Dim cnn As New ADODB.Connection, lrs As New ADODB.Recordset, i As Integer
cnn.Open "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & _
ThisWorkbook.FullName & ";Extended Properties=Excel 8.0;"
lrs.Open "select * From [Temp$] ", cnn
With Me.ComboBox1
.Clear
Do
.AddItem lrs![LastName]
lrs.MoveNext
Loop Until lrs.EOF
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing

End Sub[/GPECODE]
Cho em hỏi đôi chút kiến thức về EOF với ạh!!
 
Thường thường người ta dùng
Do Until rs.EOF
...
Loop

Thay vì
Do
...
Loop Until rs.EOF

Lý do: tránh bị lỗi nếu recordset chả có hàng nào.

 
Để đọc dữ liệu từ file cvs , bạn có thể dùng nhiều cách , còn muốn dùng ADO thì tham khảo code sau :
[GPECODE=vb]
Sub GPE()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
With cnn
.CursorLocation = 3
.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
End With

rst.Open "SELECT * FROM 001.csv", cnn, 3, 3, adCmdText
Range("A1:D100").ClearContents
Range("A1").CopyFromRecordset rst
rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]

Bạn giải thích thêm cho 3 cái này với : adCmdText và FMT=Delimited và Extended Properties=""text
 
Ví dụ mình có đoạn code như bên dưới, các bạn cho hỏi là giữa inner join, left join và right join có sự khác biệt hay là không? Xin giải thích.

[GPECODE=sql]Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$4" Then
Dim adoConn As Object, adoRS As Object
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select T1.MS,T2.ten,T2.mau,T1.soluong " _
& "from [Data1$] T1 " _
& Sheet3.Range("C4").Value & " [Data2$] T2 " _
& "on T1.ms = T2.ms"
End With
With Sheet3
.[B8:E120].ClearContents
.[B8].CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End If

End Sub

[/GPECODE]
P/s: Do các phần trên chưa nói đến phần căn bản này nên xin bổ sung thêm, mong các bạn hưởng ứng.
Xin lỗi anh HL nhưng vô tình em thấy file của anh Join.xlsm chạy rất tốt trên kingsoft ở dạng "KẾT NỐI ADO & SQL " tới chính file đang chạy. Cái này em thử và tìm hiểu rất nhiều mà không có được kết quả.Em tiếp tục đưa các code tương tự vào file của anh để truy vấn trên chính file Join.xlsm của anh mà trước đó hoàn toàn không kết nối được thì vẫn chạy bình thường.Em tắt file của anh đi và đưa lại những code đó vào workbook mới của kingsoft thì hoàn toàn lại không được gì cả dù đổi đuôi đủ thứ.Em lại mở file của anh lên và làm gì cũng được với chính file đó "ADO và SQL" . Nhưng chết cái save lại thì không được vì kiểm tra thấy file anh để dạng "Read-only" . Em save as lại ".xlsm" thì code lại không chạy được. Em bỏ read-only của file của anh cũng không chạy được. Em thử làm code truy vấn trên chính file hiện hành băng office 2007 OK và mở lại bằng kingsoft vẫn không được. Không biết file của anh trước khi gủi lên diễn đàn đã để read-only chưa vậy ạ hay em load về tự nó chuyển sang read-only. Nữa là file của anh có gì đặc biệt không mà chạy được trên kingsoft vậy ạ. ANH CÓ THỂ BỎ READ ONLY FILE JION TRÊN MÁY ANH VÀ GỦI LẠI CHO EM XIN FILE ĐÓ EM THỬ ĐƯỢC KHÔNG A" và có gì đó khác anh chỉ dẫn cho em với. XIN LỖI VÌ CHEN NGANG VẤN ĐỀ KHÁC Ạ. "Nhưng vẫn là muốn áp dụng cái ADO của anh rộng dãi thôi mà. Cảm ơn anh nhiều!!!
 
Xin lỗi anh HL nhưng vô tình em thấy file của anh Join.xlsm chạy rất tốt trên kingsoft ở dạng "KẾT NỐI ADO & SQL " tới chính file đang chạy. Cái này em thử và tìm hiểu rất nhiều mà không có được kết quả.Em tiếp tục đưa các code tương tự vào file của anh để truy vấn trên chính file Join.xlsm của anh mà trước đó hoàn toàn không kết nối được thì vẫn chạy bình thường.Em tắt file của anh đi và đưa lại những code đó vào workbook mới của kingsoft thì hoàn toàn lại không được gì cả dù đổi đuôi đủ thứ.Em lại mở file của anh lên và làm gì cũng được với chính file đó "ADO và SQL" . Nhưng chết cái save lại thì không được vì kiểm tra thấy file anh để dạng "Read-only" . Em save as lại ".xlsm" thì code lại không chạy được. Em bỏ read-only của file của anh cũng không chạy được. Em thử làm code truy vấn trên chính file hiện hành băng office 2007 OK và mở lại bằng kingsoft vẫn không được. Không biết file của anh trước khi gủi lên diễn đàn đã để read-only chưa vậy ạ hay em load về tự nó chuyển sang read-only. Nữa là file của anh có gì đặc biệt không mà chạy được trên kingsoft vậy ạ. ANH CÓ THỂ BỎ READ ONLY FILE JION TRÊN MÁY ANH VÀ GỦI LẠI CHO EM XIN FILE ĐÓ EM THỬ ĐƯỢC KHÔNG A" và có gì đó khác anh chỉ dẫn cho em với. XIN LỖI VÌ CHEN NGANG VẤN ĐỀ KHÁC Ạ. "Nhưng vẫn là muốn áp dụng cái ADO của anh rộng dãi thôi mà. Cảm ơn anh nhiều!!!

File mình gửi lên không set gì cả và cũng không có gì là đặc biệt. Để test trên kingsoft gì gì đó thì xin lỗi mình không biết.
 
mình thấy các ban thảo luận với nhau hay quá - xin lỗi vì chen ngang.
minh có copy code của các bạn vào file của mình. file chuong trình khi thực hiện sẽ ghi dữ liệu vào fìle data rất tốt bây giờ mình muốn làm ngược lại từ file chương trình Sheet2 lấy dữ liệu ở sheet tổng hợp của file data mà chưa làm được mong các bạn trợ giúp code ghi như sau:
file kèm
Sub ChuyenDL()
Dim Cnn As Object
Set Cnn = CreateObject("ADODB.Connection")
With Cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & _
"\data.xlsb;Extended Properties=""Excel 12.0;HDR=No;"""
.Open
.Execute "INSERT INTO [Sheet1$] SELECT F1,F2,F3,F4,F5,F6,F7 FROM [Excel 12.0;Database=" & _
ThisWorkbook.FullName & ";HDR=No].[Sheet1$A6:G82]"
End With
Cnn.Close: Set Cnn = Nothing
End Sub
 

File đính kèm

mình thấy các ban thảo luận với nhau hay quá - xin lỗi vì chen ngang.
minh có copy code của các bạn vào file của mình. file chuong trình khi thực hiện sẽ ghi dữ liệu vào fìle data rất tốt bây giờ mình muốn làm ngược lại từ file chương trình Sheet2 lấy dữ liệu ở sheet tổng hợp của file data mà chưa làm được mong các bạn trợ giúp code ghi như sau:
file kèm
Sub ChuyenDL()
Dim Cnn As Object
Set Cnn = CreateObject("ADODB.Connection")
With Cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & _
"\data.xlsb;Extended Properties=""Excel 12.0;HDR=No;"""
.Open
.Execute "INSERT INTO [Sheet1$] SELECT F1,F2,F3,F4,F5,F6,F7 FROM [Excel 12.0;Database=" & _
ThisWorkbook.FullName & ";HDR=No].[Sheet1$A6:G82]"
End With
Cnn.Close: Set Cnn = Nothing
End Sub
Bạn chạy code sau thử:

Mã:
Private Sub CommandButton1_Click()
    Dim adoConn As Object, adoRS As Object
    Set adoConn = CreateObject("ADODB.Connection")
    Set adoRS = CreateObject("ADODB.Recordset")
    With adoConn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Data Source=" & ThisWorkbook.Path & _
                            "\data.xlsb;Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
        .Open
    End With
    With adoRS
        .ActiveConnection = adoConn
        .Open "select * from [tonh hop$] "
    End With
    With Sheet2
        .[A2:G120].ClearContents
        .[A2].CopyFromRecordset adoRS
    End With
    adoRS.Close: Set adoRS = Nothing
    adoConn.Close: Set adoConn = Nothing
End Sub
 
Nếu mình muốn chỉnh sửa dữ liệu giữa 2 file A và B không cung 1 Folder thì sao?
Giả sử file A lưu ở Desktop, con file B lưu tại ổ D.
 
Nếu mình muốn chỉnh sửa dữ liệu giữa 2 file A và B không cung 1 Folder thì sao?
Giả sử file A lưu ở Desktop, con file B lưu tại ổ D.
Vẫn có thể được bạn à, chỉ chỉnh lại chuổi kết nối dữ liệu chút xíu là được.
 
[GPECODE=sql]
Sub Some_function_ADO_test()
'Declare some various connection objects
Dim cnn1 As New ADODB.Connection
Dim cnn2 As ADODB.Connection
Dim cnn3 As ADODB.Connection
Dim cnn4 As ADODB.Connection
Dim rcSet As New Recordset
Dim sqlStr As String
Dim DataSource1, DataSource2 As String
DataSource1 = "C:\Users\Nhat\Desktop\"
DataSource2 = "D:\Data\"
'Open a connection using a Data Source Name (DSN).
Set cnn1 = New ADODB.Connection
Set rcSet = New ADODB.Recordset

cnn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & DataSource1 & "\IpAddress.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
cnn1.ConnectionTimeout = 30
cnn1.Open

'Set SQL string command in copy from Workbook A to Workbook b
sqlStr = "INSERT INTO [Sheet2$] IN '" & DataSource & _
"\Book1.xls ' 'Excel 8.0;' SELECT f1,f2,f3,f4 FROM [Data$A1:D15]"



cnn1.Execute (sqlStr)
Set rcSet = Nothing
cnn1.Close
Set cnn1 = Nothing


End Sub[/GPECODE]
Mình đã chỉnh sửa theo như mình hiểu và mình đảm bảo là thong tin về đường dẫn cũng như thông tin các sheet trên các workbooks đều tồn tại, tuy nhiên khi chạy mình lại nhận được lỗi như hình dưới đây. Mong bạn chỉ giáo !


Error_8004e10.jpg
 
Chỉnh sửa lần cuối bởi điều hành viên:
[GPECODE]
Sub Some_function_ADO_test()
'Declare some various connection objects
Dim cnn1 As New ADODB.Connection
Dim cnn2 As ADODB.Connection
Dim cnn3 As ADODB.Connection
Dim cnn4 As ADODB.Connection
Dim rcSet As New Recordset
Dim sqlStr As String
Dim DataSource1, DataSource2 As String
DataSource1 = "C:\Users\Nhat\Desktop\"
DataSource2 = "D:\Data\"
'Open a connection using a Data Source Name (DSN).
Set cnn1 = New ADODB.Connection
Set rcSet = New ADODB.Recordset

cnn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & DataSource1 & "\IpAddress.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
cnn1.ConnectionTimeout = 30
cnn1.Open

'Set SQL string command in copy from Workbook A to Workbook b
sqlStr = "INSERT INTO [Sheet2$] IN '" & DataSource & _
"\Book1.xls ' 'Excel 8.0;' SELECT f1,f2,f3,f4 FROM [Data$A1:D15]"



cnn1.Execute (sqlStr)
Set rcSet = Nothing
cnn1.Close
Set cnn1 = Nothing


End Sub
[/GPECODE]
Mình đã chỉnh sửa theo như mình hiểu và mình đảm bảo là thong tin về đường dẫn cũng như thông tin các sheet trên các workbooks đều tồn tại, tuy nhiên khi chạy mình lại nhận được lỗi như hình dưới đây. Mong bạn chỉ giáo !

Bạn đưa 2 file đó lên xem cấu trúc thế nào nhé, mà nhìn code bạn viết thấy nó không ổn đã HDR=Yes thì sao bên dưới lại ghi F1,F2,F3...? Tôi chưa kể khai báo kết nối nhiều???
 
Book 1 là 1 wb rỗng có 3 sheet là “Sheet1”, “Sheet2”,”Sheet3” mình để ngay desktop nhằm mục đích test thôi nên có lẽ không cần đưa lên. IpAddress có 1 sheet là “Data”.
Mình khai báo kết nối nhiều căn bản là vì mình muốn phục vụ bài tập lớn hơn, nhân tiện đây cũng xin ý kiến các bạn luôn. Mình có 1 server có địa chỉ IP, UserName và Password. Mình muốn sau khi xử lý dữ liệu excel xong, sẽ gửi các thông tin cần thiết lên 1 file excel có mẫu sẵn trên server. Liệu có thể dung ADODB được không?
Cảm ơn cac bạn nhiều !
 

File đính kèm

Book 1 là 1 wb rỗng có 3 sheet là “Sheet1”, “Sheet2”,”Sheet3” mình để ngay desktop nhằm mục đích test thôi nên có lẽ không cần đưa lên. IpAddress có 1 sheet là “Data”.
Mình khai báo kết nối nhiều căn bản là vì mình muốn phục vụ bài tập lớn hơn, nhân tiện đây cũng xin ý kiến các bạn luôn. Mình có 1 server có địa chỉ IP, UserName và Password. Mình muốn sau khi xử lý dữ liệu excel xong, sẽ gửi các thông tin cần thiết lên 1 file excel có mẫu sẵn trên server. Liệu có thể dung ADODB được không?
Cảm ơn cac bạn nhiều !

Tôi không hiểu bạn muốn đưa cái gì vào file mà bạn để ở Desktop? Dữ liệu như thế này mà bạn đòi làm bàng ADO sao?
 
Tôi không hiểu bạn muốn đưa cái gì vào file mà bạn để ở Desktop? Dữ liệu như thế này mà bạn đòi làm bàng ADO sao?

Thật ra mình muốn test xem ADO hoạt động như thế nào thôi. Mình đang có bài toán là gửi những thông tin cần thiết lên server nên mình tạo các file trên máy mình để test trước khi xem liệu có thể làm tương tự trên server ko, vì vậy dữ liệu có thể hơi linh tinh mong bạn thông cảm.
Mình cũng không hiểu ý bạn là dữ liệu như thế nào thì làm bằng ADODB?
 
Thật ra mình muốn test xem ADO hoạt động như thế nào thôi. Mình đang có bài toán là gửi những thông tin cần thiết lên server nên mình tạo các file trên máy mình để test trước khi xem liệu có thể làm tương tự trên server ko, vì vậy dữ liệu có thể hơi linh tinh mong bạn thông cảm.
Mình cũng không hiểu ý bạn là dữ liệu như thế nào thì làm bằng ADODB?
Nếu bạn là người quản trị CSDL thì không cần phải hỏi tôi câu hỏi đó rồi. Còn nếu như chưa phải thì có thể từ từ nghiên cứu đi bạn.
 
Nếu bạn là người quản trị CSDL thì không cần phải hỏi tôi câu hỏi đó rồi. Còn nếu như chưa phải thì có thể từ từ nghiên cứu đi bạn.
Mình chưa từng quản trị dữ liệu nhưng mình nghĩ là làm được vì mình có đọc sách về ADO thấy họ truy cập và sửa dữ liệu trên SQL server với cấu trúc tương tự. Mình nghĩ tới việc là thử truy cập giữa các file excel khác nhau trên các thư mục khác nhau sau đó là truy cập file excel trên hai máy tính cùng mang LAN . Vấn đề quản trị dữ liệu mình sẽ tìm hiểu sau nhưng bài toán truy cập filex excel trên 2 thư mục khác nhau luôn gặp lỗi mà mình không nghĩ ra cách sửa. Nếu được bạn viết giúp mình code minh họa còn mình tự tìm hiểu các bài toán còn lại.
 
Web KT

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

Back
Top Bottom