So sánh 3 cách lấy dữ liệu từ 1 file đang đóng

Liên hệ QC

Maika8008

Thành viên gạo cội
Tham gia
12/6/20
Bài viết
4,741
Được thích
5,670
Donate (Momo)
Donate
Giới tính
Nam
Với Excel chúng ta thường có nhu cầu lọc lựa, lấy dữ liệu từ 1 file đang trạng thái đóng đã biết trước đường dẫn và địa chỉ tham chiếu vùng dữ liệu, nhưng lại không muốn tự tay mở nó ra để chép 1 cách thủ công qua file đang làm. Với VBA, chúng ta có 3 cách để tự động hóa khâu lấy dữ liệu này.

Cách 1: Mở trực tiếp file lên, lấy dữ liệu xong đóng lại:
Rich (BB code):
Sub GetDataByOpenFile()
Dim Wb As Workbook, WbS As Workbook
Dim sFullName$, tmr#

tmr = Timer()
Application.ScreenUpdating = False
sFullName = "D:\GoogleDrive2\CaNhan\VBA\MapVN.xlsx"  'Duong dan file du lieu
Set Wb = ThisWorkbook
Set WbS = Workbooks.Open(sFullName)
WbS.Sheets("VNxy").Range("A1:D100").Copy Wb.Sheets("KQ").Range("A1")
WbS.Close False
Application.ScreenUpdating = True
Msgbox Timer() – tmr  'Thoi gian thuc hien
End Sub
- Ưu điểm của cách 1 là trực quan, ta có thể tạm ngừng lệnh, chạy từng bước để xem kết quả trung gian. Dữ liệu có thế nào chép sang thế ấy hoặc có thể tùy ý chép riêng định dạng, công thức, giá trị…

- Nhược điểm cách 1 là thời gian thực thi khá chậm, mất khoảng 1,4 giây cho việc mở file, chép dữ liệu, đóng file. (Thời gian ở đây là trong điều kiện thử nghiệm cụ thể của tác giả, chỉ để so sánh tốc độ thực hiện các cách với nhau. Thời gian đó sẽ khác đi khi dùng ở máy khác, dùng 1 file nguồn khác…)

Cách 2: Mở file bằng ADODB:
Rich (BB code):
Sub GetDataByADODB()
Dim Rec As Object, rs As Object
Dim sFullName$, iCol&, tmr#

tmr = Timer()
sFullName = "D:\GoogleDrive2\CaNhan\VBA\MapVN.xlsx"   'Duong dan file du lieu
Application.ScreenUpdating = False
Set Rec = CreateObject("ADODB.Connection")
With Rec
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .ConnectionString = "Data Source=" & sFullName & ";" & _
              "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        .Open
End With
        Set rs = Rec.Execute("Select * From [VNxy$A1:D100]")
        Sheets("KQ").Range("A2").CopyFromRecordset rs
        For iCol = 0 To rs.Fields.Count - 1   'Chep tieu de cọt
                Sheets("KQ").Cells(1, iCol + 1).Value = rs.Fields(iCol).Name
        Next
        Set rs = Nothing
        Msgbox Timer() – tmr  'Thoi gian thuc hien
        Application.ScreenUpdating = True
End Sub
- Ưu điểm của cách 2 là thực thi nhanh, chỉ mất cỡ 0,2 giây, và người dùng không nhận biết được file đóng mở.

- Nhược điểm cách 2 là:

+ Trong đa số trường hợp phải mất công khắc phục việc chạy lệnh đối với tiêu đề có dấu tiếng Việt (Có cách khác không bị ảnh hưởng bởi tiêu đề tiếng Việt. Nhưng vấn đề này sẽ được trình bày ở 1 bài khác, có sự so sánh việc sử dụng của 2 cách).

+ Những ai chưa rành cú pháp SQL và lồng các biến vào câu lệnh SQL có thể gặp trở ngại khi điều kiện truy vấn phức tạp.

