Chỉnh sữa code lấy dữ liệu bằng ADO

Liên hệ QC

Thien

Thành viên thường trực
Tham gia
23/6/06
Bài viết
352
Được thích
112
Hi các bạn !

Hiện đang dùng code sau để lấy dữ liệu:
Mã:
Private Sub CommandButton1_Click()
       Table_Query "PS", S00, "A4", "ODBC", ThisWorkbook.Path & "\TL01_07.xls", "Select * From [Phat sinh$A4:AA467] "
       Table_Query "PS", S00, "A470", "ODBC", ThisWorkbook.Path & "\TL02_07.xls", "Select * From [Phat sinh$A4:AA339] "
       Table_Query "PS", S00, "A807", "ODBC", ThisWorkbook.Path & "\TL03_07.xls", "Select * From [Phat sinh$A4:AA359] "
       Table_Query "PS", S00, "A1163", "ODBC", ThisWorkbook.Path & "\TL04_07.xls", "Select * From [Phat sinh$A4:AA397] "
       Table_Query "PS", S00, "A1558", "ODBC", ThisWorkbook.Path & "\TL05_07.xls", "Select * From [Phat sinh$A4:AA386] "
       Table_Query "PS", S00, "A1942", "ODBC", ThisWorkbook.Path & "\TL06_07.xls", "Select * From [Phat sinh$A4:AA448] "
       Table_Query "PS", S00, "A2388", "ODBC", ThisWorkbook.Path & "\TL07_07.xls", "Select * From [Phat sinh$A4:AA515] "
       'Table_Query "PS", S00, "A2901", "ODBC", ThisWorkbook.Path & "\TL08_07.xls", "Select * From [Phat sinh$A4:AA591] "
      Table_Query "PS", S00, "A3489", "ODBC", ThisWorkbook.Path & "\TL09_07.xls", "Select * From [Phat sinh$A4:AA525] "
       Table_Query "PS", S00, "A4012", "ODBC", ThisWorkbook.Path & "\TL10_07.xls", "Select * From [Phat sinh$A4:AA457] "
       Table_Query "PS", S00, "A4468", "ODBC", ThisWorkbook.Path & "\TL11_07.xls", "Select * From [Phat sinh$A4:AA495] "
        Table_Query "PS", S00, "A4962", "ODBC", ThisWorkbook.Path & "\TL12_07.xls", "Select * From [Phat sinh$A4:AA520] "
End Sub

Nhưng có 1 chỗ nhờ cải tiến dùm như sau:
- Sau khi lấy dữ liệu trong TL01_07 xong thì dòng đầu tiên của tháng TL02_07 sẽ nối tiếp cách tháng 1 khoảng 2 dòng.
- Hiện tại đang làm thủ công phần xác định dòng đầu tiên cho Code tháng TL02_07 chạy như mô tả trong đoạn code trên.
- Còn đây là code Query:
Mã:
Function Table_Query(strTableName As String, _
                        shDestinationSheet As Worksheet, _
           Optional strDestinationRange As String = "A1", _
           Optional strProvider As String = "ODBC", _
           Optional strDataSource As String, _
           Optional strSQL As String, _
           Optional strUserID As String, _
           Optional strPassword As String) As Object

' Cac tham so cho ham Table_Query:
'-  strTableName As String: Chuoi bieu dien Name nguon Co so du lieu, chung ta nen dat mot Name trong
'        Database de tien quan ly va truy xuat
'       (Trong vi du cua anh, mo file Data.xls de xem Name nay)
'-  shDestinationSheet As Worksheet: Bang tinh dich chi ra rang du lieu ket xuat se duoc dat vao do
'-  strDestinationRange As Range: O bat dau de du lieu dua xuong trong shDestinationSheet
'-  Optional strProvider As String = "ODBC": chi ra rang   CSDL duoc cung cap boi "Nha Cung cap" nao, mac dinh la ODBC
'-  Optional strDataSource As String: Cai ma MrOkeBiladen dang thac mac, de co duong dan thay doi theo thu muc cua File
'        chua module co code nay
'        su dung thuoc tinh Path cua ThisWorkbook (xem vi du ben duoi)
'-  Optional strSQL As String: Chuoi SQL
'-  Optional strUserID As String: (Optional)
'   Optional strPassword As String: (Optional)

