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

Liên hệ QC
Anh thử chỉnh lại như sau:

[GPECODE=vb]Sub Test()
Dim Arr()
Arr = GetData(ThisWorkbook.Path & "\A.xls", "Data")
Range("A2").Resize(UBound(Arr) + 1, UBound(Arr, 2) + 1).Value = Arr
End Sub

[/GPECODE]
Ah.. Cảm ơn Anh. Đọc không kỹ hàm TransArr()
Anh cho em hỏi vì sao khi em set cnn có HDR=Yes nhưng khi xuất dữ liệu không có tiêu đề vậy Anh?
 
Ah.. Cảm ơn Anh. Đọc không kỹ hàm TransArr()
Anh cho em hỏi vì sao khi em set cnn có HDR=Yes nhưng khi xuất dữ liệu không có tiêu đề vậy Anh?

Hihi, câu hỏi khá thú vị.
Muốn lấy tiêu đề cột ta phải thêm code lấy, còn HDR=Yes có nghĩa là khi ta truy vấn đến csdl thì phải "kiu" tên cột rõ ràng. Còn ngược lại thì phải "kiu" nó = F1, F2... Fn theo số cột tương ứng.
Anh tham khảo từ bài 105 trở đi http://www.giaiphapexcel.com/forum/...vấn-CSDL-từ-file-Excel-đến-file-Access/page11
 
Hihi, câu hỏi khá thú vị.
Muốn lấy tiêu đề cột ta phải thêm code lấy, còn HDR=Yes có nghĩa là khi ta truy vấn đến csdl thì phải "kiu" tên cột rõ ràng. Còn ngược lại thì phải "kiu" nó = F1, F2... Fn theo số cột tương ứng.
Anh tham khảo từ bài 105 trở đi http://www.giaiphapexcel.com/forum/...vấn-CSDL-từ-file-Excel-đến-file-Access/page11
1. Anh cho em hỏi thêm: Hinh file dữ liệu có định dạng thì nó báo lỗi
LoiADO3.JPG
Tại dòng .Open
Em thử copy dữ liệu sang 1 file khác dán Value thì được. Vậy trường hợp này giải quyết như thế nào Anh?
2. Khi dữ liệu lên 53.200 dòng thì thấy hợi chậm. Có cách nào cải thiện tốc độ hơn không Anh?
Cảm ơn Anh rất nhiều
 
Lần chỉnh sửa cuối:
Anh cho em hỏi thêm: Hinh file dữ liệu có định dạng thì nó báo lỗi
View attachment 94649
Tại dòng .Open
Em thử copy dữ liệu sang 1 file khác dán Value thì được. Vậy trường hợp này giải quyết như thế nào Anh?
Cảm ơn Anh rất nhiều

Hỏng lẻ code thiếu IMEX=1. Anh có thể đưa ví dụ để em test thử được không?
 
Do cái tiêu đề tiếng việt của anh mà ra, anh chỉnh lại tiêu đề TV có dấu sang không dấu rồi test lại xem sao nhé.
Vẫn không được Anh à. Nhưng nếu thế thì ở bài 23 em copy nguyên sheet (tức bao gồm tiêu đề Tiếng Việt) nhưng nó vẫn được
 
Vẫn không được Anh à. Nhưng nếu thế thì ở bài 23 em copy nguyên sheet (tức bao gồm tiêu đề Tiếng Việt) nhưng nó vẫn được
Vậy anh test thử cái này:

[GPECODE=sql]Function GetData(FileFullName, ShName As String)
Dim lsSQL As String, Cnn As Object, lrs As Object, rstArr As Variant
Set Cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With Cnn
If Val(Application.Version) < 12 Then
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
Else
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
End If
.Open
End With
lsSQL = "SELECT * " & "FROM [" & ShName & "$A2:E53281] "
lrs.Open lsSQL, Cnn, 3, 1
rstArr = lrs.GetRows
GetData = TransArr(rstArr)
End Function

[/GPECODE]
 
Có điều là anh mở file Database1 lên rồi qua file B chạy code trong khi file csdl vẫn mở thì bình thường.

Không biết nó như thế nào nữa, để em test lại.
Hey ah.. đúng thật như vậy. Nếu mở file Database1 lên thì code chạy bình thường. Không biết sao nữa?
 
Có điều là anh mở file Database1 lên rồi qua file B chạy code trong khi file csdl vẫn mở thì bình thường.

Không biết nó như thế nào nữa, để em test lại.
Anh chú cho em vì sao cnn.Open không được? Khi ta mở file Database1 lên rồi có nghĩa là đã bỏ qua được lệnh này nên code chạy???

Em thử là như sau:
1. Tạo file Excel mới đặt tên DataBase2
2. Copy DL các sheet File DataBase1 sang DataBase2 và đổi tên sheet giống DataBase1
Chạy thử code ngon lành. Vậy chăng lỗi ấy từ File chứ không phải dữ liệu trong file???
 
Chỉnh sửa lần cuối bởi điều hành viên:
Em có mở rộng thêm nguồn dữ liệu ở hàm GetData()
Nhờ anh giúp tiếp nội dung sau
1. Vì sao dữ liệu xuất ra (cột D) là text mà đúng ra là Number
2. Bổ sung code để lấy dữ liệu cột 4 bă đầu bằng N chẳng hạn ("N*")
(Có đọc các link bằng câu lệnh WHERE nhưng làm chưa được)
Sửa câu lệnh sau như thế nào
[GPECODE=vb] lsSQL = "SELECT f1, f2, f3, f4, f5 " & "FROM [" & ShName & "$" & sRng & "]" & _
"WHERE f5 = N*"


