「Nhờ giúp đỡ」 Lấy dữ liệu từ nhiều file

Liên hệ QC

tanphuocnihon

Thành viên mới
Tham gia
6/6/20
Bài viết
5
Được thích
1
Chào các tiền bối.
Mình mới tìm hiểu về vba. Có 1 vấn đề mình cảm thấy khó, nhưng mình nghĩ là dễ đối với mọi người. Nên mình muốn nhận được sự chỉ giúp.

Trong thư mục chứa dữ liệu của mình có rất nhiều file *.csv. Mình muốn tính số ô có chứa dữ liệu của từng file trong folder này rồi điền vào 1 excel tổng hợp.
Ví dụ có 2 file là 1001.csv và 1002.csv như hình dưới.
Trong file 1001.csv có 7 ô có chứa dữ liệu
Trong file 1002.csv có 10 ô có chứ dữ liệu
Mình muốn dùng lệnh vba để xuất ra kết quả vào file excel tổng hợp. Kết quả như hình số 3.
Trong file kết quả này cột A là tên file trong folder, cột B là tổng số có có chứa dữ liệu ứng với từng file.

Mình mò mãi mà không được, mong mọi người cho mình code để mình ứng dụng và học hỏi.
Mình cám ơn rất nhiều.

1607608436623.png


1607608611353.png
 

File đính kèm

  • 1607608275730.png
    1607608275730.png
    4.7 KB · Đọc: 3
Chào các tiền bối.
Mình mới tìm hiểu về vba. Có 1 vấn đề mình cảm thấy khó, nhưng mình nghĩ là dễ đối với mọi người. Nên mình muốn nhận được sự chỉ giúp.

Trong thư mục chứa dữ liệu của mình có rất nhiều file *.csv. Mình muốn tính số ô có chứa dữ liệu của từng file trong folder này rồi điền vào 1 excel tổng hợp.
Ví dụ có 2 file là 1001.csv và 1002.csv như hình dưới.
Trong file 1001.csv có 7 ô có chứa dữ liệu
Trong file 1002.csv có 10 ô có chứ dữ liệu
Mình muốn dùng lệnh vba để xuất ra kết quả vào file excel tổng hợp. Kết quả như hình số 3.
Trong file kết quả này cột A là tên file trong folder, cột B là tổng số có có chứa dữ liệu ứng với từng file.

Mình mò mãi mà không được, mong mọi người cho mình code để mình ứng dụng và học hỏi.
Mình cám ơn rất nhiều.

View attachment 250987


View attachment 250988
Tốt nhất là đính kèm file lên để code thử luôn,
Tôi có câu hỏi này muốn hỏi bạn:
Ví dụ file1, theo bạn có 7 ô có chứa dữ liệu, vậy giả sử một ô nào đó ở giữa không có dữ liệu, khi đó dòng cuối vẫn là dòng 7, thì số ô có dữ liệu là 6 hay vẫn tính theo dòng cuối là 7
 
Upvote 0
Bạn nên đính kèm file lên và không nên dùng câu "tiền bối" nhé.

Từ tiền bối mình dùng với nghĩa là thể hiện sự tôn trọng đối với 1 người đàn anh đàn chị đi trước mình trong 1 lĩnh vực nào đó, không đến tuổi tác. Còn ra mình không có ý nào khác đâu ạ. Vâng. Mình sẽ chú ý cách xưng hô trên diễn đàn. Mình gửi dữ liệu. Bạn giúp mình với.
Hai file dữ liệu là 1001.csv và 1002.csv.
Cảm ơn bạn!
Bài đã được tự động gộp:

Tốt nhất là đính kèm file lên để code thử luôn,
Tôi có câu hỏi này muốn hỏi bạn:
Ví dụ file1, theo bạn có 7 ô có chứa dữ liệu, vậy giả sử một ô nào đó ở giữa không có dữ liệu, khi đó dòng cuối vẫn là dòng 7, thì số ô có dữ liệu là 6 hay vẫn tính theo dòng cuối là 7

