[GIÚP ĐỠ] Chập chững đến với ADO. (1 người xem)

Liên hệ QC

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

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!
 

File đính kèm

Lần chỉnh sửa cuối:
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!
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
 
Upvote 0
Upvote 0
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
Có thể rút ngắn lại như sau:

PHP:
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
 
Upvote 0
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ày:(Kết nối tới Acceses)
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
Giờ tôi phải sửa chỗ nào trong đoạn code này ạ?
 
Upvote 0
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.
 
Upvote 0
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.

Nghe có vẻ cách giải thích của anh Phi và anh Huy khá là mâu thuẫn nhau:
Anh Phi:
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
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.
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"
 
Upvote 0
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ày:(Kết nối tới Acceses)
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
Giờ tôi phải sửa chỗ nào trong đoạn code này ạ?

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
 
Upvote 0
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!
 
Upvote 0
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!

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.
 
Upvote 0
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.
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
 
Lần chỉnh sửa cuối:
Upvote 0
Nghe 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
 
Upvote 0
Muốn chạy được thì phải thêm money vào:
FROM [Sheet1$]
 
Upvote 0
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
Mình chưa kịp xem nhưng chỗ này bị thiếu chữ $ sau số 1
"FROM [sheet1]
 
Upvote 0
Mà do Sub MoKetNoi() không bẫy lỗi nên bạn không biết bị lỗi ở đây. ThisWorkbook.Path không có "\" ở cuối nên phải sửa "chuot.xlsx" thành "\chuot.xlsx". 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ó.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn kiểm tra giúp với!
Đú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?
 
Upvote 0
Có hai cách sau Bạn sử dụng cách nào cũng OK
PHP:
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
 
Upvote 0
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.
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 $
 
Upvote 0
Thỉnh thoảng mình cũng viết code bằng ADO nên tạo sẵn 1 hàm kết nối. Bạn nào thấy ứng dụng được thì copy về xài cho thuận tiện, khỏi mắc công nhớ mấy cái đoạn như mì tôm cua hoa cả mắt.
PHP:
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
 
Upvote 0
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

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
 
Upvote 0
phải nói thật là học ADO mình ko nhớ gì hết mặc dù ADO bây giờ mình vẫn sử dụng tốt ... mỗi lần cần viết cái gì mở Code sưu tầm trên GPE ra coi lại một cái rồi mới viết được --=0--=0 phải chăng trí nhớ của mình quá kém....

Còn VBA học là mình nhớ liền mà VBA lấy dữ liệu File đóng tốc độ cũng đâu kém gì ADO đâu...????

ADO mà lấy dữ liệu lên phải cộng trừ nhân chia nó hay chứng lắm phải chăng khả năng xử lý ADO của mình kém....????

Có một lần mình viết một chương trình nhỏ sử dụng ADO lấy dữ liệu lên vẫn Cộng,trừ nhân chia bình thường sử dụng gần một năm ko sao ...

đến một ngày Win hỏng mình Ghét bản củ cài Bản mới xong mở chương trình lên sử dụng thì nó hết cộng,trừ nhân chia luôn ....Biết chết liền vậy là những cái phải cộng,trừ nhân chia là mình đoạn tuyệt với ADO luôn còn lại thì vẫn sử dụng bình thường

Tiện bạn chuot mở đề tài này mình cũng xin nêu lên như vậy để cho những bạn nào mới làm quen với ADO nghiên cứu thêm
 
Upvote 0
Nếu như trong File đính kèm của #1, tôi có 3 cột là "STT", "Họ và tên", "Địa chỉ". Giờ tôi chỉ muốn lấy 1 vài cột bất kì, ví dụ tôi muốn lấy cột "STT" và cột "Họ và tên" thôi thì tôi sửa code như sau nhưng vẫn không được. Nhờ các bạn góp ý và chỉnh sửa giúp với ạ!
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
Tôi đã sửa lại tên trường thanh không có dấu tiếng việt:
"Họ và tên"--> "ho ten"
"Địa chỉ"---?"dia chi"
 
Upvote 0
Tôi đã sửa được rồi! Bị thừa "SUPPLIER", nhưng không hiểu sao trường này lại ko đặt trong dấu ngoặc vuông nhỉ? Làm tôi cứ tưởng từ khóa
 
Upvote 0
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. Bạn kieumanh nói hết cộng trừ nhân chia có thể do dữ liệu đã được chuyển thành dạng text do imex = 1.
 
Upvote 0
CSDL có nhiều lắm. Ở connectionstrings.com có hết, copy paste vào là xong, khó nhất là câu lệnh SQL để xử lý dữ liệu.
 
Upvote 0
Nếu chỉ làm như yêu cầu của chủ thớt thì có thể lấy cái hàm ở bài #24, viết thêm cái hàm truy vấn và trả về recordset (hàm này gọi hàm kết nối)

Như vậy chỉ cần gọi hàm truy vấn, nạp cho nó cái path, và câu truy vấn sql là xong.

vd
Range("A5").CopyFromRecordSet TruyVan("C:\myFolder\myFile.xlsx", True, "Select f1, f2, f3 From [Sheet1$]")
 
Upvote 0
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 ạ?
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
File để test ở bài #1
 
Lần chỉnh sửa cuối:
Upvote 0
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 ạ?
Mã:
 For i = 1 To lrs.Fields.Count
    Cells(1, i).Value = lrs.Fields(i - 1).Name
    Next
Thêm cái này vào thử sao
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Không được anh Phi ạ!Nó báo lỗi "Object required"

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)
 
Lần chỉnh sửa cuối:
Upvote 0
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)
Đã ok cảm ơn anh nhiều lắm!
 
Upvote 0
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)

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
 
Upvote 0
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.
Chẳng hạn kết nối tới Access thì thế nào, kết nối tới Excel thì ra sao...
Tức là mẹo để nhờ các câu lệnh đó ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
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.

Đâ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 !
 
Upvote 0
Đâ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 !
Có thể chơi xấu bằng cách dùng HDR=No và IMEX = 1 nhưng không hay lắm.
 
Upvote 0
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.

Thêm MAXSCANROWS=0 đôi khi hiệu quả. Nhưng không luôn hiệu quả.

ADO là một object chuyên đọc dữ liệu. Nó phải dựa trên tiện nghi OLEDB để đọc các loại CSDL khác nhau. OLEDB mặc định cho excel là 8 dòng.
Trong registry có chỗ để sửa con số này nêu muốn. Key này tên là TypeGuessRows
Win 7: \HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel
 
Upvote 0

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

Back
Top Bottom