+ Gặp dữ liệu có dấu phân cách thập phân với các máy đã được dịnh dạng trong Control Panel là dấu phẩy thì sẽ có rắc rối với kết quả chép ra. Thay vì đúng là 144,12 thì kết quả chép ra ở đây là 14412,00.

Để khắc phục nhược điểm này thì phải thêm mã lệnh để chuyển định dạng dấu phẩy thập phân trong Control Panel sang dấu chấm trước khi chạy truy vấn rồi chuyển lại dấu phẩy ngay sau truy vấn.

Khai báo và đặt hàm SetLocalSetting trên đầu Module:
Rich (BB code):
#If VBA7 Then

 Private Declare PtrSafe Function SetLocaleInfo _

 Lib "kernel32" Alias "SetLocaleInfoA" ( _

 ByVal Locale As LongPtr, _

 ByVal LCType As LongPtr, _

 ByVal lpLCData As String) As Boolean

 

 Private Declare PtrSafe Function GetUserDefaultLCID% Lib "kernel32" ()

#Else

 Private Declare Function SetLocaleInfo _

 Lib "kernel32" Alias "SetLocaleInfoA" ( _

 ByVal Locale As Long, _

 ByVal LCType As Long, _

 ByVal lpLCData As String) As Boolean

 

 Private Declare Function GetUserDefaultLCID% Lib "kernel32" ()

#End If

 

 Private Const LOCALE_SDECIMAL = &HE

 

 Private Function SetLocalSetting(LC_CONST As Long, Setting As String) As Boolean

 Call SetLocaleInfo(GetUserDefaultLCID(), LC_CONST, Setting)

 End Function
Với Sub GetDataByADODB() ở trên, thêm lệnh này trước lệnh truy vấn SQL:

Call SetLocalSetting(LOCALE_SDECIMAL, ".")

Và thêm lệnh này ngay sau khi chạy xong truy vấn SQL:

Call SetLocalSetting(LOCALE_SDECIMAL, ",")



Cách 3: Dùng Macro 4. Cách này tôi dùng code từ nguồn:

https://www.giaiphapexcel.com/diendan/threads/dùng-macro-4-để-lấy-dữ-liệu-từ-1-file-đang-đóng.39312/
Rich (BB code):
Sub GetDataByMacro4()
Dim tmr#
tmr = Timer()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = "D:\GoogleDrive2\CaNhan\VBA\MapVN.xlsx"
  sSheet = "VNxy"
  sAddr = "A1:D100"  
  Sheets("KQ").Range("A1:D100") = GetData(sFile, sSheet, sAddr)
'Kích thuoc phai bang sAddr
  Msgbox Timer() – tmr  'Thoi gian thuc hien
End Sub

Function GetData(sFile As String, sSheet As String, sAddr As String)
      Dim pLink As String, iR As Long, iC As Long, Arr
      If Len(Dir(sFile)) Then
            Arr = Range(sAddr)
            pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
            For iR = 1 To Range(sAddr).Rows.Count
                  For iC = 1 To Range(sAddr).Columns.Count
                        Arr(iR, iC) = ExecuteExcel4Macro(pLink & Range(sAddr). _
Cells(iR, iC).Address(, , 2))
                  Next iC
            Next iR
            GetData = Arr
      End If
End Function
Với cách này, dù dữ liệu nguồn sAddr = "A1:D100" nhưng khi muốn hiển thị kết quả ít hơn thì bạn giảm kích thước vùng kết quả chỗ Sheets("KQ").Range("A1:D100"). Nếu tăng kích thước vùng kết quả thì sẽ bị #N/A ở các ô thừa.

- Thực tình thì không thấy ưu điểm nào của cách này ngoài việc nó lấy đúng số liệu nguồn như cách 1. Còn nhược điểm là quá chậm, phải đến tận 5 giây (gấp hơn 3 lần cách 1) thì mới lấy được dữ liệu cùng cỡ với các cách trên. Dòng tiêu đề sẽ hiển thị là 0 với tiêu đề nào chừa trống.

