phuongnam366377
Thành viên hoạt động
- Tham gia
- 25/10/19
- Bài viết
- 149
- Được thích
- 178
có lẻ nên mở rộng chủ đề nghiên cứu thêm Rs.UpdateBatch ở nhiều cách tiếp cận ADODB khác nhau đi ... vì trên GPE này thấy còn quá ít cho nó
Anh giúp một tay về vấn đề anh đưa ra nhé.có lẻ nên mở rộng chủ đề nghiên cứu thêm Rs.UpdateBatch ở nhiều cách tiếp cận ADODB khác nhau đi ... vì trên GPE này thấy còn quá ít cho nó
Một CSDL có data (dữ liệu) và metadata (hạ tầng có sở, tức dữ liệu về dữ liệu và cấu trúc của chúng).Trong CSDL Excel thì nó có giới hạn không cho xóa nhé em.
Sub GetRs(dongtradulieu as string,ByVal dongdau As Long, ByVal dongcuoi As Long)
...
.Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
...
Sheet2.Range(dongtradulieu).CopyFromRecordset .DataSource, dongcuoi
Thế này được không nhanh mạnh
Khoảng 10 năm trước thì việc viết hàm/thủ tục có tính cách tổng thể khá quan trọng.Vẫn còn các tham số Sheet1, Sheet2 cố định trong hàm , không thể tuỳ biến.
Đối với tôi khi viết hàm/ thủ tục thì không phải chỉ chuyển các tham số thành các biến để truyền trong hàm mà còn phải xét tổng thể nghiệp vụ, qui trình xử lý, các bẫy lỗi, các trường hợp có thể phát sinh v.v.. để viết cái hàm phù hợp để có thể tái sử dụng. Một thủ tục trên có thể tách thành mấy hàm để xử lý linh hoạt.
Ví dụ:
- Nếu tôi muốn kết nối tới Excel 2003 (.xls) thì chuỗi kết nối trên có phù hợp không?
- Nếu tôi không muốn "Select *..." mà "Select F1, F4, F7..." thì như thế nào?
- ...
Trên đây chỉ là một số gợi ý tham khảo thêm để viết các hàm, thủ tục cho ứng dụng. Còn các ví dụ của bác HLMT trong chủ đề này thì cứ dùng cách viết đơn giản nhất để mọi người dễ hiểu, dễ tham khảo từng bước thôi.
Sub ChinhSuaDL_HLMT()
With CreateObject("ADODB.Recordset")
.Open "Select * from [Sheet1$]", "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName, , 3
.Filter = "[ID]='TP0005'"
!Price = 100
!Code = "HAI LÚA"
.Update
End With
End Sub
Sub LuuFileCsv_HLMT()
Dim strRecord As String
With CreateObject("ADODB.Recordset")
.Open "Select * from [Sheet1$]", "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName, 1, 3
.Filter = "[ID]<>'TP0001' and [PRICE] <1000000"
strRecord = .GetString(, , ";", vbCrLf)
.Close
End With
CreateObject("Scripting.FileSystemObject").CreateTextFile(ThisWorkbook.Path & "\Test.csv").Write strRecord
End Sub
Sub LuuFileXML_HLMT()
With CreateObject("ADODB.Recordset")
.Open "Select * from [Sheet1$]", "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
.Filter = "[ID]<>'TP0001' and [PRICE] <1000000"
.Save ThisWorkbook.Path & "\Test.xml", 1
End With
End Sub
<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
<s:AttributeType name='ID' rs:number='1' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
<s:datatype dt:type='string' dt:maxLength='255'/>
</s:AttributeType>
<s:AttributeType name='Code' rs:number='2' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
<s:datatype dt:type='string' dt:maxLength='255'/>
</s:AttributeType>
<s:AttributeType name='Price' rs:number='3' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
<s:datatype dt:type='float' dt:maxLength='8' rs:precision='15' rs:fixedlength='true'/>
</s:AttributeType>
<s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row ID='TP0002' Code='MBY001' Price='250000'/>
<z:row ID='TP0003' Code='MBY002' Price='300000'/>
<z:row ID='TP0004' Code='MBY002' Price='350000'/>
<z:row ID='TP0005' Code='MBY002' Price='400000'/>
<z:row ID='TP0006' Code='MBY003' Price='450000'/>
<z:row ID='TP0007' Code='MBY004' Price='500000'/>
<z:row ID='TP0008' Code='MBY005' Price='550000'/>
<z:row ID='TP0009' Code='MBY006' Price='600000'/>
<z:row ID='TP0010' Code='MBY007' Price='650000'/>
<z:row ID='TP0011' Code='MBY008' Price='700000'/>
<z:row ID='TP0012' Code='MBY009' Price='750000'/>
<z:row ID='TP0013' Code='MBY010' Price='800000'/>
<z:row ID='TP0014' Code='MBY011' Price='850000'/>
<z:row ID='TP0015' Code='MBY012' Price='900000'/>
<z:row ID='TP0016' Code='MBY013' Price='950000'/>
</rs:data>
</xml>
Có vẻ độc thoại có một mình buồn nhỉ ... Mạnh mà vào là lại nổi sóng ngay và luôn he ... có điều kỳ này làm biếng lắmCũng file mẫu bài số 1, tôi tiến hành xuất kết quả truy vấn với điều kiện cột [ID] khác 'TP0001' và cột [PRICE] <1.000.000 ([ID]<>'TP0001' and [PRICE] <1000000) ra file *.xml
Code như sau:
Mã:Sub LuuFileXML_HLMT() With CreateObject("ADODB.Recordset") .Open "Select * from [Sheet1$]", "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName .Filter = "[ID]<>'TP0001' and [PRICE] <1000000" .Save ThisWorkbook.Path & "\Test.xml", 1 End With End Sub
Kết quả:
XML:<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' xmlns:rs='urn:schemas-microsoft-com:rowset' xmlns:z='#RowsetSchema'> <s:Schema id='RowsetSchema'> <s:ElementType name='row' content='eltOnly'> <s:AttributeType name='ID' rs:number='1' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'> <s:datatype dt:type='string' dt:maxLength='255'/> </s:AttributeType> <s:AttributeType name='Code' rs:number='2' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'> <s:datatype dt:type='string' dt:maxLength='255'/> </s:AttributeType> <s:AttributeType name='Price' rs:number='3' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'> <s:datatype dt:type='float' dt:maxLength='8' rs:precision='15' rs:fixedlength='true'/> </s:AttributeType> <s:extends type='rs:rowbase'/> </s:ElementType> </s:Schema> <rs:data> <z:row ID='TP0002' Code='MBY001' Price='250000'/> <z:row ID='TP0003' Code='MBY002' Price='300000'/> <z:row ID='TP0004' Code='MBY002' Price='350000'/> <z:row ID='TP0005' Code='MBY002' Price='400000'/> <z:row ID='TP0006' Code='MBY003' Price='450000'/> <z:row ID='TP0007' Code='MBY004' Price='500000'/> <z:row ID='TP0008' Code='MBY005' Price='550000'/> <z:row ID='TP0009' Code='MBY006' Price='600000'/> <z:row ID='TP0010' Code='MBY007' Price='650000'/> <z:row ID='TP0011' Code='MBY008' Price='700000'/> <z:row ID='TP0012' Code='MBY009' Price='750000'/> <z:row ID='TP0013' Code='MBY010' Price='800000'/> <z:row ID='TP0014' Code='MBY011' Price='850000'/> <z:row ID='TP0015' Code='MBY012' Price='900000'/> <z:row ID='TP0016' Code='MBY013' Price='950000'/> </rs:data> </xml>
Đang khai thác Recordset mà anh. Vậy nên mình phải lấy từ Recordset.Có vẻ độc thoại có một mình buồn nhỉ ... Mạnh mà vào là lại nổi sóng ngay và luôn he ... có điều kỳ này làm biếng lắm
1/ Viết xuất xml rồi => xong
2/ Viết tiếp các kiểu ActiveWorkbook.XmlImport nữa đi chứ cho nó chọn bộ ?!
Hôm bữa có thấy bạn có đưa mấy đề tài liên quan mà chưa thấy demo, trả lời để mọi người học hỏi thì nó xôm tụ chứ.Có vẻ độc thoại có một mình buồn nhỉ ... Mạnh mà vào là lại nổi sóng ngay và luôn he ... có điều kỳ này làm biếng lắm
Sau khi chạy code trên ta được file có tên là Test.xml. Tiến hành lấy dữ liệu từ file được tạo ra đó bằng code sau:Cũng file mẫu bài số 1, tôi tiến hành xuất kết quả truy vấn với điều kiện cột [ID] khác 'TP0001' và cột [PRICE] <1.000.000 ([ID]<>'TP0001' and [PRICE] <1000000) ra file *.xml
Code như sau:
Mã:Sub LuuFileXML_HLMT() With CreateObject("ADODB.Recordset") .Open "Select * from [Sheet1$]", "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName .Filter = "[ID]<>'TP0001' and [PRICE] <1000000" .Save ThisWorkbook.Path & "\Test.xml", 1 End With End Sub
Kết quả:
XML:<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' xmlns:rs='urn:schemas-microsoft-com:rowset' xmlns:z='#RowsetSchema'> <s:Schema id='RowsetSchema'> <s:ElementType name='row' content='eltOnly'> <s:AttributeType name='ID' rs:number='1' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'> <s:datatype dt:type='string' dt:maxLength='255'/> </s:AttributeType> <s:AttributeType name='Code' rs:number='2' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'> <s:datatype dt:type='string' dt:maxLength='255'/> </s:AttributeType> <s:AttributeType name='Price' rs:number='3' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'> <s:datatype dt:type='float' dt:maxLength='8' rs:precision='15' rs:fixedlength='true'/> </s:AttributeType> <s:extends type='rs:rowbase'/> </s:ElementType> </s:Schema> <rs:data> <z:row ID='TP0002' Code='MBY001' Price='250000'/> <z:row ID='TP0003' Code='MBY002' Price='300000'/> <z:row ID='TP0004' Code='MBY002' Price='350000'/> <z:row ID='TP0005' Code='MBY002' Price='400000'/> <z:row ID='TP0006' Code='MBY003' Price='450000'/> <z:row ID='TP0007' Code='MBY004' Price='500000'/> <z:row ID='TP0008' Code='MBY005' Price='550000'/> <z:row ID='TP0009' Code='MBY006' Price='600000'/> <z:row ID='TP0010' Code='MBY007' Price='650000'/> <z:row ID='TP0011' Code='MBY008' Price='700000'/> <z:row ID='TP0012' Code='MBY009' Price='750000'/> <z:row ID='TP0013' Code='MBY010' Price='800000'/> <z:row ID='TP0014' Code='MBY011' Price='850000'/> <z:row ID='TP0015' Code='MBY012' Price='900000'/> <z:row ID='TP0016' Code='MBY013' Price='950000'/> </rs:data> </xml>
Sub LayDL_XML_HLMT()
With CreateObject("ADODB.Recordset")
.Open ThisWorkbook.Path & "\Test.xml", "Provider=MSPersist"
Sheet2.Range("A2").CopyFromRecordset .DataSource
End With
End Sub
Public Function GetRsValues(strSQL As String, rng As Range, Optional strPath As String) As Variant
On Error GoTo ErrorHandler
With CreateObject("ADODB.Recordset")
.Open (strSQL), ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & IIf(Len(strPath) = 0, ThisWorkbook.FullName, strPath))
GetRsValues = .GetRows
End With
With CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}")
.Column = GetRsValues
GetRsValues = .List
End With
rng.Resize(UBound(GetRsValues) + 1, UBound(GetRsValues, 2) + 1) = GetRsValues
Exit Function
ErrorHandler:
MsgBox Err.Description
End Function
Sub Test_GetRsValues()
Call GetRsValues("Select * from [Sheet1$]", Sheet2.Range("A2"))
End Sub
Thì hôm lâu rồi ở thớt khác Mạnh có nói rồi nay mới thấy Úp heNhư trên có bài viết nói về việc đưa mảng vào Listbox để thay cho hàm TRANSPOSE hoặc xoay mảng bằng hàm tự tạo. Nay tôi xin tạm viết cái gợi ý đó thành cái hàm như sau:
Mã:Public Function GetRsValues(strSQL As String, rng As Range, Optional strPath As String) As Variant On Error GoTo ErrorHandler With CreateObject("ADODB.Recordset") .Open (strSQL), ("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & IIf(Len(strPath) = 0, ThisWorkbook.FullName, strPath)) GetRsValues = .GetRows End With With CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}") .Column = GetRsValues GetRsValues = .List End With rng.Resize(UBound(GetRsValues) + 1, UBound(GetRsValues, 2) + 1) = GetRsValues Exit Function ErrorHandler: MsgBox Err.Description End Function
Như dữ liệu bài 1 tôi thử hàm trên như sau:
Mã:Sub Test_GetRsValues() Call GetRsValues("Select * from [Sheet1$]", Sheet2.Range("A2")) End Sub
Dữ liệu sẽ được đổ vào cell A2 của sheet2. Hàm trên còn 1 tham số cuối chưa truyền vào đó là đường dẫn đến file (strPath) bởi vì nó được lấy dữ liệu ở chính file đó. Nếu các bạn muốn lấy file khác với file chạy code thì phải thêm 1 tham số còn lại là đường dẫn đến file nguồn nhé.
Hàm trên chỉ là căn bản, muốn sử dụng ta cần phải thêm thắt rất nhiều.Thì hôm lâu rồi ở thớt khác Mạnh có nói rồi nay mới thấy Úp he
Mạnh cảm giác thấy mình như con sâu code trên GPE này ý ... khả năng của ai sao thì gần như có thể đoán ra he
Sub Rng2Rst()
Dim objXML As Object
Set objXML = CreateObject("MSXML2.DOMDocument")
objXML.LoadXML Sheet1.Range("A1:C109").Value(12)
With CreateObject("ADODB.Recordset")
.Open objXML
.Filter = "[Price] <= 900000"
.Sort = "[Price] DESC"
Sheet2.Range("A2").CopyFromRecordset .DataSource
End With
End Sub
khi nào rảnh các bạn đổi hướng sang thử xài API của Bill đi xem sao ???!!!
Google 1 hồi ra đầy code mẫu cho mà test
govert/SQLiteForExcel: A lightweight wrapper to give access to the SQLite3 library from VBA. (github.com)
Connect to SQLite from VBA using winsqlite3.dll (renenyffenegger.ch)
Hình như có nhầm lẫn gì đó anh.Bạn có đọc hiểu cái thư viện này làm gì chưa mà nói của Bill? Của tay Govert viết ra nhé.
SQLite thì có liên quan như thế nào đến chủ đề này bạn? Hay bạn muốn ứng dụng Excel dùng SQLite làm CSDL back end hay muốn đọc ghi dữ liệu từ các thiết bị điện thoại, máy chơi game, remote ...
Hình như có nhầm lẫn gì đó anh.
winsqlite3.dll chắc chắn là của Microsoft.
View attachment 250630
Còn cái SQLiteForExcel là cái khác.
View attachment 250631