let
Source = List.Transform({"D:\MyPham\DOWNLOAD\csv2file\Ngày 1.csv","D:\MyPham\DOWNLOAD\csv2file\Trống.csv"}, each
let
a = Csv.Document(File.Contents(_), [Delimiter=",", Columns=23, Encoding=65001, QuoteStyle=QuoteStyle.None]) ,
n = Table.RowCount(a),
result = try if n is number then a else null otherwise null
in result),
Data = List.RemoveNulls(Source),
Header = Table.PromoteHeaders(Data{0})
in
Header
Trong đó:
- a là mở và lấy dữ liệu cả 2 file trong 1 vòng lặp List.Transform
- n là lấy số dòng dữ liệu của mỗi file, lấy được mỗi file 1 giá trị. Nếu file 1 không tồn tại thì không thể lấy số dòng, n của file đó không tính được và nhận giá trị lỗi (không biết hình dạng giá trị lỗi ra sao). Ngược lại file có tồn tại thì n nhận giá trị number.
- result là try otherwise: Tạo 1 list 2 phần tử:
Phần tử a nào có n là number thì lấy dữ liệu của a đó, ngược lại thì gán giá trị null. Otherwise không lấy được cũng null.
- Data lọc bỏ null trong list (nếu để thì khi lấy Header sẽ lỗi)
- Header: tạo header từ dòng đầu của table thứ nhất (lấy bằng phần tử thứ nhất {0})
________________________
Như vậy code này không lấy giá trị lỗi mà lấy giá trị ngược với lỗi để làm điều kiện rẽ nhánh. Hình như gọi là phản chứng.
let
Source = List.Transform({"D:\MyPham\DOWNLOAD\csv2file\Ngày 1.csv","D:\MyPham\DOWNLOAD\csv2file\Trống.csv"}, each
let
a = Csv.Document(File.Contents(_), [Delimiter=",", Columns=23, Encoding=65001, QuoteStyle=QuoteStyle.None]) ,
n = Table.RowCount(a),
result = try if n is number then a else null otherwise null
in result),
Data = List.RemoveNulls(Source),
Header = Table.PromoteHeaders(Data{0})
in
Header
Trong đó:
- a là mở và lấy dữ liệu cả 2 file trong 1 vòng lặp List.Transform
- n là lấy số dòng dữ liệu của mỗi file, lấy được mỗi file 1 giá trị. Nếu file 1 không tồn tại thì không thể lấy số dòng, n của file đó không tính được và nhận giá trị lỗi (không biết hình dạng giá trị lỗi ra sao). Ngược lại file có tồn tại thì n nhận giá trị number.
- result là try otherwise: Tạo 1 list 2 phần tử:
Phần tử a nào có n là number thì lấy dữ liệu của a đó, ngược lại thì gán giá trị null. Otherwise không lấy được cũng null.
- Data lọc bỏ null trong list (nếu để thì khi lấy Header sẽ lỗi)
- Header: tạo header từ dòng đầu của table thứ nhất (lấy bằng phần tử thứ nhất {0})
________________________
Như vậy code này không lấy giá trị lỗi mà lấy giá trị ngược với lỗi để làm điều kiện rẽ nhánh. Hình như gọi là phản chứng.
Em chào anh ạ, hiện tại em đang sài code của anh nhưng bị lỗi là khi file Ngày 1 không tồn tại, nó load file trống thì công thức trong ngày 1 của em nó bị nhảy số và bị N/A
VD: em đang để C4:C500 thì nó tự động nhảy thành C41:C512, xong lúc load lại ngày 1 thì nó không trả về như cũ, báo N/A luôn.
- Anh cho em hỏi làm thế nào nó có thể giữ được công thức cũ cho dù file nó có load file trống không ạ.
Em gửi a file đính kèm có data và công thức để anh xem thử
Em chào anh ạ, hiện tại em đang sài code của anh nhưng bị lỗi là khi file Ngày 1 không tồn tại, nó load file trống thì công thức trong ngày 1 của em nó bị nhảy số và bị N/A
VD: em đang để C4:C500 thì nó tự động nhảy thành C41:C512, xong lúc load lại ngày 1 thì nó không trả về như cũ, báo N/A luôn.
Thứ nhất, code đó tuy vẫn đúng nhưng không phải code của tôi viết từ đầu,
Thứ hai, công thức của bạn quá phức tạp, tôi không muốn xem. Tuy nhiên, hãy viết công thức với tên cột của table thay vì địa chỉ dòng cột.
Thí dụ thay 'TGHĐ Ngày 1'!$A$3:$C$533 bằng TGHĐ_Ngày_1[[2024-07-04 Daily report]:[_1]]
bằng cách quét chọn từ dòng 2 đến hết thay vì dòng 3.
Thứ ba: file csv của bạn dư 1 dòng đầu, phải skip nó trước khi Promote header
Thứ nhất, code đó tuy vẫn đúng nhưng không phải code của tôi viết từ đầu,
Thứ hai, công thức của bạn quá phức tạp, tôi không muốn xem. Tuy nhiên, hãy viết công thức với tên cột của table thay vì địa chỉ dòng cột.
Thí dụ thay 'TGHĐ Ngày 1'!$A$3:$C$533 bằng TGHĐ_Ngày_1[[2024-07-04 Daily report]:[_1]]
bằng cách quét chọn từ dòng 2 đến hết thay vì dòng 3.
Dạ anh cho e hỏi thêm 1 câu nữa ạ, nếu em muốn không muốn sài nguyên cột mà chỉ sài từ 1 khoảng nhất định như là từ C10:C20hoặc C10:F20 thì sao ạ, khi e sổ hàm ra thì chỉ thấy toàn nguyên một cột như hình
Với 1 bảng dữ liệu chuẩn thì khi dò tìm (Match) hoặc truy xuất (Index) không có lý do gì để chỉ tìm trong 1 khoảng nhỏ. Ngoài ra nếu là file "Trống" thì có đâu cái khoảng nhỏ đó?
Không ai gõ kiểu đó, mà là click chọn và Excel tự điền tên cột vào.
______
Tôi vẫn thấy dữ liệu có 1 đống những dòng trống ở giữa, và có vẻ như 1 file csv có 3 bảng chồng lên nhau. Vi phạm nguyên tắc và cấu trúc CSDL.
Giả sử khi có file ngày 1, bảng trên cùng đến dòng 30. Nếu cứ chọn A3:A30 (không phải nguyên cột), thì nó là bảng trên cùng, nếu không có file ngày 1, mà lấy file trống thì 3 bảng gộp lại cũng chưa đến 30 dòng. Luôn luôn sai.
Phải tách mỗi file thành 3 bảng riêng biệt rồi mỗi bảng tra cứu nguyên cột.
Đọc lại bài 23: Skip trong PQ chứ excel làm gì có skip.
Giả sử khi có file ngày 1, bảng trên cùng đến dòng 30. Nếu cứ chọn A3:A30 (không phải nguyên cột), thì nó là bảng trên cùng, nếu không có file ngày 1, mà lấy file trống thì 3 bảng gộp lại cũng chưa đến 30 dòng. Luôn luôn sai.
Phải tách mỗi file thành 3 bảng riêng biệt rồi mỗi bảng tra cứu nguyên cột.