P/S: Tôi đính kèm file dữ liệu mà tôi đã dùng để test tốc độ thực thi code để các bạn có cùng 1 mẫu thử.
Trong bài có chỗ nào sai, sót thì các bác "gội" rồi mới "cạo" nhẹ nhàng góp ý giúp.
 

File đính kèm

  • MapVN.xlsx
    660.4 KB · Đọc: 55
Nếu python nạp excel chậm thì cũng giống power query a nhỉ
Việc import đơn giản chỉ là lấy dữ liệu về thì ADO nhanh và tiện lợi.
Tuy nhiên nếu cần thêm việc tổng hợp, tính toán, group theo vài tiêu chí thì phải dùng Power Query.
Em cũng chưa biết python là gì, ví dụ việc tổng hợp khoảng 30 file excel (mỗi file tầm 3M) thì python có lợi thế hơn Power Query không anh?
Không bạn, nếu chỉ tính file excel thì việc nạp excel trong python còn chậm hơn power query nhiều, 30 file excel (mỗi file tầm 3M) thì Power query chắc hơn nửa tiếng quá, cùng dữ liệu đó nếu chuyển sang file csv chắc tầm 15 phút, còn dùng python khoảng 3 phút thôi với điều kiện là Ram đủ
Nếu connect excel tốc độ thì tôi nghĩ như nhau giữa ADO và Power query, Power query nó có thời gian chờ nên có thể chậm hơn chút không đáng kể, không tính phần transform thì tôi nghĩ Power query tiện hơn nhiều vì nó là tool mà
 
Lần chỉnh sửa cuối:
Upvote 0
Cái chủ đề này là so sánh thì tôi cũng nói liên quan tới nó 1 chút

1/ như ban đầu tôi nói lấy vài ngàn dòng xong dùng Open + Mcro4 lấy lên nó bay cái vèo .... nhưng khi dữ liệu lên 100M thì xếp 2 cái đó vào xó

2/ khi dùng ADODB lấy thì keo nó nhanh hơn SQLite mà xài Driver SQLite xong thông qua ADOB kết nối thì nó cũng như mục số 1 không công bằng tý nào cả

nếu muốn công bằng thì xài thuần ADODB của Ms và thuần SQLite mà lấy thì sẻ thấy được

3/ trên thế giới tôi thấy đa số họ nhắc tới ADOB và SQLite nhiều chứ ít ai nhắc tới Python để xử lý CSDL khủng

4/ linh sau là quốc tế họ test thuần trên từng Tools khác nhau ... họ chỉ nhắc tới mấy Tools mà tôi khoanh đó ... FireDAC là thuần SQLite + vvv


1630566143385.png


Còn bàn ra bàn vào thì tôi không có khả năng bàn nó ... chỉ thấy tầm quốc tế bàn về nó thế thôi
 
Upvote 0
Không bạn, nếu chỉ tính file excel thì việc nạp excel trong python còn chậm hơn power query nhiều, 30 file excel (mỗi file tầm 3M) thì Power query chắc hơn nửa tiếng quá, cùng dữ liệu đó nếu chuyển sang file csv chắc tầm 15 phút, còn dùng python khoảng 3 phút thôi với điều kiện là Ram đủ
Nếu connect excel tốc độ thì tôi nghĩ như nhau giữa ADO và Power query, Power query nó có thời gian chờ nên có thể chậm hơn chút không đáng kể, không tính phần transform thì tôi nghĩ Power query tiện hơn nhiều vì nó là tool mà
Không đến 30p đâu anh
Một file trung bình tầm 50,000 bản ghi, 15 trường.
File tổng hợp lấy 30 files, groupby lại lấy kết quả 5 trường, em chạy mất khoảng 8p.
 
