
Chia sẻ
"Hướng dẫn Power Query toàn diện: import data từ nhiều nguồn, gộp file Excel/CSV trong folder, unpivot, merge queries, xử lý lỗi, và tự động hóa refresh. Dành cho người dùng Excel muốn "level up" kỹ năng xử lý dữ liệu."
Bạn có từng mất hàng giờ copy-paste dữ liệu từ 12 file báo cáo tháng vào 1 file tổng? Hoặc phải xóa dòng trống, đổi format cột ngày, tách họ tên — mỗi tháng lặp lại cùng thao tác? Power Query sinh ra để giải quyết chính xác những vấn đề đó.
Power Query (tích hợp sẵn Excel 365 và Excel 2016+) là công cụ ETL (Extract, Transform, Load) cho phép bạn: lấy dữ liệu từ bất kỳ nguồn nào, xử lý/biến đổi, rồi nạp vào worksheet — và quan trọng nhất: tất cả tự động hóa bằng 1 click Refresh.

1. Power Query Là Gì? — Tại Sao Bạn Cần Học
Power Query là "data prep tool" tích hợp trong Excel, cho phép bạn:
Import data từ Excel, CSV, database, web, API
Xử lý: lọc, đổi kiểu dữ liệu, tách/gộp cột, unpivot
Gộp (merge) nhiều bảng giống VLOOKUP nhưng mạnh hơn
Tổng hợp (append) nhiều file giống nhau thành 1 bảng
Tự động hóa: lưu bước xử lý, lần sau chỉ cần Refresh
Truy cập Power Query: Tab Data → Get & Transform Data (hoặc Data → Get Data trong phiên bản mới).
2. Import Dữ Liệu Từ Nhiều Nguồn
2.1 Từ file Excel/CSV
Data → Get Data → From File → From Workbook (Excel)
→ From Text/CSVPower Query sẽ hiển thị Navigator — chọn sheet hoặc named range cần import. Với CSV, PQ tự detect delimiter (comma, tab, semicolon).
2.2 Từ Folder — Gộp tất cả file cùng lúc
Đây là tính năng mạnh nhất: gộp hàng chục file Excel/CSV trong 1 folder thành 1 bảng duy nhất.
Bước 1: Data → Get Data → From File → From Folder
Bước 2: Chọn folder chứa các file báo cáo
Bước 3: Click "Combine & Transform Data"
Bước 4: Chọn sheet name (nếu Excel) → OK
Bước 5: PQ tự gộp tất cả file, thêm cột "Source.Name" để biết dữ liệu từ file nào💡 Mẹo: Đặt tên file theo pattern nhất quán (BaoCao_T01.xlsx, BaoCao_T02.xlsx...) để PQ gộp tự động. Khi thêm file mới vào folder, chỉ cần Refresh.
2.3 Từ Database/Web
// SQL Server
Data → Get Data → From Database → From SQL Server Database
→ Nhập Server name + Database name → OK
// Từ Web (API/HTML table)
Data → Get Data → From Other Sources → From Web
→ Nhập URL → PQ tự detect bảng dữ liệu trong trang3. Transform Data — 10 Thao Tác Phổ Biến Nhất
3.1 Đổi kiểu dữ liệu
// M language (tự sinh khi thao tác trên UI)
= Table.TransformColumnTypes(Source, {{"NgayBan", type date}, {"SoLuong", Int64.Type}, {"DonGia", type number}})3.2 Lọc dòng
// Xóa dòng trống
= Table.SelectRows(Source, each [HoTen] <> null and [HoTen] <> "")
// Lọc theo điều kiện
= Table.SelectRows(Source, each [KhuVuc] = "Hà Nội" and [DoanhThu] > 10000000)3.3 Tách cột
// Tách Họ Tên thành Họ + Tên
= Table.SplitColumn(Source, "HoTen", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.None, false), {"Ho", "Ten"})3.4 Unpivot — Chuyển cột thành dòng
Unpivot là kỹ thuật chuyển cấu trúc "wide" (nhiều cột) thành "tall" (nhiều dòng) — cần thiết khi dữ liệu được lưu theo format báo cáo (mỗi tháng 1 cột).
// Dữ liệu gốc: Sản Phẩm | T01 | T02 | T03 | ...
// Sau Unpivot: Sản Phẩm | Tháng | Doanh Thu
// Chọn cột cố định → Right-click → Unpivot Other Columns
= Table.UnpivotOtherColumns(Source, {"SanPham"}, "Thang", "DoanhThu")3.5 Merge Queries — VLOOKUP phiên bản mạnh
// Giống LEFT JOIN trong SQL
Bước 1: Home → Merge Queries
Bước 2: Chọn bảng chính (Orders) và bảng lookup (Products)
Bước 3: Chọn cột key: Orders[MaSP] ↔ Products[MaSP]
Bước 4: Join Kind: Left Outer
Bước 5: Expand cột vừa merge → chọn cột cần lấy// M language
= Table.NestedJoin(Orders, {"MaSP"}, Products, {"MaSP"}, "Products", JoinKind.LeftOuter)
= Table.ExpandTableColumn(Source, "Products", {"TenSP", "NhomHang", "DonGia"})3.6 Group By — Tổng hợp
// Tổng doanh thu theo Khu Vực + Tháng
= Table.Group(Source, {"KhuVuc", "Thang"}, {{"TongDoanhThu", each List.Sum([DoanhThu]), type number}, {"SoDon", each Table.RowCount(_), Int64.Type}})4. Tự Động Hóa — Refresh Tất Cả
Sau khi thiết lập các bước xử lý, PQ lưu lại toàn bộ "recipe". Lần sau chỉ cần:
Ctrl+Alt+F5 (Refresh All) — cập nhật tất cả queries
Data → Refresh All → chọn query cụ thể
Properties → Refresh every X minutes (tự động)
VBA: ThisWorkbook.RefreshAll (chạy macro refresh)
4.1 Thiết lập auto-refresh
Bước 1: Right-click query trong Queries & Connections pane
Bước 2: Properties → Refresh every 60 minutes
Bước 3: ✅ Enable background refresh
Bước 4: ✅ Refresh data when opening the file4.2 Error handling
// Thay thế lỗi bằng null
= Table.ReplaceErrorValues(Source, {{"DoanhThu", null}, {"SoLuong", 0}})
// Try-otherwise pattern
= try Number.FromText([GiaTri]) otherwise 05. M Language — Viết Custom Transform
M Language là ngôn ngữ đằng sau Power Query. Mỗi bước bạn thao tác trên UI đều sinh ra M code. Biết M giúp bạn:
Viết custom logic mà UI không hỗ trợ
Tối ưu performance (bỏ bước thừa)
Debug lỗi nhanh hơn
Tạo dynamic queries (tham số hóa)
5.1 Cấu trúc M code
let
// Bước 1: Lấy dữ liệu
Source = Excel.CurrentWorkbook(){[Name="BanHang"]}[Content],
// Bước 2: Đổi kiểu
ChangedType = Table.TransformColumnTypes(Source, {{"Ngay", type date}}),
// Bước 3: Lọc
Filtered = Table.SelectRows(ChangedType, each [KhuVuc] = "Hà Nội"),
// Bước 4: Nhóm
Grouped = Table.Group(Filtered, {"Thang"}, {{"Tong", each List.Sum([DoanhThu])}})
in
Grouped5.2 Hàm M hữu ích
// Thêm cột tính toán
Table.AddColumn(Source, "LoiNhuan", each [DoanhThu] - [ChiPhi], type number)
// Đổi tên nhiều cột cùng lúc
Table.RenameColumns(Source, {{"OldName1", "TenMoi1"}, {"OldName2", "TenMoi2"}})
// Sắp xếp
Table.Sort(Source, {{"DoanhThu", Order.Descending}})
// Thêm cột index
Table.AddIndexColumn(Source, "STT", 1, 1, Int64.Type)6. Ví Dụ Thực Tế: Gộp 12 File Báo Cáo Tháng
Scenario: Bạn có folder chứa 12 file BaoCao_T01.xlsx đến BaoCao_T12.xlsx, mỗi file có sheet "BanHang" với cùng cấu trúc. Mục tiêu: gộp thành 1 bảng tổng.
let
// Import từ folder
Source = Folder.Files("C:\Data\BaoCaoThang"),
// Chỉ lấy file .xlsx
FilteredXlsx = Table.SelectRows(Source, each Text.EndsWith([Name], ".xlsx")),
// Mở mỗi file, lấy sheet "BanHang"
AddContent = Table.AddColumn(FilteredXlsx, "Data", each
let wb = Excel.Workbook([Content])
in wb{[Item="BanHang", Kind="Sheet"]}[Data]
),
// Expand ra thành 1 bảng
Expanded = Table.ExpandTableColumn(AddContent, "Data", {"MaDH","NgayBan","NhanVien","SanPham","SoLuong","ThanhTien"}),
// Đổi kiểu dữ liệu
Typed = Table.TransformColumnTypes(Expanded, {
{"NgayBan", type date}, {"SoLuong", Int64.Type}, {"ThanhTien", type number}
}),
// Thêm cột Tháng từ tên file
AddMonth = Table.AddColumn(Typed, "Thang", each Text.BetweenDelimiters([Name], "_T", "."), type text)
in
AddMonthKết quả: Từ 12 file riêng lẻ thành 1 bảng tổng hợp cả năm. Tháng sau thêm file BaoCao_T01.xlsx mới vào folder → Refresh → xong!
Câu Hỏi Thường Gặp (FAQ)
Power Query có khác gì VBA?
Power Query chuyên về ETL (lấy-xử lý-nạp dữ liệu), dùng M language. VBA chuyên về automation (tự động hóa thao tác Excel), dùng VB. PQ dễ học hơn, có UI kéo-thả. VBA linh hoạt hơn nhưng cần biết lập trình. Lý tưởng: dùng PQ cho data prep, VBA cho macro tự động.
Dữ liệu PQ được lưu ở đâu?
PQ lưu kết quả trong Connection (cache) của workbook. Khi Refresh, PQ đọc lại nguồn gốc rồi cập nhật cache. File Excel sẽ lớn hơn vì chứa cả dữ liệu cache. Bạn có thể chọn "Connection Only" nếu chỉ cần dùng trong Pivot Table.
Power Query có giới hạn số dòng không?
Power Query không bị giới hạn 1,048,576 dòng như worksheet. PQ xử lý hàng triệu dòng trong bộ nhớ. Tuy nhiên khi load ra worksheet, vẫn bị giới hạn worksheet. Giải pháp: load vào Data Model (Power Pivot) thay vì worksheet.
Kết Luận
Power Query là skill "must-have" cho bất kỳ ai làm việc với dữ liệu trong Excel. Chỉ cần đầu tư 1-2 ngày học, bạn sẽ tiết kiệm hàng giờ mỗi tuần cho công việc xử lý data lặp đi lặp lại.
Bắt đầu từ tính năng gộp file trong folder — đây là use case có ROI cao nhất. Đọc thêm bài Dynamic Arrays và Pivot Table trên Trà Đá Data nhé! 🍵
Bình luận
Đăng nhập để tham gia bình luận
Đăng nhậpNhận bài viết mới nhất
Đăng ký để nhận thông báo khi có bài viết mới. Không spam, chỉ kiến thức chất lượng.
Bài viết liên quan
Khám phá thêm các bài viết cùng chủ đề
