Đố vui về ADO, DAO.

Liên hệ QC

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,281
Được thích
15,776
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Làm sao ta có thể dùng 1 điều kiện duy nhất mà có thể lấy ra dữ liệu với họ bắt đầu lần lượt 3 ký tự (N,L,T). Kết quả như hình bên dưới.

2.jpg
 

File đính kèm

  • Loc Ten.xls
    37 KB · Đọc: 174
Làm sao ta có thể dùng 1 điều kiện duy nhất mà có thể lấy ra dữ liệu với họ bắt đầu lần lượt 3 ký tự (N,L,T). Kết quả như hình bên dưới.

View attachment 101583

Em viết như thế này :
[GPECODE=vb]
Sub Loc_HLMT()
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=No;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select f1,f2 from [Sheet1$A2:B1000] " _
& "where f1 like '[NLT]%'"
End With
With Sheet1
.[H2:I65000].ClearContents
.[H2:I2].CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing
End Sub[/GPECODE]
Em đoán bài này anh muốn nhấn mạnh đến toán tử Like trong SQL ( --> vì thông thường để tách họ ,tên ta hay phải dùng một hàm, hay thủ tục để tách tên như hàm sau :
[GPECODE=vb]
Function GetName(Hovaten As String) As String
GetName = Trim(Right(Replace(Hovaten, " ", Space(255)), 255))
End Function
[/GPECODE]
 
Đúng thế bạn, bạn cũng là cao thủ rồi.
 
Có hai cách:
- Cách dùng từ khoá LIKE (như trên)
- Cách dùng mảng: WHERE LEFT(f1,1) IN ('N','L','T')
Nếu CSDL có đặt mục lục (index) trên trường f1 thì cách LIKE hiệu quả nhất. Nếu không thì hai cách coi như không khác nhau mấy.
 
để khuấy động phong trào cho các thành viên yêu thích ADO,Em có câu hỏi như vầy:
Tại sao trong câu lệnh ADO, mặc dù IMEX=1 --> tuy nhiên Recordset lại không lấy được hết vùng dữ liệu đã định ?
Cụ thể trong file đính kèm !

[GPECODE=vb]
Sub Loc_HLMT()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 12.0;IMEX =1;HDR=Yes"";"
.Open
End With


lsSQL = "SELECT * " & _
"FROM [Du Lieu$A1:A1000] "
lrs.Open lsSQL, cnn
[B2].CopyFromRecordset lrs
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]
 