Upvote 0
Không đến 30p đâu anh
Một file trung bình tầm 50,000 bản ghi, 15 trường.
File tổng hợp lấy 30 files, groupby lại lấy kết quả 5 trường, em chạy mất khoảng 8p.
Bạn để mỗi file tầm 3M tức là 3 triệu dòng mỗi file, tức là 30 file 90 triệu dòng phải không? nếu 90 triệu dòng mà file excel thì không có 8p đâu bạn, nếu chỉ có 50.000 dòng mỗi file thì trung bình mỗi s nó sẽ đọc được khoảng 20.000 dòng tức là 3s một file =>30 file tầm 2 phút thôi
 
Upvote 0
Thực chất mọi người nên ngầm hiểu dữ liệu nguồn tôi muốn lấy là Excel và chỉ chừng chục ngàn dòng chứ tôi không bao giờ biết "dữ liệu khủng" là thế nào. Tôi nghĩ lấy từ Excel qua Excel (đừng từ 2003 lấy 2007 trở lên) thì đâu có xảy ra tình huống đó.
Ví dụ bạn dùng file Excel nguồn có 1,048,576 dòng và bạn dùng 3 cách lần lượt ở bài 1 và lấy dữ liệu đưa vào 1 file nào đó bắt đầu từ địa chỉ A3 xem sao nhé.
 
Upvote 0
thì cứ bỏ bớt đi 76 dòng và 2 cột đi cho lành xong thử là biết thôi ... ko lại keo nó tràn Sheet :D
 
Upvote 0
Ví dụ bạn dùng file Excel nguồn có 1,048,576 dòng và bạn dùng 3 cách lần lượt ở bài 1 và lấy dữ liệu đưa vào 1 file nào đó bắt đầu từ địa chỉ A3 xem sao nhé.
Trời, cứ làm khó tôi chi vậy. 1 triệu dòng thì tôi đã thử và đã biết nó chạy rất lâu rồi.
 
Upvote 0
Trong một danh sách có nhiều mục, bạn cần lọc người có tên Tuấn chẳng hạn, nhưng đồng thời phải lọc theo đó là ngày sinh, nơi ở, số điện thoại v.v... hoặc đơn giản chỉ lọc lấy 2 cột tên và mã số thôi:

View attachment 265276

Bình thường thì mình dùng 2 vòng lặp là một vòng duyệt danh sách và trong khi duyệt mình lại làm 1 mảng để lưu lại số hàng đã được chọn, sau đó từ mảng ghi số hàng đó mình duyệt 1 vòng lặp nữa để tạo một mảng kết quả.

Thì với dạng mảng từ GetRows này mình chỉ duyệt 1 vòng lặp đã có mảng kết quả ngay trong đó luôn rồi.
Không cần bước sau anh, ta lọc trước rồi đẩy nó vào luôn. Không dùng vòng lặp.
 
Upvote 0
2/ khi dùng ADODB lấy thì keo nó nhanh hơn SQLite mà xài Driver SQLite xong thông qua ADOB kết nối thì nó cũng như mục số 1 không công bằng tý nào cả

nếu muốn công bằng thì xài thuần ADODB của Ms và thuần SQLite mà lấy thì sẻ thấy được

3/ trên thế giới tôi thấy đa số họ nhắc tới ADOB và SQLite nhiều chứ ít ai nhắc tới Python để xử lý CSDL khủng

4/ linh sau là quốc tế họ test thuần trên từng Tools khác nhau ... họ chỉ nhắc tới mấy Tools mà tôi khoanh đó ... FireDAC là thuần SQLite + vvv


View attachment 265279


Còn bàn ra bàn vào thì tôi không có khả năng bàn nó ... chỉ thấy tầm quốc tế bàn về nó thế thôi

