Đọc file csv trong excel

Đọc file csv trong excel, và ứng dụng thực tế

4

Đọ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.

 

1. CSV là gì?

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:

  • Dấu , dùng để ngăn cách các cột.
  • Mỗi lần xuống dòng là một dòng dữ liệu.
A B C
Ma Ten Tuoi
01 An 20
02 Binh 25
03 Cuong 30

2. Code đơn giản nhất

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 Sub

Không nên học cả đoạn code cùng lúc. Hãy học từng dòng.

3. Khai báo biến

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

4. Mở file CSV

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.

5. Do While là gì?

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.

6. Line Input làm gì?

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"

7. Debug.Print để làm gì?

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

8. Loop nghĩa là quay lại

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

9. Close #1

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

10. Toàn bộ quá trình đọc file

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

11. Vấn đề: chúng ta mới đọc được cả dòng

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

12. Split là gì?

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.

13. Vì sao dùng UBound?

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

14. Dùng For để lấy từng cột

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

15. Đưa dữ liệu vào Excel

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

16. Tại sao i + 1?

Đâ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

17. Code hoàn chỉnh

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

18. Hiểu toàn bộ code theo 6 bước

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

19. Một lưu ý quan trọ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.

Bài viết liên quan:

Đọc file csv trong excel, và ứng dụng thực tế