If strUserID = "" Then strUserID = "ADMIN"
If strDataSource = "" Then strDataSource = ThisWorkbook.Path & "\" & ThisWorkbook.NAME

Dim strConnection As String
'NÕu sö dông tr×nh kÕt nèi ODBC, Table_Queryle sÏ ®­îc cung cÊp CommanText lµ mét SQL
If strProvider = "ODBC" Then
    strConnection = "ODBC;DBQ=" & strDataSource
    strConnection = strConnection & ";Driver={Microsoft Excel Driver (*.xls)}"
Else
    strConnection = "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;"
    strConnection = strConnection & "Password=" & strPassword & ";"
    strConnection = strConnection & "User ID=" & strUserID & ";"
    strConnection = strConnection & "Data Source=" & strDataSource
    Table_Query.CommandType = xlCmdTable & "$"
    Table_Query.AdjustColumnWidth = False
End If
' Neu shDestinationSheet.QueryTables da ton tai thi xoa di:
'If shDestinationSheet.QueryTables.Count > 0 Then
'    TEMP.QueryTables(1).Delete
'End If
On Error GoTo TRY ' Co gang thu lai, co the shDestinationSheet chu duoc Activate (ma loi:2147024809)
REFRESH_NOW:
Set Table_Query = shDestinationSheet.QueryTables.Add(strConnection, shDestinationSheet.Range(strDestinationRange))
Table_Query.NAME = strTableName
Application.DisplayAlerts = False
Table_Query.RefreshStyle = xlOverwriteCells
Table_Query.SourceDataFile = strDataSource
Table_Query.CommandText = IIf(strProvider = "ODBC", strSQL, strTableName & "$")
Table_Query.REFRESH
Application.DisplayAlerts = True
Exit Function
TRY:
Select Case ERR.Number
Case -2147024809
    shDestinationSheet.Activate
    GoTo REFRESH_NOW
Case Else ' Khong duoc roi, xem lai chuoi ket noi da chuan chua:
    MsgBox ERR.Number & "-" & ERR.Description & ":" & vbNewLine & _
    "Connect string:" & vbNewLine & strConnection & vbNewLine & _
    "SQL string:" & vbNewLine & strSQL
End Select
End Function

Hy vọng nhận được hồi âm sớm vì đang rất cần cho công việc đang làm.

Thân.
 
Lần chỉnh sửa cuối:
Hi All!

Mình pót bài không đúng chỗ hay mình không đáng nhận được sự giúp đỡ vậy các bạn.

Thân.
 
Upvote 0
Đừng nhạy cảm vậy, vẫn có người đọc trang của bạn mà chỉ có điều là "Thầy chưa về" với mình thì mù tịch biết trả lời bạn như thế nào đây! Bạn chịu khó kiên nhẫn thêm nha, chờ cao thủ biết chiêu này sẽ chỉ cho bạn (nếu có). Mình chúc bạn sớm hoàng thành!
Chúc thành công và an vui!
 
Upvote 0
Thử ý này xem :
Tại file đích : Xác định số dòng đầu tiên muốn ghi (DongDau).
Tại file tháng n : Xác định số record trong tháng n (SoRecord).
Tại file đích : Di chuyển đến vị trí DongDau, ghi dữ liệu từ file nguồn tháng n sang.
Vẫn tại file đích : Sau khi ghi dữ liệu xong thì xác định lại dòng đầu mới : DongDau = DongDau + SoRecord.
Sang file tháng n +1 : Xác định số record trong tháng n +1 (SoRecord).
Tiếp tục ….
 
Upvote 0
To : Thiên,
Cho tôi hỏi:
Mục đích của hàm Table_Query của bạn là gì?
Ở đây tôi thấy bạn khai báo
Mã:
Function Table_Query(strTableName As String, _
                        shDestinationSheet As Worksheet, _
           Optional strDestinationRange As String = "A1", _
           Optional strProvider As String = "ODBC", _
           Optional strDataSource As String, _
           Optional strSQL As String, _
           Optional strUserID As String, _
           Optional strPassword As String) As Object
Trong phần dưới tôi thấy bạn set như sau:
Mã:
Set Table_Query = shDestinationSheet.QueryTables.Add(strConnection, shDestinationSheet.Range(strDestinationRange))
Vậy phải chăng bạn muốn hàm trên lấy về đối tượng QueryTable?