Phải làm rõ mục số 2 bạn muốn nói cái gì, chứ đọc vậy không hiểu rồi.
- ADODB và sqlLite là 2 cái đối tượng khác nhau hoàn toàn. Một bên là thư viện với các phương thức, thuộc tính để kết nối tới CSDL bên ngoài, còn sqlLite là một ứng dụng xây dựng, chứa CSDL nên bạn nói "khi dùng ADODB lấy thì kêu nó nhanh hơn sqlLite.." là không hiểu rồi đó!
Bài test tôi có đề cập ở trên là "dùng ADODB kết nối tới CSDL sqlLite và CSDL Access" để xem ADODB lấy dữ liệu từ hệ quản trị CSDL nào nhanh? chứ ADODB và sqlLite có cùng loại đâu mà so sánh!!!
Một khi muốn kết nối tới CSDL nào đó thì phải dùng Driver nào cho phù hợp thì đối với sqlLite tôi chỉ biết nó cung cấp ODBC Driver thông qua file "sqlliteodbc.dll". Đối với Ms Access thì mặc định đã có sẳn Driver đi kèm khi cài Office rồi khỏi mất công kiếm Driver cho nó.
- "Xài thuần ADODB và thuần SQLLite" là sao bạn? thuần sqlLite tức là dùng ứng dụng sqlLiteStudio xuất (export) table sqlLite sang Excel? Tool export của sqlLiteStudio chỉ xuất được ra CSV, HTML, JSON..., không có Excel. Vậy từ Excel làm sao kết nối tới CSDL sqlLite? Bạn đừng nói dùng cái tool của Delphi nhé vì nó đã là của ngôn ngữ lập trình Delphi rồi, không còn là VBA Excel.
- Mục 3 là bạn phải cập nhật lại thông tin đi. Khi nói về Big Data (tạm gọi dữ liệu khủng đi như dữ liệu thương mại điện tử, ngân hàng, y tế, bán lẻ v.v..), Data science thì từ Python nó nằm trên đầu đó, bên cạnh đó còn có ngôn ngữ R, phải biết SQL (không phải sqlLite nhé) để truy vấn dữ liệu, Java, C++... và còn nhiều kỹ năng mềm khác nữa. Chắc chắc ADODB, và sqlLite không có nằm trong môn khoa học dữ liệu này đâu.
- Mục 4: mấy cái tool họ so sánh là của Delphi và chạy trên ngôn ngữ lập trình Delphi. Từ Delphi dùng các thư viện trên để truy vấn khau thác dữ liệu thì cái FireDAC là tốt hơn các thư viện còn lại. dùng thư viện FireDAC có thể kết nối hầu hết các ứng dụng quản trị CSDL hiện tại như: MS Access, SQLite, MySQL, SQL Server, Oracle, PostgreSQL... Bạn dùng từ "FireDAC là thuần sqlLite" thì khó hiểu thật.
 
Upvote 0
3/ trên thế giới tôi thấy đa số họ nhắc tới ADOB và SQLite nhiều chứ ít ai nhắc tới Python để xử lý CSDL khủng
Bạn đang nói select query hay xử lý dữ liệu, nếu nói xử lý dữ liệu thì tôi biết Python top 1 nhiều năm rồi ngoài thư viện Pandas nó còn thư viện Pyspark xử lý vài trăm GB dữ liệu
 