[/GPECODE]
Cảm ơn Anh
 

File đính kèm

  • Test.rar
    930.8 KB · Đọc: 124
Lần chỉnh sửa cuối:
Em có mở rộng thêm nguồn dữ liệu ở hàm GetData()
Nhờ anh giúp tiếp nội dung sau
1. Vì sao dữ liệu xuất ra (cột D) là text mà đúng ra là Number
2. Bổ sung code để lấy dữ liệu cột 4 bă đầu bằng N chẳng hạn ("N*")
(Có đọc các link bằng câu lệnh WHERE nhưng làm chưa được)
Sửa câu lệnh sau như thế nào
[GPECODE=vb] lsSQL = "SELECT f1, f2, f3, f4, f5 " & "FROM [" & ShName & "$" & sRng & "]" & _
"WHERE f5 = N*"


[/GPECODE]
Cảm ơn Anh

1./ Chừa dòng tiêu đề ra, vì anh lấy cả dòng tiêu đề nên nó hiểu là text
2./ Dữ liệu của anh rất khó xử, vì có dòng dữ liệu xen kẻ nên không thể lọc theo ý muốn. Nếu lọc N thì nó chỉ lấy dòng có giá trị, còn những dòng trống nó bỏ đi thì kết quả không như mong đợi.
 
1./ Chừa dòng tiêu đề ra, vì anh lấy cả dòng tiêu đề nên nó hiểu là text
2./ Dữ liệu của anh rất khó xử, vì có dòng dữ liệu xen kẻ nên không thể lọc theo ý muốn. Nếu lọc N thì nó chỉ lấy dòng có giá trị, còn những dòng trống nó bỏ đi thì kết quả không như mong đợi.
Nhưng sao em sửa hàm lại như ban đầu thế này nó vẫn cho kết quả là Text?
[GPECODE=vb]Function GetData(FileFullName, ShName As String, Optional ByVal sRng As String = "")
Dim lsSQL As String, Cnn As Object, lrs As Object, rstArr As Variant
Set Cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With Cnn
If Val(Application.Version) < 12 Then
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
Else
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
End If
.Open
End With
lsSQL = "SELECT * " & "FROM [" & ShName & "$" & sRng & "] "
lrs.Open lsSQL, Cnn, 3, 1
rstArr = lrs.GetRows
GetData = TransArr(rstArr)
End Function[/GPECODE]
 
Anh thử như sau:

[GPECODE=sql]Function GetData(FileFullName, ShName As String, Optional ByVal sRng As String = "")
Dim lsSQL As String, Cnn As Object, lrs As Object, rstArr As Variant
Set Cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With Cnn
If Val(Application.Version) < 12 Then
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
Else
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
End If
.Open
End With
lsSQL = "SELECT * " & "FROM [" & ShName & "$" & sRng & "] where [mvt] like 'N%' or [mvt] is null"
lrs.Open lsSQL, Cnn, 3, 1
rstArr = lrs.GetRows
GetData = TransArr(rstArr)
End Function

[/GPECODE]

Dĩ nhiên là kết quả như em nói như trên
 
Cảm ơn Anh rất nhiều. Hóa ra là HDR=Yes
Em không biết về access, nếu dữ liệu đưa vào eccess liệu tốt độ cải thiện hơn không Anh?

Nếu trong bảng này đưa vào access dĩ nhiên là ngon, dữ liệu anh nhiều quá, mà excel 2003 chứa chỉ có 65536 dòng, trong khi đó dữ liệu của anh hơn 50 ngàn dòng.
 
Nếu trong bảng này đưa vào access dĩ nhiên là ngon, dữ liệu anh nhiều quá, mà excel 2003 chứa chỉ có 65536 dòng, trong khi đó dữ liệu của anh hơn 50 ngàn dòng.
Anh đưa vào access thử 1 file giúp em. Access có bao nhiêu dòng vậy Anh?
Trường hợp lấy dữ liều truyền vào mãng thì dùng rstArr = lrs.GetRows
Nhưng nếu em lấy dữ liệu là Range thì dùng câu lệnh nào vậy anh? Set rstRng = ???
Cảm ơn Anh nhiều
 
Lần chỉnh sửa cuối:
Anh đưa vào access thử 1 file giúp em. Access có bao nhiêu dòng vậy Anh?
Trường hợp lấy dữ liều truyền vào mãng thì dùng rstArr = lrs.GetRows
Nhưng nếu em lấy dữ liệu là Range thì dùng câu lệnh nào vậy anh? Set rstRng = ???
Cảm ơn Anh nhiều
File Access có thể lưu dữ liệu 2Gb, như vậy số lượng dòng còn tùy thuộc vào dung lượng file access của anh.
Anh có thể tham khảo ví dụ ở
ADO căn bản: Kết nối truy vấn CSDL từ file Excel đến file Access.
Thảo luận về bài: ADO căn bản "Kết nối truy vấn CSDL từ file Excel đến file Access."
 
Web KT

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

Back
Top Bottom