- Dhn46 cũng chỉ dám "ngắm" ADO chứ chưa bước chân vào, nhưng thấy ADO hay quá nên Dhn46 cũng tìm hiểu và xin trả lời câu hỏi của bạn hungpecc1 như sau:
- Với IMEX=1: ADO sẽ kiểm tra 1 số dòng dữ liệu đầu để kiểm tra Data Type cho việc chọn lựa Type để truy vấn (1 số dòng cụ thể ở đây là 8 http://support.microsoft.com/kb/194124/EN-US)
=> Với dữ liệu trong File thì 23 dòng dữ liệu đầu là dạng Date còn 6 dòng sau là dạng Text do đó ADO sẽ kiểm tra 8 dòng dữ liệu đầu cho kết quả là dạng date do đó các loại dữ liệu khác không được truy vấn, dẫn tới sai kết quá

Xin hết ạ!
 
- Dhn46 cũng chỉ dám "ngắm" ADO chứ chưa bước chân vào, nhưng thấy ADO hay quá nên Dhn46 cũng tìm hiểu và xin trả lời câu hỏi của bạn hungpecc1 như sau:
- Với IMEX=1: ADO sẽ kiểm tra 1 số dòng dữ liệu đầu để kiểm tra Data Type cho việc chọn lựa Type để truy vấn (1 số dòng cụ thể ở đây là 8 http://support.microsoft.com/kb/194124/EN-US)
=> Với dữ liệu trong File thì 23 dòng dữ liệu đầu là dạng Date còn 6 dòng sau là dạng Text do đó ADO sẽ kiểm tra 8 dòng dữ liệu đầu cho kết quả là dạng date do đó các loại dữ liệu khác không được truy vấn, dẫn tới sai kết quá

Xin hết ạ!
^^ câu trả lời của bạn hoàn toàn giống ý kiến của mình định đưa ra ,<------- Không biết a Hai Lúa có bổ sung góp ý gì cho bọn em không ?

* Mình xin bổ sung thêm 1 điểm nữa cho câu hỏi bài trên: trong đoạn code trên mình viết :
[GPECODE=vb] IMEX = 1[/GPECODE] ( thừa 1 khoảng trắng) --> nếu viết như vầy thì coi như mục đích cái IMEX=1 là vô tác dụng : cụ thể bạn xem link bên dưới : ( bài #117 page 12)
http://www.giaiphapexcel.com/forum/showthread.php?75143-Bài-tập-về-ADO-căn-bản/page12
 
Làm việc với Excel Data Migration (OLEDB) thì cũng nên biết luật "định dạng bằng 8 dòng đầu", và phải kiểm soát trước khi import/export

Thứ nhất:
Luôn luôn kiểm soát xem những dòng có kiểu dữ liệu nào bị trái dạng (không giống những dòng còn lại) hay không - nhất là trường hợp bị hiểu sai.

Thứ hai:
Luôn luôn kiểm soát xem có dữ liệu text nào dài quá hay không. Nếu có thì phải đặt thêm một dòng tạm ở đầu bảng với ô text thật dài, ít nhất là dài bằng hoặc hơn ô dài nhất trong bảng.
 
Buồn đọc lại #58 xin các bạn hãy cho biết dùng cách nào ngoại trừ VBA để lấy tên sheet đầu tiên của 1 file nào đó.
 
Cũng buồn vì không có người hưởng ứng.
Không phải là không có người hưởng ứng anh ah, hix vì câu hỏi của anh vừa khó vừa khoai!
--> nếu mà không dùng VBA ; (tức là không dùng Sub + End sub) thì em cũng chẳng khác gì 2 tay bị trói anh ah --> đành phải pó tay thôi
 
Không phải là không có người hưởng ứng anh ah, hix vì câu hỏi của anh vừa khó vừa khoai!
--> nếu mà không dùng VBA ; (tức là không dùng Sub + End sub) thì em cũng chẳng khác gì 2 tay bị trói anh ah --> đành phải pó tay thôi

Bạn hiểu lầm câu hỏi rồi, dùng ADO hay dùng VBA... đều bắt đầu = Sub và kết thúc = End Sub, nhưng không dùng VBA để lấy thôi. Hy vọng sẽ rõ ràng cho bạn và những bạn khác.
 
Bạn hiểu lầm câu hỏi rồi, dùng ADO hay dùng VBA... đều bắt đầu = Sub và kết thúc = End Sub, nhưng không dùng VBA để lấy thôi. Hy vọng sẽ rõ ràng cho bạn và những bạn khác.

Vậy không dùng VBA nghĩa là dùng công thức à?
Vì dù dùng ADO thì cũng được viết bằng VBA thôi (trừ phi dùng ADO nhưng được viết trên nền của VB6 hay các ngôn ngữ lập trình khác thì lại là chuyện khác)
 
Vậy không dùng VBA nghĩa là dùng công thức à?
Vì dù dùng ADO thì cũng được viết bằng VBA thôi (trừ phi dùng ADO nhưng được viết trên nền của VB6 hay các ngôn ngữ lập trình khác thì lại là chuyện khác)
Hihi, không biết diễn giải thế nào cho nó rõ ràng nhỉ, thôi thì dựa vào tiêu đề đề tài chắc là rõ rồi.
 
Buồn đọc lại #58 xin các bạn hãy cho biết dùng cách nào ngoại trừ VBA để lấy tên sheet đầu tiên của 1 file nào đó.
1. Nói về bài #58 này thì em tìm hiểu thì có trang này nhưng cũng không hiểu lắm, nhưng sao thầy Tuấn đã làm rồi mà vẫn còn thắc mắc nhỉ?
2. Em không biết và DAO nhưng tiểm hiểu trên mạng và làm được code sau không biết có chuẩn không:
[GPECODE=vb]Sub FsheetName()
Dim xlWB As DAO.Database
Dim strFirstSheetName As String
Set xlWB = OpenDatabase("E:\VBA\LuongTH.xls", False, True, "Excel 8.0;")
strFirstSheetName = xlWB.TableDefs(0).Name
MsgBox strFirstSheetName
xlWB.Close
End Sub


[/GPECODE]
 
1. Nói về bài #58 này thì em tìm hiểu thì có trang này nhưng cũng không hiểu lắm, nhưng sao thầy Tuấn đã làm rồi mà vẫn còn thắc mắc nhỉ?
Theo em thì điều thầy Tuấn thắc mắc là tên sheet đầu tiên ứng với Sheet1 chứ không phải sheet hiện đầu tiên trong sheet tab như code của anh VieHoai. Cái này em tìm Google mãi chưa ra.
 
1. Nói về bài #58 này thì em tìm hiểu thì có trang này nhưng cũng không hiểu lắm, nhưng sao thầy Tuấn đã làm rồi mà vẫn còn thắc mắc nhỉ?
2. Em không biết và DAO nhưng tiểm hiểu trên mạng và làm được code sau không biết có chuẩn không:
[GPECODE=vb]Sub FsheetName()
Dim xlWB As DAO.Database
Dim strFirstSheetName As String
Set xlWB = OpenDatabase("E:\VBA\LuongTH.xls", False, True, "Excel 8.0;")
strFirstSheetName = xlWB.TableDefs(0).Name
MsgBox strFirstSheetName
xlWB.Close
End Sub


[/GPECODE]

Chính xác là em muốn nói cái này, dùng DAO để lấy, vì ADO nó sẽ tự động sắp xếp theo thứ tự nên không thể lấy chính xác.

Mã:
Sub TestDAO()
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine.36")
    Set db = Dbs.OpenDatabase("E:\VBA\LuongTH.xls", False, True, "Excel 8.0;")
    MsgBox db.TableDefs(0).Name
    db.Close
    Set Dbs = Nothing: Set db = Nothing
    
End Sub

Nhân tiện đây xin hỏi là làm sao ta lấy được tất cà tên sheet = DAO?
 
Lần chỉnh sửa cuối:
Theo em thì điều thầy Tuấn thắc mắc là tên sheet đầu tiên ứng với Sheet1 chứ không phải sheet hiện đầu tiên trong sheet tab như code của anh VieHoai. Cái này em tìm Google mãi chưa ra.

Ah, không!
Cái tôi cần là Sheet đầu tiên nhìn thấy trên sheet tab
Vấn đề là khi dùng ADO để lấy tên sheet đầu tiên mà sheet đầu có tên là "ZZZ", sheet thứ 2 có tên là "AAA" thì code sẽ xem sheet đầu tiên là sheet "AAA" (thay gì phải là "ZZZ") ---> Giống như nó đã ưu tiên sort tên sheet theo thứ tự ABC vậy
 
Ah, không!
Cái tôi cần là Sheet đầu tiên nhìn thấy trên sheet tab
Vấn đề là khi dùng ADO để lấy tên sheet đầu tiên mà sheet đầu có tên là "ZZZ", sheet thứ 2 có tên là "AAA" thì code sẽ xem sheet đầu tiên là sheet "AAA" (thay gì phải là "ZZZ") ---> Giống như nó đã ưu tiên sort tên sheet theo thứ tự ABC vậy
DAO sẽ lấy chính xác vì nó không tự động sắp xếp như bên ADO Thầy à.
 
Web KT
Back
Top Bottom