chuot0106
Thành viên gắn bó



- Tham gia
- 20/1/13
- Bài viết
- 2,567
- Được thích
- 1,670
Tôi có sửa đoạn code kết nối của bạn Hai Lúa Miền Tây để kết nối với File Excel đang đóng nhưng nó bão lỗi. Mong các thầy và các bạn giúp đỡ tôi chỉ ra lỗi trong đoạn code của tôi và cách khắc phục! Cảm ơn!
Sub Moketnoi()
Dim cnn As Object
Set cnn = CreateObject("ADODB.Connection")
Dim strCNString As String
strCNString = "Data Source=" & ThisWorkbook.Path & "\chuot0106.xlsx"
With cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& strCNString & ";Extended Properties=""Excel 12.0;"""
.Open
End With
End Sub
Theo em Hiểu đoạn màu đỏ đó là kết nối với sở dữ liệu Excel đúng ko anh?PHP:------------------------------------------------------------------- With cnn .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _ & strCNString & ";Extended Properties=""Excel 12.0;""" .Open
Tất cả những gì anh hải viết là dùng để kết nối csdl, cái đó bạn cũng nên thuộc lòng luôn, vì các kết nối là một kiểuTheo em Hiểu đoạn màu đỏ đó là kết nối với sở dữ liệu Excel đúng ko anh?
Có thể rút ngắn lại như sau:PHP:Sub Moketnoi() Dim cnn As Object Set cnn = CreateObject("ADODB.Connection") Dim strCNString As String strCNString = "Data Source=" & ThisWorkbook.Path & "\chuot0106.xlsx" With cnn .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _ & strCNString & ";Extended Properties=""Excel 12.0;""" .Open End With End Sub
Sub Moketnoi()
Dim cnn As Object
Set cnn = CreateObject("ADODB.Connection")
cnn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source=" & ThisWorkbook.Path & "\chuot0106.xlsx" & _
";Extended Properties=""Excel 12.0;""")
End Sub
Sub LayDuLieuTatCaCot()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi
lsSQL = "SELECT * " & _
"FROM tblData"
rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
Cells.ClearContents
Range("A5").CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub
Tất cả những gì anh hải viết là dùng để kết nối csdl, cái đó bạn cũng nên thuộc lòng luôn, vì các kết nối là một kiểu
Xin bổ xung thêm là Mỗi loại CSDL nguồn đều có cách kết nối khác nhau, nhưng chung quy thì phải kết nối mới làm việc được. Công đoạn này không thể thiếu trong lập trình.
Anh huy:Tất cả những gì anh hải viết là dùng để kết nối csdl, cái đó bạn cũng nên thuộc lòng luôn, vì các kết nối là một kiểu
Tôi nghiêng về cách giải thích của anh Huy.Xin bổ xung thêm là Mỗi loại CSDL nguồn đều có cách kết nối khác nhau, nhưng chung quy thì phải kết nối mới làm việc được. Công đoạn này không thể thiếu trong lập trình.
Giờ trong File "ADO" tôi đã gửi, tôi muốn lấy 3 cột từ File.xls "chuot0106" sang bên File "ChapChungADO" thì code viết sao vậy các bạn? Code mẫu của anh "Hai lúa miền tây" là thế nàyKết nối tới Acceses)
Giờ tôi phải sửa chỗ nào trong đoạn code này ạ?Mã:Sub LayDuLieuTatCaCot() On Error GoTo loi Dim lsSQL As String: Dim rst As New ADODB.Recordset If cnn.State <> 1 Then Moketnoi lsSQL = "SELECT * " & _ "FROM tblData" rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly Cells.ClearContents Range("A5").CopyFromRecordset rst rst.Close Set rst = Nothing cnn.Close Set cnn = Nothing Exit Sub loi: MsgBox Err.Description End Sub
Sub LayDL()
Dim cnn As Object, rst As Object
Set cnn = CreateObject("ADODB.Connection")
cnn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source=" & ThisWorkbook.Path & "\chuot0106.xlsx" & _
";Extended Properties=""Excel 12.0;""")
Set rst = cnn.Execute("SELECT * FROM [SHEET1$]")
ActiveCell.CopyFromRecordset rst
End Sub
Cảm ơn bạn nhiều lắm! Kết quả đúng như ý luôn bạn ạ! Nhưng bạn có thể viết 1 cách tường minh giúp tôi với được không bạn? Tức bạn không cần rút ngắn code đâu, bạn cứ viết như của Hai lúa miền tây đó. Do tôi đang muốn học hỏi mà, nếu đòi hỏi của tôi quá đáng quá mong bạn bỏ quá cho!Với yêu cầu của bạn thì viết như sau:
PHP:Sub LayDL() Dim cnn As Object, rst As Object Set cnn = CreateObject("ADODB.Connection") cnn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=" & ThisWorkbook.Path & "\chuot0106.xlsx" & _ ";Extended Properties=""Excel 12.0;""") Set rst = cnn.Execute("SELECT * FROM [SHEET1$]") ActiveCell.CopyFromRecordset rst End Sub
Cảm ơn bạn nhiều lắm! Kết quả đúng như ý luôn bạn ạ! Nhưng bạn có thể viết 1 cách tường minh giúp tôi với được không bạn? Tức bạn không cần rút ngắn code đâu, bạn cứ viết như của Hai lúa miền tây đó. Do tôi đang muốn học hỏi mà, nếu đòi hỏi của tôi quá đáng quá mong bạn bỏ quá cho!
Biết là viết như của anh là "ngon cơm" rồi, tuy nhiên em đang học căn bản như anh Hai lúa viết nên nhờ anh sửa giúp từ đoạn code anh Hai lúa đã viết ở trên để em học đó mà! Cảm ơn anh!Thì cái này tôi học từ Hai Lúa mà, cố gắng hiểu cú pháp như mình viết hiện tại là ngon cơm.
Option Explicit
Public cnn As New ADODB.Connection
Sub Moketnoi()
Set cnn = New ADODB.Connection
Dim strCNString As String
strCNString = "Data Source=" & ThisWorkbook.Path & "chuot0106.xls"
With cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& strCNString & ";Extended Properties=""Excel 12.0;"""
.Open
End With
End Sub
Sub LayDuLieuTatCaCot()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi
lsSQL = "SELECT * " & _
"[COLOR=#ff0000][B]FROM [sheet1][/B][/COLOR]"
rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
Cells.ClearContents
Range("A5").CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub
Nếu bạn có kiến thức cơ bản bạn sẽ thấy tôi nói không saiNghe có vẻ cách giải thích của anh Phi và anh Huy khá là mâu thuẫn nhau:
Anh Phi:
Anh huy:
Tôi nghiêng về cách giải thích của anh Huy.
Vì tôi thấy code kết nối tới CSDL "Access" khác với code kết nối tới CSDL "Excel"
Nếu bạn có kiến thức cơ bản bạn sẽ thấy tôi nói không sai
Mình chưa kịp xem nhưng chỗ này bị thiếu chữ $ sau số 1Biết là viết như của anh là "ngon cơm" rồi, tuy nhiên em đang học căn bản như anh Hai lúa viết nên nhờ anh sửa giúp từ đoạn code anh Hai lúa đã viết ở trên để em học đó mà! Cảm ơn anh!
Em thử sửa như thế này mà nó báo lỗi ạ!
Mã:Option Explicit Public cnn As New ADODB.Connection Sub Moketnoi() Set cnn = New ADODB.Connection Dim strCNString As String strCNString = "Data Source=" & ThisWorkbook.Path & "chuot0106.xls" With cnn .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _ & strCNString & ";Extended Properties=""Excel 12.0;""" .Open End With End Sub Sub LayDuLieuTatCaCot() On Error GoTo loi Dim lsSQL As String: Dim rst As New ADODB.Recordset If cnn.State <> 1 Then Moketnoi lsSQL = "SELECT * " & _ "[COLOR=#ff0000][B]FROM [sheet1][/B][/COLOR]" rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly Cells.ClearContents Range("A5").CopyFromRecordset rst rst.Close Set rst = Nothing cnn.Close Set cnn = Nothing Exit Sub loi: MsgBox Err.Description End Sub
Đúng là bị thiếu \ như anh Hậu nói, hồi xưa lúc vào diễn đàn nước ngoài cũng thấy có chữ $ tưởng họ viết nhầm, bỏ đi tèo ngay . Mình ko hiểu cái đó có ý nghĩa thế nào, không biết có phải là dữ liệu nguồn thì thêm vào để phân biệt không?Bạn kiểm tra giúp với!
Có hai cách sau Bạn sử dụng cách nào cũng OKChính xác luôn anh ạ!
Sub Check_File()
Dim FileName As String
FileName = ThisWorkbook.Path & "\chuot.xlsx"'Cách 1
FileName = ThisWorkbook.Path & "\" & "chuot.xlsx"'Cách 2
MsgBox FileName
End Sub
Còn dấu $ là quy định khi lấy làm việc với sheet, làm việc với Name thì không có. Tiếp bài viết của anh Hậu, FROM [Sheet1$], bạn có thể viết thành "FROM CHUOT" , CHUOT LÀ VÙNG NAME TRONG SHEET1 nhé, thì sẽ không cần $Lúc đầu em cũng có cho nhưng thấy nó ko chạy nên em bỏ đi. Bỏ đi cũng thấy ko chạy luôn anh ạ. Em cũng ko rõ ý nghĩa của dấu $ này. Không biết lỗi do đâu nữa.
Function GetExcelConnection(ByVal Path As String, Optional ByVal Header As Boolean = True)
Dim StrConn As String, ObjConn As Object, Pro As String, Ext As String
Set ObjConn = CreateObject("ADODB.Connection")
If Application.Version < 12 Then
Pro = "Provider=Microsoft.JET.OLEDB.4.0;"
Ext = ";Extended Properties=""Excel 8.0;"
Else
Pro = "Provider=Microsoft.ACE.OLEDB.12.0;"
Ext = ";Extended Properties=""Excel 12.0;"
End If
StrConn = Pro & "Data Source=" & Path & Ext & _
"HDR=" & IIf(Header, "Yes", "No") & ";IMEX=1"";"
ObjConn.Open StrConn
Set GetExcelConnection = ObjConn
End Function
Biết là viết như của anh là "ngon cơm" rồi, tuy nhiên em đang học căn bản như anh Hai lúa viết nên nhờ anh sửa giúp từ đoạn code anh Hai lúa đã viết ở trên để em học đó mà! Cảm ơn anh!
Em thử sửa như thế này mà nó báo lỗi ạ!
Mã:Option Explicit Public cnn As New ADODB.Connection Sub Moketnoi() Set cnn = New ADODB.Connection Dim strCNString As String strCNString = "Data Source=" & ThisWorkbook.Path & "chuot0106.xls" With cnn .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _ & strCNString & ";Extended Properties=""Excel 12.0;""" .Open End With End Sub Sub LayDuLieuTatCaCot() On Error GoTo loi Dim lsSQL As String: Dim rst As New ADODB.Recordset If cnn.State <> 1 Then Moketnoi lsSQL = "SELECT * " & _ "[COLOR=#ff0000][B]FROM [sheet1][/B][/COLOR]" rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly Cells.ClearContents Range("A5").CopyFromRecordset rst rst.Close Set rst = Nothing cnn.Close Set cnn = Nothing Exit Sub loi: MsgBox Err.Description End Sub
Em cảm ơn anh nhiều lắm ạ!Bạn nên vào link http://www.giaiphapexcel.com/forum/showthread.php?75143-Bài-tập-về-ADO-căn-bản để xem thêm
Public cnn As New ADODB.Connection
Sub Moketnoi()
Set cnn = New ADODB.Connection
Dim strCNString As String
'strCNString = "Data Source=" & ThisWorkbook.Path & "\CSDL.mdb"
strCNString = "Data Source=" & ThisWorkbook.Path & "\chuot0106.xlsx"
'MsgBox strCNString
With cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& strCNString & ";Extended Properties=""Excel 12.0;"""
.Open
End With
End Sub
'----------------------------------------------------------------------------
Sub LayDuLieu3Cot()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi
lsSQL = "SELECT SUPPLIER, [COLOR=#ff0000][B][STT][/B][/COLOR], [COLOR=#ff0000][B][ho ten] [/B][/COLOR]" & _
"FROM [sheet1$]"
'lsSQL = "SELECT SUPPLIER, [MATERIAL NAME], [COLOR NAME] " & _
"FROM tblData"
rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
Cells.ClearContents
Range("E1").CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub
Phải chăng là access, excel và Foxpro phải ko anh?Dùng ADO khi kết nối với Excel thì chắc không nhanh bằng dùng array, nhưng ADO có lợi là mình có thể xử lý dữ liệu ở nhiều loại csdl khác nhau, chi cần thay mỗi thủ tục MoKetNoi.
Public cnn As New ADODB.Connection
Sub Moketnoi()
Set cnn = New ADODB.Connection
Dim strCNString As String
'strCNString = "Data Source=" & ThisWorkbook.Path & "\CSDL.mdb"
strCNString = "Data Source=" & ThisWorkbook.Path & "\chuot0106.xlsx"
'MsgBox strCNString
With cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& strCNString & ";Extended Properties=""Excel 12.0;"""
.Open
End With
End Sub
'----------------------------------------------------------------------------
Sub LayDuLieu3Cot()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi
lsSQL = "SELECT SUPPLIER, [COLOR=#ff0000][B][STT][/B][/COLOR], [COLOR=#ff0000][B][ho ten] [/B][/COLOR]" & _
"FROM [sheet1$]"
'lsSQL = "SELECT SUPPLIER, [MATERIAL NAME], [COLOR NAME] " & _
"FROM tblData"
rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
Cells.ClearContents
Range("E1").CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub
Tôi đã biết cách lấy dữ liệu từ 1 File đang đóng tuy nhiên nó chỉ lấy dữ liệu dưới các trường thôi. Vậy nếu muốn lấy cả tên trương thì code phải sửa thế nào ạ?
For i = 1 To lrs.Fields.Count
Cells(1, i).Value = lrs.Fields(i - 1).Name
Next
nó nằm sau cái câu lệnh này nèAnh có thể hướng dẫn cụ thể hơn được không ạ!
Biến Recordset là rst chứ không phải lrs, thay bằng rst.fields là được. Ngoài ra câu lệnh SQL bị sai, không có trường SUPPLIER.Không được anh Phi ạ!Nó báo lỗi "Object required"
Đã ok cảm ơn anh nhiều lắm!Biến Recordset là rst chứ không phải lrs, thay bằng rst.fields là được. Ngoài ra câu lệnh SQL bị sai, không có trường SUPPLIER.
Sub MoKetNoi hình như thừa lệnh Set cnn=New...?
Mình định dùng HDR=No ở connection string để lấy luôn tiêu đề nhưng lúc trả kết quả lại thiếu tên trường STT chỉ còn 2 tên trường Họ tên và Địa chỉ, điều này mình chưa hiểu tại sao? (Thì ra nó coi trường STT là number nên những dữ liệu text nó cho thành null hết)
Biến Recordset là rst chứ không phải lrs, thay bằng rst.fields là được. Ngoài ra câu lệnh SQL bị sai, không có trường SUPPLIER.
Sub MoKetNoi hình như thừa lệnh Set cnn=New...?
Mình định dùng HDR=No ở connection string để lấy luôn tiêu đề nhưng lúc trả kết quả lại thiếu tên trường STT chỉ còn 2 tên trường Họ tên và Địa chỉ, điều này mình chưa hiểu tại sao? (Thì ra nó coi trường STT là number nên những dữ liệu text nó cho thành null hết, để sửa thì cho IMEX=1;HDR=No)
Em hỏi riêng anh 1 chút là anh có mẹo nào để có thể nhớ các lệnh để kết nối tới từng loại cơ sở dữ liệu không ạ! Quả thật em nhìn vào như mớ bòng bong luôn.Biến Recordset là rst chứ không phải lrs, thay bằng rst.fields là được. Ngoài ra câu lệnh SQL bị sai, không có trường SUPPLIER.
Sub MoKetNoi hình như thừa lệnh Set cnn=New...?
Mình định dùng HDR=No ở connection string để lấy luôn tiêu đề nhưng lúc trả kết quả lại thiếu tên trường STT chỉ còn 2 tên trường Họ tên và Địa chỉ, điều này mình chưa hiểu tại sao? (Thì ra nó coi trường STT là number nên những dữ liệu text nó cho thành null hết, để sửa thì cho IMEX=1;HDR=No)
Trong link ở bài đó có nói ADO sẽ tìm 8 dòng đầu tiên, nếu tất cả là số thì nếu IMEX=1 cũng không convert từ số sang text.Nguyên nhân anh đọc tại bài #7 topic này nhé. Chủ topic này cũng nên đọc qua các bài trong topic đó để có thể hiểu một số vấn đề đã được đề cập. Những vấn đề trong topic này đều có câu trả lời hết rôi.
http://www.giaiphapexcel.com/forum/showthread.php?80367-Đố-vui-về-ADO-DAO
Trong link ở bài đó có nói ADO sẽ tìm 8 dòng đầu tiên, nếu tất cả là số thì nếu IMEX=1 cũng không convert từ số sang text.
Vấn đề mình thắc mắc hơi khác: nếu 8 dòng đầu là số, dòng 9 là chữ thì IMEX = 0 hay 1 cũng bị chuyển thành null, điều này trong link đó không nói và có thể ảnh hưởng đến kết quả mong muốn.
Có thể chơi xấu bằng cách dùng HDR=No và IMEX = 1 nhưng không hay lắm.Đây là điều mình cũng đã từng gặp và tới giờ cũng không biết giải quyết ra sao . Nghe mấy a nói nếu đã dùng ADO thì dữ liệu phải chuẩn hóa nếu không thì ...
Do đó cách mình là len lén mở 'ông đó' lên rồi copy qua cho nó mau thấy !
Trong link ở bài đó có nói ADO sẽ tìm 8 dòng đầu tiên, nếu tất cả là số thì nếu IMEX=1 cũng không convert từ số sang text.
Vấn đề mình thắc mắc hơi khác: nếu 8 dòng đầu là số, dòng 9 là chữ thì IMEX = 0 hay 1 cũng bị chuyển thành null, điều này trong link đó không nói và có thể ảnh hưởng đến kết quả mong muốn.