MINI.MIS - Hàm số truy vấn SQL và hỗ trợ

TỔNG QUAN BÀI VIẾT

qHeader

Chức năng: Trả về chuỗi tham chiếu tiêu đề của một vùng dữ liệu theo định dạng [TênSheet$Vùng]. Hàm tự động rút gọn vùng tham chiếu khi vùng chỉ nằm trên một cột hoặc một hàng, giúp tạo chuỗi tham chiếu ngắn gọn và dễ đọc.

Cú pháp: =qHEADER(cellRange)

Trong đó: cellRange là ô hoặc vùng dữ liệu cần lấy thông tin tham chiếu.

Ví dụ: =qHEADER(A2:D10)[Sheet1$A2:D10] nếu vùng dữ liệu nằm trên trang tính Sheet1. Nếu sử dụng =qHEADER(B5:B20) thì kết quả là [Sheet1$B5:B], thể hiện vùng dữ liệu chỉ nằm trên một cột nên phần cuối được rút gọn thành tên cột.


qFields

Chức năng: Trả về danh sách tên trường (field) từ một hoặc nhiều vùng dữ liệu, chỉ lấy các ô chứa hằng số hoặc công thức có giá trị. Kết quả được ghép thành một chuỗi, trong đó mỗi tên trường được đặt trong dấu ngoặc vuông ([]), đồng thời ký tự xuống dòng được thay bằng dấu gạch dưới (_) và dấu chấm (.) được thay bằng dấu thăng (#).

Cú pháp: =qFIELDS(fieldRange1, [fieldRange2], …)

Trong đó: fieldRange1, fieldRange2, … là một hoặc nhiều vùng chứa tên các trường cần lấy.

Ví dụ: Nếu các ô A1:A3 lần lượt chứa Mã KH, Họ tênNgày sinh, thì công thức =qFIELDS(A1:A3) trả về [Mã KH],[Họ tên],[Ngày sinh]. Nếu truyền nhiều vùng, chẳng hạn =qFIELDS(A1:A3,C1:C2), kết quả sẽ ghép tất cả các tên trường theo đúng thứ tự của các vùng được chỉ định.


qListFiles

Chức năng: Liệt kê các tệp trong một thư mục theo điều kiện lọc tên tệp, có thể bao gồm cả các thư mục con. Hàm cho phép trả về tên tệp, đường dẫn tương đối hoặc đường dẫn đầy đủ và ghép các kết quả thành một chuỗi theo ký tự phân tách chỉ định.

Cú pháp: =qListFiles([FromFolderPath], [HasSubfolders], [FileNameLike], [FileNameNotLike], [ShowFullPath], [SplitChar])

Trong đó:

  • FromFolderPath: Đường dẫn thư mục cần liệt kê tệp. Nếu bỏ qua, sử dụng thư mục mặc định.
  • HasSubfolders: TRUE hoặc FALSE, xác định có tìm trong các thư mục con hay không. Mặc định là FALSE.
  • FileNameLike: Mẫu tên tệp cần lấy, sử dụng ký tự đại diện *?. Mặc định là "*".
  • FileNameNotLike: Mẫu tên tệp cần loại trừ. Mặc định là chuỗi rỗng.
  • ShowFullPath: Kiểu đường dẫn trả về:
    • 0: Đường dẫn tương đối so với thư mục chứa tệp Excel (mặc định).
    • 1: Đường dẫn tương đối so với FromFolderPath.
    • 2: Đường dẫn đầy đủ của tệp.
  • SplitChar: Ký tự phân tách giữa các tệp trong kết quả. Mặc định là dấu chấm phẩy (;).

Ví dụ: =qListFiles("D:\Data",TRUE,"*.xlsx","~$*",2,";") → Trả về danh sách đầy đủ đường dẫn của tất cả các tệp Excel (.xlsx) trong thư mục D:\Data và các thư mục con, đồng thời loại trừ các tệp tạm có tên bắt đầu bằng ~$. Các đường dẫn được phân tách bằng dấu chấm phẩy (;).


qListSheets

Chức năng: Liệt kê tên các trang tính (worksheet) trong sổ làm việc hiện tại theo điều kiện lọc. Hàm hỗ trợ chỉ lấy các trang tính có tên khớp với mẫu, loại trừ các trang tính không mong muốn, đồng thời có thể chèn thêm tiền tố, hậu tố và ghép kết quả bằng ký tự phân tách tùy chọn.

Cú pháp: =qListSheets([SheetNameLike], [SheetNameNotLike], [SplitChar], [InsertTextBefore], [InsertTextAfter])

Trong đó:

  • SheetNameLike: Mẫu tên trang tính cần lấy, hỗ trợ ký tự đại diện *?. Mặc định là "*".
  • SheetNameNotLike: Mẫu tên trang tính cần loại trừ. Mặc định là "xxxyz" (không loại trừ trang tính nào).
  • SplitChar: Ký tự phân tách giữa các tên trang tính. Mặc định là dấu chấm phẩy (;).
  • InsertTextBefore: Chuỗi được thêm vào trước mỗi tên trang tính. Mặc định là chuỗi rỗng.
  • InsertTextAfter: Chuỗi được thêm vào sau mỗi tên trang tính. Mặc định là chuỗi rỗng.

Ví dụ: =qListSheets("Data*","*Temp*",";", "[", "]") → Trả về danh sách các trang tính có tên bắt đầu bằng Data, loại trừ các trang tính có chứa Temp, mỗi tên được đặt trong dấu ngoặc vuông và phân tách bằng dấu chấm phẩy, ví dụ: [Data2024];[Data2025];[DataArchive].


qCell

Chức năng: Trả về địa chỉ tham chiếu tuyệt đối của một ô hoặc vùng dữ liệu, bao gồm tên trang tính, đồng thời loại bỏ thông tin tên sổ làm việc (workbook) nếu có. Kết quả phù hợp để sử dụng làm tham chiếu giữa các trang tính trong cùng một tệp Excel.

Cú pháp: =qCELL(cellRange)

Trong đó:

  • cellRange: Ô hoặc vùng dữ liệu cần lấy địa chỉ tham chiếu, hỗ trợ cả tham chiếu tới Data Table

Ví dụ: Nếu vùng A2:D10 nằm trên trang tính Data, thì công thức =qCELL(Data!A2:D10) trả về Data!$A$2:$D$10. Nếu tham chiếu đến một ô đơn, chẳng hạn =qCELL(Summary!B5), kết quả là Summary!$B$5. Nếu vùng tham chiếu thuộc một sổ làm việc khác, tên sổ làm việc sẽ được loại bỏ khỏi kết quả, chỉ giữ lại tên trang tính và địa chỉ ô/vùng.


qRange

Chức năng: Trả về địa chỉ của một ô hoặc vùng dữ liệu, không bao gồm tên trang tính. Kết quả là địa chỉ tuyệt đối theo kiểu A1, phù hợp khi chỉ cần tham chiếu đến vị trí ô hoặc vùng trong trang tính hiện tại.

Cú pháp: =qRange(Range_)

Trong đó:

  • Range_: Ô hoặc vùng dữ liệu cần lấy địa chỉ.

Ví dụ: Nếu vùng Data!B2:E20 được truyền vào hàm, công thức =qRange(Data!B2:E20) trả về $B$2:$E$20. Nếu tham chiếu đến một ô đơn, chẳng hạn =qRange(Summary!C5), kết quả là $C$5.


qSplitSQL

Chức năng: Ghép một hoặc nhiều chuỗi hoặc vùng dữ liệu thành một chuỗi SQL duy nhất, sau đó tự động chia thành nhiều đoạn sao cho mỗi đoạn không vượt quá giới hạn 32.768 ký tự của Excel. Hàm trả về một mảng dọc, rất hữu ích khi xử lý các câu lệnh SQL dài hoặc danh sách giá trị lớn.

Cú pháp: =qSplitSQL(SplitChar, SQLString1, [SQLString2], …)

Trong đó:

  • SplitChar: Ký tự dùng để phân tách các phần tử, chẳng hạn ",", ";" hoặc "|".
  • SQLString1, SQLString2, …: Chuỗi văn bản, ô hoặc vùng dữ liệu chứa các đoạn SQL hoặc danh sách giá trị cần ghép và chia.

Ví dụ: Nếu vùng A1:A10000 chứa danh sách mã khách hàng được phân tách bằng dấu phẩy, công thức =qSplitSQL(",",A1:A10000) sẽ ghép toàn bộ danh sách thành một chuỗi, sau đó tự động chia thành nhiều đoạn có độ dài không vượt quá 32.768 ký tự và trả về các đoạn này theo một cột. Kết quả có thể được sử dụng để tạo nhiều câu lệnh SQL hoặc truyền cho các hàm xử lý dữ liệu mà không vượt quá giới hạn độ dài chuỗi của Excel.


qListDataTables

Chức năng: Liệt kê tên của tất cả các bảng dữ liệu (Excel Table) trong sổ làm việc hiện tại. Kết quả được trả về dưới dạng một mảng dọc để có thể tràn (spill) xuống nhiều ô trong Excel.

Cú pháp: =qListDataTables()

Hàm không có tham số.

Ví dụ: Nếu sổ làm việc có ba bảng dữ liệu tên Customers, OrdersProducts, công thức =qListDataTables() sẽ trả về một danh sách theo cột gồm:

  • Customers
  • Orders
  • Products

Nếu sổ làm việc không chứa bất kỳ bảng dữ liệu nào, hàm sẽ trả về chuỗi No Data Tables found.


qStrArgument

Chức năng: Tạo chuỗi tham số theo định dạng TênThamSố='GiáTrị' từ các cặp tên–giá trị được truyền vào. Hàm hỗ trợ cả giá trị trực tiếp và tham chiếu ô, đồng thời ghép nhiều cặp tham số bằng dấu chấm phẩy (;).

Cú pháp: =qStrArgument(Name1, Value1, [Name2, Value2], …)

Trong đó:

  • Name1, Name2, …: Tên của tham số.
  • Value1, Value2, …: Giá trị của tham số hoặc ô tham chiếu. Nếu là vùng dữ liệu, hàm chỉ lấy giá trị của ô đầu tiên.

Ví dụ: =qStrArgument("Server","SQL01","Database","Sales","User","Admin")Server='SQL01'; Database='Sales'; User='Admin'

Nếu ô A1 chứa giá trị 2025, công thức =qStrArgument("Year",A1,"Region","North") sẽ trả về Year='2025'; Region='North'.

Lưu ý: Hàm yêu cầu số lượng đối số phải là số chẵn (mỗi tên tham số phải đi kèm một giá trị). Nếu truyền thiếu tên hoặc giá trị, hàm sẽ trả về thông báo: Error: Invalid number of arguments.


qCellArgument

Chức năng: Trả về địa chỉ tham chiếu của một ô hoặc vùng dữ liệu (bao gồm cả tên trang tính) được lưu trong nội dung của một ô theo một từ khóa xác định. Hàm tìm FindString trong chuỗi, sau đó lấy nội dung nằm giữa cặp dấu nháy đơn (') ngay sau từ khóa đó; nếu không tìm thấy sẽ trả về chuỗi rỗng.

Cú pháp: =qCellArgument(ArgumentInCell, FindString)

Trong đó:

  • ArgumentInCell: Ô chứa chuỗi văn bản có thông tin tham chiếu.
  • FindString: Chuỗi dùng để xác định tham số chứa địa chỉ tham chiếu cần lấy.

Ví dụ: Nếu ô A1 chứa chuỗi Source='Data!A2:D100';Lookup='Lists!B2:B50' thì:

  • =qCellArgument(A1,"Source=")Data!A2:D100
  • =qCellArgument(A1,"Lookup=")Lists!B2:B50

Nếu FindString không tồn tại hoặc không có cặp dấu nháy đơn hợp lệ sau từ khóa, hàm sẽ trả về chuỗi rỗng ("").


Query

Chức năng: Thực thi câu lệnh SQL trên một tệp dữ liệu và ghi kết quả vào vùng ô được chỉ định trong Excel. Hàm hỗ trợ điều khiển việc thực thi, hiển thị tiêu đề cột, đánh số dòng và tự động điều chỉnh độ rộng cột thông qua các tùy chọn bổ sung.

Cú pháp: =QUERY(Run, FILE, SQL, ToCell, [Options])

Trong đó:

  • Run: Giá trị TRUE hoặc FALSE. Nếu FALSE, truy vấn sẽ không được thực hiện.
  • FILE: Đường dẫn đến tệp dữ liệu nguồn. Nếu để trống (""), hàm sử dụng sổ làm việc hiện tại.
  • SQL: Câu lệnh SQL hoặc ô chứa câu lệnh SQL.
  • ToCell: Ô đầu tiên của vùng nhận kết quả truy vấn.
  • Options: (Tùy chọn) Chuỗi chứa một hoặc nhiều tùy chọn:
    • head: Hiển thị tiêu đề cột.
    • rownum: Thêm cột số thứ tự.
    • fit: Tự động điều chỉnh độ rộng cột.
    • Có thể kết hợp nhiều tùy chọn trong cùng một chuỗi.

Ví dụ: =QUERY(TRUE,"D:\Data\Sales.xlsx","SELECT * FROM Orders",A1,"head fit") → Thực hiện truy vấn lấy toàn bộ dữ liệu từ bảng Orders trong tệp Sales.xlsx, ghi kết quả bắt đầu từ ô A1, hiển thị tiêu đề cột và tự động điều chỉnh độ rộng các cột. Nếu FILE để trống, chẳng hạn =QUERY(TRUE,"","SELECT * FROM Customers",A1,"head"), hàm sẽ truy vấn dữ liệu từ sổ làm việc hiện tại.


SQL

Chức năng: Thực thi câu lệnh SQL trên một tệp dữ liệu và ghi kết quả vào vùng ô được chỉ định trong Excel. Hàm là phiên bản viết thường của QUERY, có chức năng và cách sử dụng hoàn toàn tương đương, hỗ trợ các tùy chọn hiển thị tiêu đề, đánh số dòng và tự động điều chỉnh độ rộng cột.

Cú pháp: =sql(Run, FILE, SQL_, ToCell, [Options])

Trong đó:

  • Run: Giá trị TRUE hoặc FALSE. Nếu FALSE, truy vấn sẽ không được thực hiện.
  • FILE: Đường dẫn đến tệp dữ liệu nguồn. Nếu để trống (""), hàm sử dụng sổ làm việc hiện tại. Có thể là đường dẫn cục bộ hoặc URL.
  • SQL_: Câu lệnh SQL hoặc ô chứa câu lệnh SQL.
  • ToCell: Ô đầu tiên của vùng nhận kết quả truy vấn.
  • Options: (Tùy chọn) Chuỗi chứa một hoặc nhiều tùy chọn:
    • head: Hiển thị tiêu đề cột.
    • rowm: Thêm cột số thứ tự.
    • fit: Tự động điều chỉnh độ rộng cột.
    • Có thể kết hợp nhiều tùy chọn, ví dụ: "head fit rowm".

Ví dụ: =sql(TRUE,"D:\Data\Sales.xlsx","SELECT * FROM Orders",A1,"head fit") → Thực hiện truy vấn lấy toàn bộ dữ liệu từ bảng Orders trong tệp Sales.xlsx, ghi kết quả bắt đầu từ ô A1, hiển thị tiêu đề cột và tự động điều chỉnh độ rộng các cột.

Nếu FILE để trống, chẳng hạn =sql(TRUE,"","SELECT * FROM Customers",A1,"head"), hàm sẽ truy vấn dữ liệu từ sổ làm việc hiện tại.


Query_Basic

Chức năng: Thực thi một câu lệnh SQL trên nguồn dữ liệu và trả về trực tiếp kết quả dưới dạng mảng động (Dynamic Array) trong Excel. Hàm hỗ trợ truy vấn nhiều loại nguồn dữ liệu như Excel, Access, Visual FoxPro và SQL Server, đồng thời có thể tùy chọn hiển thị tên cột.

Cú pháp: =QUERY_Basic(Source, SQL, [Header])

Trong đó:

  • Source: Đường dẫn đến tệp dữ liệu hoặc thông tin kết nối đến cơ sở dữ liệu. Nếu để trống (""), hàm sử dụng sổ làm việc hiện tại.
  • SQL: Câu lệnh SQL cần thực thi. Đối với Access hoặc SQL Server có thể truyền theo định dạng Câu_lệnh_SQL|Mật_khẩu.
  • Header: (Tùy chọn) Xác định có trả về tiêu đề cột hay không. TRUE hoặc bỏ qua để hiển thị tiêu đề; FALSE để chỉ trả về dữ liệu.

Ví dụ: =QUERY_Basic("D:\Data\Sales.xlsx","SELECT * FROM [Orders$]",TRUE) → Trả về toàn bộ dữ liệu từ bảng Orders trong tệp Sales.xlsx, bao gồm hàng tiêu đề. Kết quả được trả về dưới dạng mảng động và tự động tràn sang các ô lân cận.

Nếu truy vấn sổ làm việc hiện tại, có thể sử dụng =QUERY_Basic("","SELECT CustomerID, CompanyName FROM [Customers$]"), khi đó hàm sẽ trả về danh sách khách hàng cùng tên công ty với hàng tiêu đề mặc định.


Query_Local

Chức năng: Thực hiện truy vấn SQL trực tiếp trên một vùng dữ liệu trong sổ làm việc hiện tại mà không cần chỉ định tệp nguồn. Hàm tự động tạo mệnh đề FROM từ vùng dữ liệu được truyền vào và hỗ trợ bổ sung các mệnh đề SQL như WHERE, GROUP BY, ORDER BY hoặc HAVING.

Cú pháp: =QUERY_Local(SELECT_, FROM_RANGE, [SQL_After_From])

Trong đó:

  • SELECT_: Danh sách cột cần truy vấn. Có thể nhập * để lấy tất cả các cột hoặc chỉ định các trường cần lấy. Có thể nhập có hoặc không có từ khóa SELECT.
  • FROM_RANGE: Vùng dữ liệu nguồn dùng để truy vấn.
  • SQL_After_From: (Tùy chọn) Phần câu lệnh SQL bổ sung sau mệnh đề FROM, chẳng hạn WHERE, GROUP BY, HAVING, ORDER BY.

Ví dụ: =QUERY_Local("CustomerID, CompanyName",A1:F1000,"WHERE Country='USA' ORDER BY CompanyName") → Truy vấn vùng dữ liệu A1:F1000, lấy hai cột CustomerIDCompanyName của các bản ghi có Country = 'USA', sau đó sắp xếp kết quả theo CompanyName.

Nếu muốn lấy toàn bộ dữ liệu trong vùng, có thể sử dụng =QUERY_Local("*",A1:F1000,"WHERE Amount>1000"), khi đó hàm sẽ trả về tất cả các cột của các bản ghi có giá trị Amount lớn hơn 1000.


Query_Header

Chức năng: Trả về danh sách tên các cột (header) của kết quả truy vấn SQL mà không lấy dữ liệu. Hàm hỗ trợ truy vấn từ nhiều nguồn dữ liệu như Excel, Access, Visual FoxPro và SQL Server, giúp xác định cấu trúc dữ liệu trước khi thực hiện truy vấn đầy đủ.

Cú pháp: =QUERY_Header(Source, SQL_Pw)

Trong đó:

  • Source: Đường dẫn đến tệp dữ liệu hoặc thông tin kết nối đến cơ sở dữ liệu. Nếu để trống (""), hàm sử dụng sổ làm việc hiện tại.
  • SQL_Pw: Câu lệnh SQL cần thực thi. Đối với Access hoặc SQL Server có thể truyền theo định dạng Câu_lệnh_SQL|Mật_khẩu.

Ví dụ: =QUERY_Header("D:\Data\Sales.xlsx","SELECT * FROM [Orders$]") → Trả về một mảng gồm tên các cột của bảng Orders trong tệp Sales.xlsx, chẳng hạn: OrderID, CustomerID, OrderDate, Amount,...

Nếu truy vấn sổ làm việc hiện tại, có thể sử dụng =QUERY_Header("","SELECT CustomerID, CompanyName FROM [Customers$]"), khi đó hàm sẽ trả về hai tên cột: CustomerIDCompanyName.


Query_Complex

Chức năng: Thực thi nhiều câu lệnh SQL trên nhiều nguồn dữ liệu trong một lần gọi hàm và trả về kết quả dưới dạng mảng động. Hàm hỗ trợ kết hợp tối đa 60 tệp dữ liệu và 47 câu lệnh SQL, đồng thời có thể lựa chọn hiển thị hoặc ẩn hàng tiêu đề của kết quả.

Cú pháp: =QUERY_Complex(FILES, SQLs, [Header])

Trong đó:

  • FILES: Danh sách các tệp dữ liệu, phân tách bằng dấu chấm phẩy (;).
  • SQLs: Danh sách các câu lệnh SQL tương ứng, phân tách bằng dấu chấm phẩy (;).
  • Header: (Tùy chọn) Xác định có trả về hàng tiêu đề hay không. TRUE hoặc bỏ qua để hiển thị tiêu đề; FALSE hoặc 0 để chỉ trả về dữ liệu.

Ví dụ: =QUERY_Complex("D:\Data\Sales.xlsx;D:\Data\Inventory.xlsx","SELECT * FROM [Orders$];SELECT * FROM [Products$]",TRUE) → Thực hiện đồng thời hai truy vấn trên hai tệp Excel và trả về kết quả dưới dạng mảng động, bao gồm hàng tiêu đề.

Lưu ý: Hàm chỉ hỗ trợ tối đa 60 nguồn dữ liệu và 47 câu lệnh SQL. Nếu vượt quá các giới hạn này, hàm sẽ trả về thông báo lỗi tương ứng thay vì thực hiện truy vấn.


Query_Parallel

Chức năng: Thực thi đồng thời nhiều câu lệnh SQL trên nhiều nguồn dữ liệu tương ứng và trả về kết quả dưới dạng mảng động. Mỗi tệp dữ liệu phải đi kèm đúng một câu lệnh SQL, giúp tăng hiệu quả khi cần truy vấn nhiều nguồn dữ liệu độc lập trong cùng một công thức.

Cú pháp: =QUERY_Parallel(FILES, SQLs, [Header])

Trong đó:

  • FILES: Danh sách các tệp dữ liệu, phân tách bằng dấu chấm phẩy (;).
  • SQLs: Danh sách các câu lệnh SQL tương ứng với từng tệp, phân tách bằng dấu chấm phẩy (;).
  • Header: (Tùy chọn) Xác định có trả về hàng tiêu đề hay không. TRUE hoặc bỏ qua để hiển thị tiêu đề; FALSE hoặc 0 để chỉ trả về dữ liệu.

Ví dụ: =QUERY_Parallel("D:\Data\Sales.xlsx;D:\Data\Inventory.xlsx","SELECT * FROM [Orders$];SELECT * FROM [Products$]",TRUE) → Thực hiện đồng thời truy vấn bảng Orders từ tệp Sales.xlsx và bảng Products từ tệp Inventory.xlsx, sau đó trả về kết quả dưới dạng mảng động kèm theo hàng tiêu đề.

Lưu ý: Số lượng tệp trong FILES phải bằng số lượng câu lệnh trong SQLs. Hàm hỗ trợ tối đa 60 cặp tệp–câu lệnh SQL. Nếu số lượng không khớp hoặc vượt quá giới hạn này, hàm sẽ trả về thông báo lỗi.


Query_Xlsx

Chức năng:
Thực hiện truy vấn SQL trên nhiều tệp Excel cùng lúc bằng cách gọi hàm QUERY_XLS cho từng tệp, sau đó ghép tất cả kết quả thành một mảng duy nhất để trả về. Danh sách các tệp được truyền vào dưới dạng chuỗi, phân tách bằng dấu chấm phẩy (;).

Cú pháp:
=QUERY_XLSX(FILES, SQL, Header)

Trong đó:

  • FILES: Chuỗi chứa đường dẫn đến một hoặc nhiều tệp Excel, ngăn cách nhau bằng dấu ;.
  • SQL: Câu lệnh SQL dùng để truy vấn dữ liệu trong các tệp.
  • Header: Giá trị TRUE hoặc FALSE xác định dữ liệu nguồn có chứa hàng tiêu đề hay không.

Ví dụ:
=QUERY_XLSX("D:\Data\Sales_Q1.xlsx;D:\Data\Sales_Q2.xlsx","SELECT * FROM [Sheet1$]",TRUE)

→ Truy vấn toàn bộ dữ liệu từ trang tính Sheet1 của hai tệp Sales_Q1.xlsxSales_Q2.xlsx, sau đó ghép kết quả của cả hai tệp thành một mảng dữ liệu duy nhất để trả về trong Excel.

 
×