Còn đoạn code của bạn sử dụng hàm trên lại là:
Mã:
Private Sub CommandButton1_Click()
       Table_Query "PS", S00, "A4", "ODBC", ThisWorkbook.Path & "\TL01_07.xls", "Select * From [Phat sinh$A4:AA467] "
       Table_Query "PS", S00, "A470", "ODBC", ThisWorkbook.Path & "\TL02_07.xls", "Select * From [Phat sinh$A4:AA339] "
       Table_Query "PS", S00, "A807", "ODBC", ThisWorkbook.Path & "\TL03_07.xls", "Select * From [Phat sinh$A4:AA359] "
       Table_Query "PS", S00, "A1163", "ODBC", ThisWorkbook.Path & "\TL04_07.xls", "Select * From [Phat sinh$A4:AA397] "
       Table_Query "PS", S00, "A1558", "ODBC", ThisWorkbook.Path & "\TL05_07.xls", "Select * From [Phat sinh$A4:AA386] "
       Table_Query "PS", S00, "A1942", "ODBC", ThisWorkbook.Path & "\TL06_07.xls", "Select * From [Phat sinh$A4:AA448] "
       Table_Query "PS", S00, "A2388", "ODBC", ThisWorkbook.Path & "\TL07_07.xls", "Select * From [Phat sinh$A4:AA515] "
       'Table_Query "PS", S00, "A2901", "ODBC", ThisWorkbook.Path & "\TL08_07.xls", "Select * From [Phat sinh$A4:AA591] "
      Table_Query "PS", S00, "A3489", "ODBC", ThisWorkbook.Path & "\TL09_07.xls", "Select * From [Phat sinh$A4:AA525] "
       Table_Query "PS", S00, "A4012", "ODBC", ThisWorkbook.Path & "\TL10_07.xls", "Select * From [Phat sinh$A4:AA457] "
       Table_Query "PS", S00, "A4468", "ODBC", ThisWorkbook.Path & "\TL11_07.xls", "Select * From [Phat sinh$A4:AA495] "
        Table_Query "PS", S00, "A4962", "ODBC", ThisWorkbook.Path & "\TL12_07.xls", "Select * From [Phat sinh$A4:AA520] "
End Sub
Vậy mục đích hàm của bạn, tôi thấy nó có vấn đề.

Thông thường các query sẽ trả về Recordset. Nếu vậy khi xác định số lượng Record thì chúng ta có thể xác định vị trí để xuất dữ liệu ra.
Mã:
RecordsQty=ObjQueryTable.Recordset.Recordcount
Do không rành về mảng này, nên chỉ có vài hàng suy luận. Hy vọng bạn có thể thực hiện theo ý muốn của mình.
Bạn có thể tham khảo ở đây:
http://excelkb.com/article.aspx?id=10167
Lê Văn Duyệt
 
Upvote 0
Hi Anh Duyệt.

Code trong Query là em làm theo Đào Việt Cường có tác dụng lấy dữ liệu từ file đóng dạng ODBC. Ý nghĩa thì em không hiểu nhưng tác dụng khi dùng thì em thấy rất hiệu quả trong việc lấy dữ liệu từ file đóng mà không cần mở file lên.
Còn
Mã:
Private Sub CommandButton1_Click()
       Table_Query "PS", S00, "A4", "ODBC", ThisWorkbook.Path & "\TL01_07.xls", "Select * From [Phat sinh$A4:AA467] "
       Table_Query "PS", S00, "A470", "ODBC", ThisWorkbook.Path & "\TL02_07.xls", "Select * From [Phat sinh$A4:AA339]
là em lấy dữ liệu trong vùng name PS từ file TL01_07.xls với giới hạn từ A4:AA467 đặt vào dòng A4 của sheet SOO.
Em đang vướng ở chỗ viết code cho nối tiếp dữ liệu lấy từ TL02_07.xls nối tiếp dữ liệu đã lấy từ TL01_07.xls.
Hiện tại em phải chạy code lấy dữ liệu từ TL01_07.xls xong xem dòng cuối là bao nhiêu rồi em định dạng dòng đầu tiên cho dữ liệu lấy từ TL02_07.xls (ở đây là dòng A470)

Hy vọng anh giúp hộ.

Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom