Tại sao quá trình làm mới của bạn vừa thất bại
Bạn nhấn nút Refresh, mong đợi các con số được cập nhật, nhưng thay vào đó, bạn lại nhận được một thanh báo lỗi màu đỏ. Lỗi cụ thể này khiến quá trình xử lý dữ liệu của bạn bị dừng lại hoàn toàn. Điều này xảy ra vì Power Query rất cứng nhắc: nếu nó mong đợi một cột có tên là "Revenue" nhưng lại thấy "Total Revenue", nó sẽ không biết phải tiếp tục như thế nào.
DataFormat.Error: The column 'ColumnName' of the table wasn't found.
Tại sao điều này xảy ra
Power Query (ngôn ngữ M) mã hóa cứng tên cột vào hầu hết các bước biến đổi dữ liệu. Nếu tệp nguồn thay đổi dù chỉ một chút, truy vấn sẽ bị lỗi. Các nguyên nhân phổ biến bao gồm:
- **Tiêu đề bị đổi tên:** Một đồng nghiệp đã đổi "ID" thành "Customer_ID" trong tệp CSV nguồn.
- **Bẫy "Changed Type":** Khi bạn nhập dữ liệu lần đầu, Power Query tự động thêm một bước liệt kê mọi tên cột hiện có. Nếu một cột biến mất sau đó, bước này sẽ thất bại.
- **Phân biệt chữ hoa chữ thường:** Với Power Query, "Date" và "date" là hai cột hoàn toàn khác nhau.
- **Ký tự ẩn:** Một khoảng trắng thừa ở cuối tiêu đề (như "Total ") sẽ gây ra sự không khớp nếu truy vấn tìm kiếm "Total".
Cách khắc phục
Phương pháp 1: Sửa bước "Changed Type"
Phần lớn thời gian, lỗi nằm ở bước "Changed Type" ngay sau nguồn dữ liệu hoặc bước nâng tiêu đề (header promotion).
- Mở **Power Query Editor** thông qua tab Data.
- Nhìn vào ngăn **Applied Steps** ở bên phải. Nhấp qua các bước cho đến khi bạn thấy thông báo lỗi màu đỏ.
- Kiểm tra **Formula Bar**. Bạn có thể sẽ thấy mã như thế này:
```
= Table.TransformColumnTypes(Source, {{"Tên_Cũ", type text}, {"Doanh_Số", Int64.Type}})
- Cập nhật `"Tên_Cũ"` để khớp với tiêu đề hiện tại trong tệp nguồn của bạn.
- Nếu bạn có hàng chục cột và không muốn sửa từng cột một, chỉ cần xóa bước "Changed Type" và áp dụng lại kiểu dữ liệu chỉ cho những cột bạn thực sự cần.
### Phương pháp 2: Điều chỉnh tệp nguồn
Nếu logic truy vấn của bạn phức tạp và tham chiếu đến cột bị thiếu ở nhiều nơi khác nhau, việc sửa tệp nguồn sẽ nhanh hơn sửa mã.
- Mở tệp Excel hoặc CSV nguồn của bạn.
- Xác nhận tiêu đề khớp chính xác với `'ColumnName'` trong thông báo lỗi. Hãy chú ý đến các khoảng trắng ở đầu hoặc cuối.
- Lưu tệp nguồn và làm mới báo cáo chính của bạn.
### Phương pháp 3: Tối ưu cho tương lai với tham chiếu động
Bạn có thể làm cho truy vấn của mình thông minh hơn để nó không bị lỗi khi một cột bị thiếu. Bằng cách thêm `MissingField.Ignore` vào mã M, bạn yêu cầu Power Query tiếp tục chạy ngay cả khi thiếu cột.
Thay đổi một bước chọn cột tiêu chuẩn từ thế này:
= Table.SelectColumns(#"Previous Step", {"Khu_Vực", "Doanh_Số"})
Thành thế này:
= Table.SelectColumns(#"Previous Step", {"Khu_Vực", "Doanh_Số"}, MissingField.Ignore)
Điều này ngăn chặn việc dừng đột ngột do lỗi. Truy vấn sẽ đơn giản là bỏ qua cột bị thiếu, mặc dù bạn có thể cần kiểm tra xem các bước sau đó có phụ thuộc vào dữ liệu đó hay không.
### Phương pháp 4: Đổi tên động
Nếu bạn muốn đổi tên một cột mà tên của nó có thể thay đổi tại nguồn, hãy sử dụng cú pháp này:
= Table.RenameColumns(#"Previous Step", {{"Tên_Cũ", "Tên_Mới"}}, MissingField.Ignore)
## Kiểm tra giải pháp
Làm theo các bước sau để đảm bảo dữ liệu của bạn hoạt động trở lại:
- Nhấp vào **Refresh Preview** bên trong Power Query Editor. Nếu lưới dữ liệu hiển thị mà không có lỗi, bạn đã giải quyết xong vấn đề cục bộ.
- Chọn **Close & Load**.
- Trong bảng tính Excel chính, nhấp chuột phải vào bảng của bạn và chọn **Refresh**.
- Nhìn vào ngăn **Queries & Connections**. Nó sẽ hiển thị dấu kiểm màu xanh lá cây hoặc dấu thời gian thành công như "Last refreshed 10:45 AM."
## Mẹo chuyên nghiệp để xử lý ETL tốt hơn
- **Dừng tự động phát hiện:** Đi tới *File > Options and settings > Query Options > Data Load*. Bỏ chọn "Detect column types and headers for unstructured sources." Điều này ngăn Power Query tự động tạo ra các bước "Changed Type" dễ gây lỗi.
- **Tham chiếu theo vị trí:** Nếu tiêu đề tệp nguồn của bạn thay đổi hàng tuần nhưng thứ tự vẫn giữ nguyên, hãy sử dụng `Table.ColumnNames(Source){0}` để lấy cột đầu tiên bất kể tên của nó là gì.
- **Làm sạch tiêu đề sớm:** Sử dụng `Table.TransformColumnNames(Source, Text.Trim)` làm bước đầu tiên để loại bỏ các khoảng trắng vô tình thường gây ra các lỗi này.

