Import dữ liệu từ hàng loạt file text vào từng hàng ? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

kegiaumat055

Thành viên chính thức
Tham gia
22/4/11
Bài viết
91
Được thích
2
Mình có một thư mục chứa nhiều file text. Giờ phải làm sao để excel tự động import các file này vào từng hàng nhỉ ?

Ví dụ: File1.txt, file2.txt, ... filex.txt.....

Nội dung file1.txt sẽ được import vào hàng C1
Nội dung file2.txt sẽ được import vào hàng C2
....
Nội dung filex.txt sẽ được import vào hàng Cx

Các bạn giúp mình với ! Cảm ơn các bạn nhiều !
 
Mình có một thư mục chứa nhiều file text. Giờ phải làm sao để excel tự động import các file này vào từng hàng nhỉ ?

Ví dụ: File1.txt, file2.txt, ... filex.txt.....

Nội dung file1.txt sẽ được import vào hàng C1
Nội dung file2.txt sẽ được import vào hàng C2
....
Nội dung filex.txt sẽ được import vào hàng Cx

Các bạn giúp mình với ! Cảm ơn các bạn nhiều !

Import sao? Bạn phải có file mẫu chứ, nói không không thì thì chờ đến.. trăm năm nhé
 
Mình lấy một ví dụ nhé :
Trong thư mục C:\file có 4 file txt
file1 có nội dung "hehe"
file2 có nội dung "haha"
file3 có nội dung "hihi"
file4 có nội dung "huhu"

Vậy làm sao để excel tự động nhập dữ liệu từ các file trên vào excel như mẫu mình đính kèm ?
Cảm ơn các bạn ! :D
 

File đính kèm

Mình lấy một ví dụ nhé :
Trong thư mục C:\file có 4 file txt
file1 có nội dung "hehe"
file2 có nội dung "haha"
file3 có nội dung "hihi"
file4 có nội dung "huhu"

Vậy làm sao để excel tự động nhập dữ liệu từ các file trên vào excel như mẫu mình đính kèm ?
Cảm ơn các bạn ! :D

Thế file txt của bạn đâu?
Bạn đừng có ví dụ gì cả, cứ đưa file thật lên đây
Cái gì mà hehe, haha... rồi vài bữa làm xong, ráp vào file thật nó cóc chạy lại mất công sửa lại à?
 
Thế file txt của bạn đâu?
Bạn đừng có ví dụ gì cả, cứ đưa file thật lên đây
Cái gì mà hehe, haha... rồi vài bữa làm xong, ráp vào file thật nó cóc chạy lại mất công sửa lại à?

Không phải đâu bạn ơi ! Mình hiện tại chưa có dữ liệu này, mình hỏi cách làm để khi nào có mình làm luôn

Mình đính kèm 4 file txt nhé !
Cảm ơn bạn nhiều lắm :D
 

File đính kèm

Không phải đâu bạn ơi ! Mình hiện tại chưa có dữ liệu này, mình hỏi cách làm để khi nào có mình làm luôn

Mình đính kèm 4 file txt nhé !
Cảm ơn bạn nhiều lắm :D

Đưa dữ liệu như vậy có phải là dễ làm không!
Dạng bài này quá đơn giản. Code như sau:
Mã:
Function GetFilesList(ByVal Folder As String, ByVal Search As String, ByVal InSub As Boolean)
  Dim sComm As String, tmp As String, tmpFile, Arr
  On Error Resume Next
  If Right(Folder, 1) <> "\" Then Folder = Folder & "\"
  Search = """" & Folder & Search & """"
  With CreateObject("Scripting.FileSystemObject")
    tmpFile = .GetTempName
    sComm = "DIR " & Search & " /ON /B /A-D " & IIf(InSub, "/S", " ") & " >" & tmpFile
    CreateObject("Wscript.Shell").Run "cmd /u /c " & sComm, 0, True
    With .OpenTextFile(tmpFile, 1, , -2)
      tmp = Trim(.ReadAll)
      If Right(tmp, 2) = vbCrLf Then tmp = Left(tmp, Len(tmp) - 2)
      If Len(tmp) Then
        If InSub = False Then tmp = Folder & Replace(tmp, vbCrLf, vbCrLf & Folder)
        GetFilesList = Split(tmp, vbCrLf)
      End If
      .Close
    End With
  End With
  Kill tmpFile