Trong trường hợp của bạn nói thì kết quả mình muốn lấy là 6. Vì mình chỉ muốn đếm số ô có dữ liệu.
Dưới đây là file 1001&1002 mình nén lại. Rất mong bạn giúp đỡ.
Cám ơn bạn!
 

File đính kèm

  • 1001&1002.rar
    216 bytes · Đọc: 6
  • 1001&1002.rar
    216 bytes · Đọc: 3
Upvote 0
Từ tiền bối mình dùng với nghĩa là thể hiện sự tôn trọng đối với 1 người đàn anh đàn chị đi trước mình trong 1 lĩnh vực nào đó, không đến tuổi tác. Còn ra mình không có ý nào khác đâu ạ. Vâng. Mình sẽ chú ý cách xưng hô trên diễn đàn. Mình gửi dữ liệu. Bạn giúp mình với.
Hai file dữ liệu là 1001.csv và 1002.csv.
Cảm ơn bạn!
Bài đã được tự động gộp:



Trong trường hợp của bạn nói thì kết quả mình muốn lấy là 6. Vì mình chỉ muốn đếm số ô có dữ liệu.
Dưới đây là file 1001&1002 mình nén lại. Rất mong bạn giúp đỡ.
Cám ơn bạn!
Bạn thử code dưới xem, đổi đường dẫn ở dòng add=... nhé
PHP:
Sub RefreshData()
Dim add As String
Dim filename As String
Dim r As Long
Dim short As String
    add = "C:\Users\user\Desktop\New folder"
    filename = Dir(add & "\*.csv")
    r = 1
    Do While Len(filename) > 0
        short = Replace(filename, ".csv", "")
        Workbooks.Open filename:=add & "\" & filename
        Workbooks("Test.xlsm").ActiveSheet.Cells(r, 1) = short
        Workbooks("Test.xlsm").ActiveSheet.Cells(r, 2) = Application.WorksheetFunction.CountA(Workbooks(filename).Sheets(short).Range("A:A"))
        r = r + 1
        Workbooks(filename).Close
        filename = Dir
    Loop
End Sub

Edit: đổi lại dòng
Workbooks("Test.xlsm").ActiveSheet.Cells(r, 2) = Application.WorksheetFunction.CountA(Workbooks(filename).Sheets(short).Range("A:A"))
 

File đính kèm

  • Test.xlsm
    15.6 KB · Đọc: 10
Lần chỉnh sửa cuối:
Upvote 0
Từ tiền bối mình dùng với nghĩa là thể hiện sự tôn trọng đối với 1 người đàn anh đàn chị đi trước mình trong 1 lĩnh vực nào đó, không đến tuổi tác. Còn ra mình không có ý nào khác đâu ạ. Vâng. Mình sẽ chú ý cách xưng hô trên diễn đàn. Mình gửi dữ liệu. Bạn giúp mình với.
...
Từ "tiền bối" là từ cổ TQ. Dân VN hay xem phim HK bắt chước lại để dùng mà không biết luật rằng loại từ này dùng để đùa giỡn, hay thậm chí diễu cợt, châm biếm.
Nó cũng giống như từ "đại ca", bạn có thể dùng trogn giói bạn bè của mình, nhưng đừng nghĩ nó có ý "tôn trọng"

Về vấn đề của bạn, có nhiều cách để thực hiện.
Nếu chỉ thuần file CSV, tức là file Text thì cách dễ và nhanh nhất là dùng một file channel để mở file và đọc dữ liệu như một stream. Đếm số dấu phẩy và xuống dòng thì biết được có bao nhiêu ô dữ liệu.

fileName = "C:\me folder\1001.csv"
fileNo = FreeFile ' lấy một channel đang phơ-ri
Open fileName For Input As #fileNo
textData = Input$(LOF(fileNo), fileNo)
Close #fileNo
soHang = Len(textData) - Len(Replace(textData, vbNewLine, "")) + 1