Upvote 0
Phải làm rõ mục số 2 bạn muốn nói cái gì, chứ đọc vậy không hiểu rồi.
- ADODB và sqlLite là 2 cái đối tượng khác nhau hoàn toàn. Một bên là thư viện với các phương thức, thuộc tính để kết nối tới CSDL bên ngoài, còn sqlLite là một ứng dụng xây dựng, chứa CSDL nên bạn nói "khi dùng ADODB lấy thì kêu nó nhanh hơn sqlLite.." là không hiểu rồi đó!
Bài test tôi có đề cập ở trên là "dùng ADODB kết nối tới CSDL sqlLite và CSDL Access" để xem ADODB lấy dữ liệu từ hệ quản trị CSDL nào nhanh? chứ ADODB và sqlLite có cùng loại đâu mà so sánh!!!
Một khi muốn kết nối tới CSDL nào đó thì phải dùng Driver nào cho phù hợp thì đối với sqlLite tôi chỉ biết nó cung cấp ODBC Driver thông qua file "sqlliteodbc.dll". Đối với Ms Access thì mặc định đã có sẳn Driver đi kèm khi cài Office rồi khỏi mất công kiếm Driver cho nó.
- "Xài thuần ADODB và thuần SQLLite" là sao bạn? thuần sqlLite tức là dùng ứng dụng sqlLiteStudio xuất (export) table sqlLite sang Excel? Tool export của sqlLiteStudio chỉ xuất được ra CSV, HTML, JSON..., không có Excel. Vậy từ Excel làm sao kết nối tới CSDL sqlLite? Bạn đừng nói dùng cái tool của Delphi nhé vì nó đã là của ngôn ngữ lập trình Delphi rồi, không còn là VBA Excel.
- Mục 3 là bạn phải cập nhật lại thông tin đi. Khi nói về Big Data (tạm gọi dữ liệu khủng đi như dữ liệu thương mại điện tử, ngân hàng, y tế, bán lẻ v.v..), Data science thì từ Python nó nằm trên đầu đó, bên cạnh đó còn có ngôn ngữ R, phải biết SQL (không phải sqlLite nhé) để truy vấn dữ liệu, Java, C++... và còn nhiều kỹ năng mềm khác nữa. Chắc chắc ADODB, và sqlLite không có nằm trong môn khoa học dữ liệu này đâu.
- Mục 4: mấy cái tool họ so sánh là của Delphi và chạy trên ngôn ngữ lập trình Delphi. Từ Delphi dùng các thư viện trên để truy vấn khau thác dữ liệu thì cái FireDAC là tốt hơn các thư viện còn lại. dùng thư viện FireDAC có thể kết nối hầu hết các ứng dụng quản trị CSDL hiện tại như: MS Access, SQLite, MySQL, SQL Server, Oracle, PostgreSQL... Bạn dùng từ "FireDAC là thuần sqlLite" thì khó hiểu thật.
à mà thôi ... nói ra nó dài dòng lắm ... Mạnh làm biếng lắm .. mà dân tự học nhiều khi câu từ + giải thích nó cứ lộn ngược lên ... thôi ko nhắc lại bài đó nữa he
 
Upvote 0
Bạn để mỗi file tầm 3M tức là 3 triệu dòng mỗi file, tức là 30 file 90 triệu dòng phải không? nếu 90 triệu dòng mà file excel thì không có 8p đâu bạn, nếu chỉ có 50.000 dòng mỗi file thì trung bình mỗi s nó sẽ đọc được khoảng 20.000 dòng tức là 3s một file =>30 file tầm 2 phút thôi
Có cách nào để đo thời gian mà background query chạy không anh?
 
Upvote 0
Upvote 0
VD danh sách có tên VŨ, VỤ, VÙ, VÚ gì đó, nhưng mình chỉ cần gõ chữ VU thì nó sẽ ra những chữ kia thì ADO khó có thể đáp ứng được.
Cái vụ tìm kiếm dạng này thì tôi vẫn dùng câu lệnh SQL được nhưng phải lồng thêm một cái hàm để xử lý chuỗi tìm kiếm.
Vd:
Mã:
Select * From tblNhanVien Where MaNV Like 'V[UÚŨÙỤ]'
 
Upvote 0
Cái vụ tìm kiếm dạng này thì tôi vẫn dùng câu lệnh SQL được nhưng phải lồng thêm một cái hàm để xử lý chuỗi tìm kiếm.
Vd:
Mã:
Select * From tblNhanVien Where MaNV Like 'V[UÚŨÙỤ]'
Nếu chỉ một vài chữ cố định thì không thành vấn đề, nhưng chữ viết tiếng Việt không biết bao nhiêu chữ thì làm sao mình xử lý kiểu này được.
 
Upvote 0
Nếu chỉ một vài chữ cố định thì không thành vấn đề, nhưng chữ viết tiếng Việt không biết bao nhiêu chữ thì làm sao mình xử lý kiểu này được.
Nói chung là chỉ xử lý 1 từ, nếu nhiều từ thì phải viết thêm :). Thực ra thì tìm vẫn ra nhưng tôi không cho tìm nhiều từ để chạy cho nhanh
VD: chuong, luan, lien

Screen Shot 2021-09-02 at 21.46.02.png
 
Lần chỉnh sửa cuối:
Upvote 0
Nói chung là chỉ xử lý 1 từ, nếu nhiều từ thì phải viết thêm :)
VD: chuong, luan, lien

View attachment 265304
Cái này chắc làm hẳn một bộ từ điển cho nó quá! Hay là làm cái hàm loại dấu tiếng Việt ngay trong CSDL để xử lý việc này? Mà ứng dụng thế nào thì mình cũng không rành cho lắm khi áp dụng vào ADO.
 
Upvote 0
Cái này chắc làm hẳn một bộ từ điển cho nó quá! Hay là làm cái hàm loại dấu tiếng Việt ngay trong CSDL để xử lý việc này? Mà ứng dụng thế nào thì mình cũng không rành cho lắm khi áp dụng vào ADO.
Nhìn vậy chứ nó cũng đơn giản. Chi viết cái hàm xử lý, dùng bảng tra các nguyên âm thôi (a,â, e, ê...y) và các biến thể với dấu thanh của nó + xử lý chuỗi. Bạn ngâm cứu chút chắc là ra thôi.
a = "a" & ChrW(224) & ChrW(225) & ChrW(227) & ChrW(7841) & ChrW(7843) a1 = ChrW(226) & ChrW(7845) & ChrW(7847) & ChrW(7849) & ChrW(7851) & ChrW(7853) ...

Cơ bản tôi hay dùng Recordset nên thường sử dụng câu lệnh SQL để xử lý mà ADO là dùng câu lệnh SQL nên áp dụng được thôi.
 
Upvote 0
Nhìn vậy chứ nó cũng đơn giản. Chi viết cái hàm xử lý, dùng bảng tra các nguyên âm thôi (a,â, e, ê...y) và các biến thể với dấu thanh của nó + xử lý chuỗi. Bạn ngâm cứu chút chắc là ra thôi.
a = "a" & ChrW(224) & ChrW(225) & ChrW(227) & ChrW(7841) & ChrW(7843) a1 = ChrW(226) & ChrW(7845) & ChrW(7847) & ChrW(7849) & ChrW(7851) & ChrW(7853) ...

Cơ bản tôi hay dùng Recordset nên thường sử dụng câu lệnh SQL để xử lý mà ADO là dùng câu lệnh SQL nên áp dụng được thôi.
Vậy thì khá rắc rối, thôi thì cứ bê nguyên cái dữ liệu theo điều kiện mình đặt ra, sau đó nếu cần gõ chữ nào thì lọc chữ đó cho nó lành. Phàm cái gì khó quá thì bỏ qua cho khỏe.

P/s: Mà cứ gõ ký tự lại kết nối với CSDL phải chăng là nó quá lâu hơn so với lọc qua mảng không?
 
Upvote 0
Trong một danh sách có nhiều mục, bạn cần lọc người có tên Tuấn chẳng hạn, nhưng đồng thời phải lọc theo đó là ngày sinh, nơi ở, số điện thoại v.v... hoặc đơn giản chỉ lọc lấy 2 cột tên và mã số thôi:

View attachment 265276

Bình thường thì mình dùng 2 vòng lặp là một vòng duyệt danh sách và trong khi duyệt mình lại làm 1 mảng để lưu lại số hàng đã được chọn, sau đó từ mảng ghi số hàng đó mình duyệt 1 vòng lặp nữa để tạo một mảng kết quả.

Thì với dạng mảng từ GetRows này mình chỉ duyệt 1 vòng lặp đã có mảng kết quả ngay trong đó luôn rồi.
Cách này hay đấy, sẽ bỏ được một vòng lặp, tốc độ vì thế sẽ cải thiện, dùng code sẽ phê hơn bình thường.
 
Upvote 0
Web KT
Back
Top Bottom