End Function
Mã:
Sub Main()
  Dim sFolder, aFile, fleItem
  Dim n As Long, t As Double
  On Error Resume Next
  Sheet1.Range("A:A").ClearContents
  sFolder = CreateObject("Shell.Application").BrowseForFolder(0, "", 1).Self.Path
  t = Timer
  If TypeName(sFolder) = "String" Then
    If Right(sFolder, 1) <> "\" Then sFolder = sFolder & "\"
    aFile = GetFilesList(sFolder, "*.txt", False)
    If IsArray(aFile) Then
      ReDim Arr(1 To UBound(aFile) + 1, 1 To 1)
      With CreateObject("Scripting.FileSystemObject")
        For Each fleItem In aFile
          n = n + 1
          With .OpenTextFile(fleItem, 1, , -2)
            Arr(n, 1) = .ReadAll
            .Close
          End With
        Next
      End With
      With Sheet1.Range("A1").Resize(n)
        .WrapText = True
        .Value = Arr
      End With
      MsgBox "Tim thay " & n & " files", , "(" & Format(Timer - t, "0.000s") & ")"
    End If
  End If
End Sub
Cách dùng: Nhấn nút, duyệt đến thư mục chứa file txt rồi OK là xong!
--------------
Lưu ý: File Excel chứa code thì phải lưu ở định dạng xlsm nhé
 

File đính kèm

Tôi chả biết bạn này dùng haha hehe hihi làm cái gì cho nên tôi không có chủ đích giải bài này.

Chả là dạng nối files và nhập vào Excel này rất thuờng xảy ra cho người quản lý hệ thống. Cho nên tôi góp ý:

Thỉnh thoảng, người QLHT có việc cần phân tích các file logs, gom tất cả 30 files trong tháng vào Excel để phân tích cho dễ.

- Vào cửa sổ DOS cmd và gõ dòng lệnh sau:
for %f in (C:\thumuclog\*.log) do type “%f” >> TongTrongThang3.txt

- Text import TongTrongThang3.txt vào Excel
 
Bạn ơi cho mình hỏi thêm: Mình thử cho dữ liệu nhiều vào các file txt, khi macros tự nhập thông tin vào excel thì nhiều ô quá dài ( vì nhiều thông tin). Vậy bạn cho mình hỏi làm sao để các ô có chiều dài bình thường ?
 
Hi All,

Đoạn code này rất hay. Nhưng không biết bạn có thể sửa lại giúp với yêu cầu là chỉ cần lấy 200 ký tự đầu tiên của text file không? Vì trong số trường hợp như log file chỉ cần lấy phần thông tin header của file text.

Rất Cám ơn sự chia sẽ của bạn!
 
Gửi các anh chị trên diễn đàn
Mong các anh chị giúp mình đoạn code lấy dữ liệu 1 hay nhiều file .txt đóng sang file Excel theo yêu cầu mình ghi trong file Excel
Cám ơn các anh chị
Trân Trọng
 

File đính kèm

Giúp mình với !, đã 1 ngày trôi qua rồi mà không thấy ai trả lời hết,
mình tìm trên Google không thấy trường hợp nào giống mình.
 
Các anh chị trên diễn đàn ơi giúp mình với mình đang rất cần lấy file kiểu này để làm một số công việc :clap2:
 
Giúp mình với !, đã 1 ngày trôi qua rồi mà không thấy ai trả lời hết,
mình tìm trên Google không thấy trường hợp nào giống mình.