Nếu có dấu phẩy (tức là có nhiều cột) thì hơi rắc rối một chút. Bạn có thể đọc từng dòng và tìm xem mỗi dòng có bao nhiêu cột, tổng lại. Hoặc Split textData ở trên và tìm số cột trong mỗi phần tử.
 
Upvote 0
Trong trường hợp của bạn nói thì kết quả mình muốn lấy là 6. Vì mình chỉ muốn đếm số ô có dữ liệu.
Dưới đây là file 1001&1002 mình nén lại. Rất mong bạn giúp đỡ.
Hỏi thêm bạn một xíu, mình xem qua 2 file thì dữ liệu chỉ có ở cột A, và tên sheet giống tên file, không biết các file còn lại có cùng kiểu như vậy không, để mình thử cách khác
 
Upvote 0
Là chỉ có một cột vậy thôi, và tên sheet giống tên file vậy đó hả? chưa xài bao giờ hổng biết luôn
Đúng rồi, cái này bản chất nó không phải là tập tin excel (xls, xlsx, xlsm...), mình chỉ dùng excel để mở lên xem thôi - có thể mở bằng Word hay notepad gì cũng được hết.
 
Upvote 0
Chả biết code này có vấn đề chỗ nào mà đếm mỗi số không đếm text, nếu thêm một file mới (1003 chẳng hạn), để text số lẫn lộn thì nó vẫn đếm đúng. Anh @Hai Lúa Miền Tây vào xem em với
Mã:
Option Explicit
Sub NTKTNN()
Dim Fso As Object, oFile As Object, I As Long, Fpath As String
Set Fso = CreateObject("Scripting.FileSystemObject")
With Application.FileDialog(msoFileDialogFolderPicker)
    If .Show = 0 Then Exit Sub
    Fpath = .SelectedItems(1)
End With
For Each oFile In Fso.Getfolder(Fpath).Files
    If Fso.getextensionname(oFile) = "csv" And Left(oFile.Name, 1) <> "~" Then
        I = I + 1
        With CreateObject("ADODB.Recordset")
            .Open ("Select count(f1) from " & oFile.Name), "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Fpath & "\;Extended Properties='text;HDR=No;FMT=Delimited';"
            Sheet1.Cells(I, 1) = Fso.GetBaseName(oFile)
            Sheet1.Cells(I, 2).CopyFromRecordset .DataSource
        End With
    End If
Next
End Sub
 

File đính kèm

  • Tổng.xlsm
    19.8 KB · Đọc: 5
Upvote 0
Bạn thử code dưới xem, đổi đường dẫn ở dòng add=... nhé
PHP:
Sub RefreshData()
Dim add As String
Dim filename As String
Dim r As Long
Dim short As String
    add = "C:\Users\user\Desktop\New folder"
    filename = Dir(add & "\*.csv")
    r = 1
    Do While Len(filename) > 0
        short = Replace(filename, ".csv", "")
        Workbooks.Open filename:=add & "\" & filename
        Workbooks("Test.xlsm").ActiveSheet.Cells(r, 1) = short
        Workbooks("Test.xlsm").ActiveSheet.Cells(r, 2) = Application.WorksheetFunction.CountA(Workbooks(filename).Sheets(short).Range("A:A"))
        r = r + 1
        Workbooks(filename).Close
        filename = Dir
    Loop
End Sub

Edit: đổi lại dòng
Workbooks("Test.xlsm").ActiveSheet.Cells(r, 2) = Application.WorksheetFunction.CountA(Workbooks(filename).Sheets(short).Range("A:A"))
Mình đã kiểm tra code của bạn rồi.
Thật tuyệt vời. Chạy đúng như ý mình mong muốn.
Cám ơn bạn rất nhiều.

Bạn cho mình hỏi 1 cái. Là mỗi lần dùng mình phải điền đường dẫn vào code.
Thay vì mở code lên rồi nhập đường dẫn vào code,
thì khi chạy code sẽ hiện lên 1 cửa sổ, sau cho mình chọn folder lưu dữ lieu.
Làm như vậy thì có được không bạn nhỉ.
Bài đã được tự động gộp:

Từ "tiền bối" là từ cổ TQ. Dân VN hay xem phim HK bắt chước lại để dùng mà không biết luật rằng loại từ này dùng để đùa giỡn, hay thậm chí diễu cợt, châm biếm.
Nó cũng giống như từ "đại ca", bạn có thể dùng trogn giói bạn bè của mình, nhưng đừng nghĩ nó có ý "tôn trọng"

Về vấn đề của bạn, có nhiều cách để thực hiện.
Nếu chỉ thuần file CSV, tức là file Text thì cách dễ và nhanh nhất là dùng một file channel để mở file và đọc dữ liệu như một stream. Đếm số dấu phẩy và xuống dòng thì biết được có bao nhiêu ô dữ liệu.

fileName = "C:\me folder\1001.csv"
fileNo = FreeFile ' lấy một channel đang phơ-ri
Open fileName For Input As #fileNo
textData = Input$(LOF(fileNo), fileNo)
Close #fileNo
soHang = Len(textData) - Len(Replace(textData, vbNewLine, "")) + 1

Nếu có dấu phẩy (tức là có nhiều cột) thì hơi rắc rối một chút. Bạn có thể đọc từng dòng và tìm xem mỗi dòng có bao nhiêu cột, tổng lại. Hoặc Split textData ở trên và tìm số cột trong mỗi phần tử.

Mình thì không biết nhiều về văn hóa Trung Quốc.
Hiện nay mình đang làm việc tại Nhật. Văn hóa người người Nhật thì có từ "senbai", nghĩa là tiền bối. Từ này thể hiện sự tôn trọng ý kiến của những người đì trước mình. Không phân biệt tuổi tác. Dù người đó nhỏ tuổi hơn, hơn chỉ vào công ty trước mình có 1 ngày thì mình cũng phải tôn trọng là 1 người đi trước.
Và mình đang dùng với ý này.

Cám ơn gợi ý của bạn nhiều nhé.
Mình sẽ tham khảo cách làm của bạn.
Bài đã được tự động gộp:

Hỏi thêm bạn một xíu, mình xem qua 2 file thì dữ liệu chỉ có ở cột A, và tên sheet giống tên file, không biết các file còn lại có cùng kiểu như vậy không, để mình thử cách khác
Cám ơn bạn.
Đúng rồi bạn. Dữ lieu chỉ có ở cột A, và tên sheet going tên file đó bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn cho mình hỏi 1 cái. Là mỗi lần dùng mình phải điền đường dẫn vào code.
Thay vì mở code lên rồi nhập đường dẫn vào code,
thì khi chạy code sẽ hiện lên 1 cửa sổ, sau cho mình chọn folder lưu dữ lieu.
Làm như vậy thì có được không bạn nhỉ.
Được luôn bạn, bạn chỉnh lại code như bên dưới (phần cửa sổ đó chôm chỉa của @Nhattanktnn chứ lúc sáng t không biết vụ này luôn :p :p )

PHP:
Sub RefreshData()
Dim add As String
Dim filename As String
Dim r As Long
Dim short As String
Dim str As String
With Application.FileDialog(msoFileDialogFolderPicker)
    If .Show = 0 Then Exit Sub
    add = .SelectedItems(1)
End With
    filename = Dir(add & "\*.csv")
    r = 1
    Do While Len(filename) > 0
        short = Replace(filename, ".csv", "")
        Workbooks.Open filename:=add & "\" & filename
        Workbooks("Test.xlsm").ActiveSheet.Cells(r, 1) = short
        Workbooks("Test.xlsm").ActiveSheet.Cells(r, 2) = Application.WorksheetFunction.CountA(Workbooks(filename).Sheets(short).Range("A:A"))
        r = r + 1
        Workbooks(filename).Close
        filename = Dir
    Loop
End Sub
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom