Đọc file CSV trong VBA Excel cho người mới học, hiểu bản chất ứng dụng linh hoạt vào công việc.
CSV là một file dữ liệu dạng văn bản.
Ví dụ file dulieu.csv có nội dung:
Ma,Ten,Tuoi 01,An,20 02,Binh,25 03,Cuong,30
Có thể hiểu:
| A | B | C |
|---|---|---|
| Ma | Ten | Tuoi |
| 01 | An | 20 |
| 02 | Binh | 25 |
| 03 | Cuong | 30 |
Sub DocCSV()
Dim dong As String
Open "D:\data\dulieu.csv" For Input As #1
Do While Not EOF(1)
Line Input #1, dong
Debug.Print dong
Loop
Close #1
End SubKhông nên học cả đoạn code cùng lúc. Hãy học từng dòng.
Dim dong As String
Dim có nghĩa là khai báo biến.
Ở đây ta tạo một biến tên là:
dong
Kiểu dữ liệu là:
String
String dùng để chứa chuỗi ký tự.
Ví dụ:
dong = "01,An,20"
thì biến dong đang chứa:
01,An,20
Open "D:\data\dulieu.csv" For Input As #1
Dòng này có nghĩa:
Mở file dulieu.csv để đọc dữ liệu và đặt số hiệu cho file là 1.
Tách ra:
Open
= mở file.
"D:\data\dulieu.csv"
= đường dẫn tới file.
For Input
= mở file để đọc.
As #1
= đặt file đang mở là file số 1.
Có thể hình dung:
File dulieu.csv ↓ Open ↓ File #1
Sau khi thực hiện:
Open "D:\data\dulieu.csv" For Input As #1
VBA biết rằng file số 1 chính là file dulieu.csv.
Do While Not EOF(1)
Đây là một vòng lặp.
Có thể hiểu đơn giản:
Trong khi file số 1 chưa đọc hết thì tiếp tục đọc.
EOF là viết tắt của End Of File, nghĩa là cuối file.
Ví dụ file:
Ma,Ten,Tuoi 01,An,20 02,Binh,25 03,Cuong,30
Khi mới mở file thì chưa đến cuối file.
EOF(1) = False
Ta có:
Not EOF(1)
tức là:
Not False = True
Do đó vòng lặp tiếp tục chạy.
Line Input #1, dong
Dòng này có nghĩa:
Đọc một dòng trong file số 1 và đưa vào biến dong.
Ví dụ file:
Ma,Ten,Tuoi 01,An,20 02,Binh,25 03,Cuong,30
Lần đầu chạy:
Line Input #1, dong
thì:
dong = "Ma,Ten,Tuoi"
Lần thứ hai:
dong = "01,An,20"
Lần thứ ba:
dong = "02,Binh,25"
Lần thứ tư:
dong = "03,Cuong,30"
Debug.Print dong
Có nghĩa là in giá trị của biến dong ra cửa sổ Immediate.
Ví dụ:
dong = "01,An,20"
thì:
Debug.Print dong
sẽ hiện:
01,An,20
Trong VBA, có thể mở cửa sổ Immediate bằng:
Ctrl + G
Debug.Print dong Loop
Sau Loop, VBA quay trở lại:
Do While Not EOF(1)
VBA kiểm tra xem file còn dữ liệu không.
Nếu còn:
Đọc dòng tiếp theo
Nếu hết:
Thoát vòng lặp
Close #1
Có nghĩa là:
Đóng file số 1.
Ta nên nhớ:
Open ... As #1
thì sau khi xử lý xong:
Close #1
Giả sử CSV là:
Ma,Ten,Tuoi 01,An,20 02,Binh,25 03,Cuong,30
VBA sẽ hoạt động như sau:
Open file ↓ Đọc dòng 1 ↓ "Ma,Ten,Tuoi" ↓ Đọc dòng 2 ↓ "01,An,20" ↓ Đọc dòng 3 ↓ "02,Binh,25" ↓ Đọc dòng 4 ↓ "03,Cuong,30" ↓ Đã hết file ↓ Close file
Ví dụ:
Line Input #1, dong
đọc được:
01,An,20
Nhưng chúng ta muốn tách thành:
01 An 20
Lúc này sử dụng hàm:
Split
Ví dụ:
dong = "01,An,20"
Ta viết:
arr = Split(dong, ",")
VBA sẽ tìm dấu phẩy , để cắt chuỗi.
Kết quả:
arr(0) = "01" arr(1) = "An" arr(2) = "20"
Có thể hình dung:
"01,An,20" ↓ Split ---------------- | 01 | An | 20 | ---------------- 0 1 2
Chú ý: mảng trong VBA thường bắt đầu từ 0.
Sau khi:
arr = Split(dong, ",")
chúng ta không biết trước có bao nhiêu cột.
Ví dụ hôm nay:
01,An,20
có 3 cột.
Nhưng ngày mai có thể là:
01,An,20,Quang Nam,0901234567
có 5 cột.
Vì vậy dùng:
UBound(arr)
để lấy chỉ số cuối cùng.
Ví dụ:
arr(0) = "01" arr(1) = "An" arr(2) = "20"
thì:
UBound(arr)
trả về:
2
For i = 0 To UBound(arr) Debug.Print arr(i) Next i
Nếu:
arr(0) = "01" arr(1) = "An" arr(2) = "20"
thì vòng For chạy:
i = 0 → arr(0) → 01 i = 1 → arr(1) → An i = 2 → arr(2) → 20
Thay:
Debug.Print arr(i)
bằng:
Cells(dongExcel, i + 1).Value = arr(i)
Ví dụ:
dongExcel = 1 i = 0
thì:
Cells(1, 1).Value = arr(0)
tức là:
A1 = 01
Khi:
i = 1
thì:
Cells(1, 2).Value = arr(1)
tức là:
B1 = An
Khi:
i = 2
thì:
Cells(1, 3).Value = arr(2)
tức là:
C1 = 20
Đây là chỗ người mới học rất dễ thắc mắc.
Mảng bắt đầu từ 0:
arr(0) arr(1) arr(2)
Nhưng cột Excel bắt đầu từ 1:
Cột 1 = A Cột 2 = B Cột 3 = C
Vì vậy:
arr(0) → cột 1 arr(1) → cột 2 arr(2) → cột 3
Do đó cần:
i + 1
Ví dụ:
i = 0 i + 1 = 1 → cột A i = 1 i + 1 = 2 → cột B i = 2 i + 1 = 3 → cột C
Sub DocCSV() Dim dong As String Dim arr As Variant Dim i As Long Dim dongExcel As Long dongExcel = 1 Open "D:\data\dulieu.csv" For Input As #1 Do While Not EOF(1) 'Đọc một dòng Line Input #1, dong 'Tách dòng thành các cột arr = Split(dong, ",") 'Đưa từng cột vào Excel For i = 0 To UBound(arr) Cells(dongExcel, i + 1).Value = arr(i) Next i 'Chuyển xuống dòng Excel tiếp theo dongExcel = dongExcel + 1 Loop Close #1 End Sub
Open ↓ Mở file Do While Not EOF ↓ Kiểm tra còn dữ liệu không Line Input ↓ Đọc một dòng Split ↓ Tách dòng thành các cột Cells ↓ Đưa dữ liệu vào Excel Close ↓ Đóng file
Có thể nhớ thành:
Mở → Kiểm tra → Đọc dòng → Tách → Ghi Excel → Đóng
Cách:
Split(dong, ",")
phù hợp với CSV đơn giản.
Ví dụ:
01,An,20
Nhưng nếu CSV có dữ liệu:
01,"Nguyen, Van An",20
thì dấu phẩy bên trong "Nguyen, Van An" sẽ làm Split tách sai.
Trong trường hợp đó cần sử dụng cách đọc CSV chuyên dụng hơn.
Đọc file csv trong excel, và ứng dụng thực tế