Bài này cũng dễ mà hổng thấy ai làm hết vậy ta
Trong file của bạn đã có code sẵn rồi, chỉ sửa lại chút là được mà!
Code trong file:
Mã:
Sub ImportTextToExcel()
  Dim fso As Object, FilesToOpen, TextSource As Object, TotalLines, Res()
  Dim ItemsOfLine, TextItem, Delimiter As String, n As Byte
  Dim K As Long, X As Byte, Cols As Integer, LineNum As Long
  Set fso = CreateObject("Scripting.FileSystemObject")
  Delimiter = ","
  FilesToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt", , , , True)
  If Not IsArray(FilesToOpen) Then Exit Sub
  For X = LBound(FilesToOpen) To UBound(FilesToOpen)
    Set TextSource = fso.OpenTextFile(FilesToOpen(X), 1, , -2)
    TotalLines = Split(TextSource.ReadAll, vbCrLf)
    For LineNum = LBound(TotalLines) To UBound(TotalLines)
      ItemsOfLine = TotalLines(LineNum)
      TextItem = Split(ItemsOfLine, Delimiter)
      If UBound(TextItem) + 1 > n Then
        ReDim Preserve Res(1 To 65536, 1 To UBound(TextItem) + [COLOR=#ff0000][B]1[/B][/COLOR])[COLOR=#ff0000]
        [/COLOR]n = UBound(TextItem) + [COLOR=#ff0000]1[/COLOR]
      End If
      If ItemsOfLine <> String(Len(ItemsOfLine), vbTab) Then
        K = K + 1
        For Cols = LBound(TextItem) To UBound(TextItem)
          [COLOR=#ff0000]Res(K, Cols + 1) = TextItem(Cols)[/COLOR]
        Next
      End If
    Next
  Next
  [A2].Resize(K, UBound(Res, 2)) = Res
End Sub
Sửa lại thế này:
Mã:
Sub ImportTextToExcel()
  Dim fso As Object, FilesToOpen, TextSource As Object, TotalLines, Res()
  Dim ItemsOfLine, TextItem, Delimiter As String, n As Byte
  Dim K As Long, X As Byte, Cols As Integer, LineNum As Long
  Set fso = CreateObject("Scripting.FileSystemObject")
  Delimiter = ","
  FilesToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt", , , , True)
  If Not IsArray(FilesToOpen) Then Exit Sub
  For X = LBound(FilesToOpen) To UBound(FilesToOpen)
    Set TextSource = fso.OpenTextFile(FilesToOpen(X), 1, , -2)
    TotalLines = Split(TextSource.ReadAll, vbCrLf)
    For LineNum = LBound(TotalLines) To UBound(TotalLines)
      ItemsOfLine = TotalLines(LineNum)
      TextItem = Split(ItemsOfLine, Delimiter)
      If UBound(TextItem) + 1 > n Then
        ReDim Preserve Res(1 To 65536, 1 To UBound(TextItem) +[COLOR=#ff0000] [B]2[/B][/COLOR])[COLOR=#ff0000]
        [/COLOR]n = UBound(TextItem) +[COLOR=#ff0000] [B]2[/B][/COLOR]
      End If
      If ItemsOfLine <> String(Len(ItemsOfLine), vbTab) Then
        K = K + 1
        For Cols = LBound(TextItem) To UBound(TextItem)
          [COLOR=#ff0000]If Cols = 0 Then
            Res(K, Cols + 1) = Left(TextItem(Cols), 3)
          Else
            Res(K, Cols + 1) = TextItem(Cols)
          End If[/COLOR]
        Next
[COLOR=#ff0000]        Res(K, n) = fso.GetFile(FilesToOpen(X)).Name
        Res(K, n) = Left(Res(K, n), Len(Res(K, n)) - 4)[/COLOR]
      End If
    Next
  Next
  Range("A2").Resize(K, UBound(Res, 2)) = Res
End Sub
Những chỗ màu đỏ là chỗ sửa lại
--------------------
Nếu là tôi thì tôi sẽ viết code này khác hơn một chút
 
Cảm ơn anh ndu96081631 đã hồi âm
code này mình lấy ở đề tài tổng quan về FileSystemObject của tác giả quanghai1969, code này theo tác giả quanghai1969 nói nếu dữ liệu có nhiều hơn 65536 thì phải khai báo lại số này, có cách nào sửa code để nó tự nhận chỉ số này khi lấy file, mình có cảm giác là code có tốc độ lấy file chậm nếu lấy số lượng file nhiều và có nhiều dòng (chắc là do chỉ số này gây ra)

mình có thể sửa code trên đánh thêm số thứ tự ở đầu theo file lấy vào (vd: file text1.txt lấy vào 6 dòng thì thể hiện trong cột stt từ 1 đến 6) được không vậy mọi người
anh ndu96081631 có code nào khác cho tốc độ nhanh hơn giúp giùm em nha.
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn anh ndu96081631 đã hồi âm
code này mình lấy ở đề tài tổng quan về FileSystemObject của tác giả quanghai1969, code này theo tác giả quanghai1969 nói nếu dữ liệu có nhiều hơn 65536 thì phải khai báo lại số này, có cách nào sửa code để nó tự nhận chỉ số này khi lấy file, mình có cảm giác là code có tốc độ lấy file chậm nếu lấy số lượng file nhiều và có nhiều dòng (chắc là do chỉ số này gây ra)

mình có thể sửa code trên đánh thêm số thứ tự ở đầu theo file lấy vào (vd: file text1.txt lấy vào 6 dòng thì thể hiện trong cột stt từ 1 đến 6) được không vậy mọi người
anh ndu96081631 có code nào khác cho tốc độ nhanh hơn giúp giùm em nha.

Theo như bạn nói thì file giả lập chưa giống với thực tế. Để việc test code được chính xác, bạn nên đưa lên đây vài file text thật (dữ liệu thật và tổng số dòng thật)
Ngoài ra, cũng nên cho biết luôn mỗi lần lấy file thì tối đa là bao nhiêu file? Sau khi import vào Excel, bạn cần tối đa là bao nhiêu dòng?
vân... vân... và... vân... vân... Nói chung: Người thật, việc thật thì mới.. làm thật được!
 
Tôi không phải dân chuyên cũng đi cop nhặt code thôi. Nhưng theo cách của tôi (vì file text của bạn chỉ đơn thuần có 2 cột dữ liệu cách nhau bởi dấu phảy) thì tôi thấy được cái đọc hàng loạt file mà vẫn nhanh hơn(?)
Bạn thử xem.
(tôi có thêm 1 dòng tăng tốc lên 1 chút vào code của bạn nhưng k rõ có biến chuyển gì không vì tôi k thử trước và sau khi thêm nó)



Link tham khảo code
http://officetanaka.net/excel/vba/file/file08b.htm
 

File đính kèm

Lần chỉnh sửa cuối:
Theo như bạn nói thì file giả lập chưa giống với thực tế. Để việc test code được chính xác, bạn nên đưa lên đây vài file text thật (dữ liệu thật và tổng số dòng thật)
Ngoài ra, cũng nên cho biết luôn mỗi lần lấy file thì tối đa là bao nhiêu file? Sau khi import vào Excel, bạn cần tối đa là bao nhiêu dòng?
vân... vân... và... vân... vân... Nói chung: Người thật, việc thật thì mới.. làm thật được!

Gửi anh ndu96081631 cùng toàn thể mọi người
File giả lập mình gửi đã giống với file thực tế không có gì thay đổi, chỉ có điều sáng nay mình lấy dữ liệu vào đưa các anh chị trong công ty thì các anh chị ấy nói thêm 1 cột stt để tiện việc đối chiếu (thí dụ file text1 lấy vào 6 dòng thì ứng với stt thứ 3 có số lượng 23) mục đích của cột stt chỉ có vậy đây là do phát sinh trong công việc của mình ngoài ý muốn mong anh ndu96081631 cùng mọi người thông cảm,

Với code này khi mình lấy trên diễn đàn của anh quanghai1969 mình có lấy 01 file .txt có hơn 700.000.000 (tổng số các mặt hàng vpp cty đã nhập trong nhiều năm, số lượng này không cố định) do đó mình khai báo lại dòng
ReDim Preserve Res(1 To 65536, 1 To UBound(TextItem) + 1)
thành
ReDim Preserve Res(1 To 1000000000, 1 To UBound(TextItem) + 1)

kết quả là phải đợi đến hơn 1 phút (có lúc tưởng treo máy) mới cho kết quả
thấy vậy mình chia nhỏ file .txt có hơn 700.000.000 kia ra làm nhiều file mổi file 65536 dòng chạy code lấy vào thì tốc độ thấy nhanh hơn so với lấy nguyên một cục

vì vậy mình thiết nghĩ nếu code có thể tìm được số dòng tối đa của một file text đang lấy vào và gán vào
ReDim Preserve Res(1 To "số dòng tối đa của một file text đang lấy" , 1 To UBound(TextItem) + 1)

thì sẽ cho kết quả chạy nhanh hơn, đây là suy nghĩ của cá nhân mình là người mới bước vào VBA có gì sai thì mong anh chị trên diễn đàn thông cảm, đây cũng là lý do mình hỏi anh ndu96081631 cùng mọi người trên diễn đàn và đây là câu hỏi thêm mang mục đích tham khảo và học hỏi thêm chứ câu mình cần là thêm stt như trên cơ

Một lần nữa mong anh ndu96081631 cùng mọi người trên diễn đàn thông cảm
 
Gửi anh ndu96081631 cùng toàn thể mọi người
File giả lập mình gửi đã giống với file thực tế không có gì thay đổi, chỉ có điều sáng nay mình lấy dữ liệu vào đưa các anh chị trong công ty thì các anh chị ấy nói thêm 1 cột stt để tiện việc đối chiếu (thí dụ file text1 lấy vào 6 dòng thì ứng với stt thứ 3 có số lượng 23) mục đích của cột stt chỉ có vậy đây là do phát sinh trong công việc của mình ngoài ý muốn mong anh ndu96081631 cùng mọi người thông cảm,

Với code này khi mình lấy trên diễn đàn của anh quanghai1969 mình có lấy 01 file .txt có hơn 700.000.000 (tổng số các mặt hàng vpp cty đã nhập trong nhiều năm, số lượng này không cố định) do đó mình khai báo lại dòng
ReDim Preserve Res(1 To 65536, 1 To UBound(TextItem) + 1)
thành
ReDim Preserve Res(1 To 1000000000, 1 To UBound(TextItem) + 1)

kết quả là phải đợi đến hơn 1 phút (có lúc tưởng treo máy) mới cho kết quả
thấy vậy mình chia nhỏ file .txt có hơn 700.000.000 kia ra làm nhiều file mổi file 65536 dòng chạy code lấy vào thì tốc độ thấy nhanh hơn so với lấy nguyên một cục

vì vậy mình thiết nghĩ nếu code có thể tìm được số dòng tối đa của một file text đang lấy vào và gán vào
ReDim Preserve Res(1 To "số dòng tối đa của một file text đang lấy" , 1 To UBound(TextItem) + 1)

thì sẽ cho kết quả chạy nhanh hơn, đây là suy nghĩ của cá nhân mình là người mới bước vào VBA có gì sai thì mong anh chị trên diễn đàn thông cảm, đây cũng là lý do mình hỏi anh ndu96081631 cùng mọi người trên diễn đàn và đây là câu hỏi thêm mang mục đích tham khảo và học hỏi thêm chứ câu mình cần là thêm stt như trên cơ

Một lần nữa mong anh ndu96081631 cùng mọi người trên diễn đàn thông cảm


Mình k dám mong đợi là nó chạy nhanh ghê gớm nhưng bạn thử file này xem ( đã có thêm số tt) ver 3 nhé
K rõ làm thế nào để hủy file đính kèm do bị nhầm nhỉ?

làm với dữ liệu 700 triệu dòng thì thấy bạn có vẻ làm ăn gặp trong vụ này đấy :)
 

File đính kèm

Lần chỉnh sửa cuối:
Mình k dám mong đợi là nó chạy nhanh ghê gớm nhưng bạn thử file này xem ( đã có thêm số tt)
Sửa luôn giúp mình code này kẻo nó k chạy hết dữ liệu nhé
endroW = Rows.Count

làm với dữ liệu 700 triệu dòng thì thấy bạn có vẻ làm ăn gặp trong vụ này đấy :)

Ý nhập lộn 700,000 thôi chứ lấy đâu ra 700,000,000
Cảm ơn bạn dovanhoc84, code bạn đã đáp ứng được thêm cột stt nhưng chưa đáp ứng được cột thứ 2 là lấy 3 ký tự đầu.

file ver2 của bạn chạy được file ver3 thì báo lỗi
một lần nữa cám ơn bạn
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom