Xin trợ giúp tự động nhập dữ liệu vào excel từ 1 thư mục bên trong chứa các file text dữ liệu

Liên hệ QC

Pham Dinh Ca

Thành viên mới
Tham gia
22/10/17
Bài viết
46
Được thích
1
Giới tính
Nam
Nghề nghiệp
Thất Nghiệp
Dear all!

Hiểu biết của mình về VBA là "Zero".

Mình xin nhờ mọi người trợ giúp bài toán sau ạ:

1. Tự động mở tới một thư mục chỉ định sẵn D:\data_logfile

2. Nhập dữ liệu của tất cả các file txt tại đây vào 1sheet excel
( Trong file excel mình gửi lên, có code nhập liệu, có gì mọi người xem tối giản và hiệu quả hơn giúp ạ)

3. Tự động thực hiện việc trên theo chu kỳ thời gian: ~ 3 phút hoặc có sự tác động ví dụ như nút refesh
( Thư mục kia các file txt liên tục được đẻ ra nên mình update dữ liệu công dồn)

Xin cảm ơn rất nhiều!
 

File đính kèm

  • Test.rar
    19 KB · Đọc: 11
Dear all!

Hiểu biết của mình về VBA là "Zero".

Mình xin nhờ mọi người trợ giúp bài toán sau ạ:

1. Tự động mở tới một thư mục chỉ định sẵn D:\data_logfile

2. Nhập dữ liệu của tất cả các file txt tại đây vào 1sheet excel
( Trong file excel mình gửi lên, có code nhập liệu, có gì mọi người xem tối giản và hiệu quả hơn giúp ạ)

3. Tự động thực hiện việc trên theo chu kỳ thời gian: ~ 3 phút hoặc có sự tác động ví dụ như nút refesh
( Thư mục kia các file txt liên tục được đẻ ra nên mình update dữ liệu công dồn)

Xin cảm ơn rất nhiều!
Làm theo cấu trúc file text của bạn, bạn thử code này:
PHP:
Sub gtext()
Dim str As String, spath As String, filetxt As Variant
Dim fso As Object, dic As Object, arr, i As Long
Set fso = CreateObject("scripting.filesystemobject")
Set dic = CreateObject("scripting.dictionary")
spath = "D:\Data_Logfile\"
filetxt = Dir(spath & "\*.txt")
arr = Range("H2:H" & [h1000000].End(xlUp).Row)
For i = 1 To UBound(arr)
    If Not dic.exists(arr(i, 1)) Then dic.Add arr(i, 1), ""
Next
Do While Len(filetxt) > 0
    If Not dic.exists(fso.GetBaseName(filetxt)) Then
        Open spath & filetxt For Input As #1
        Do Until EOF(1)
            Line Input #1, str
            [a1000000].End(xlUp).Offset(1).Resize(1, UBound(Split(str, vbTab)) + 1) = Split(str, vbTab)
            [h1000000].End(xlUp).Offset(1) = fso.GetBaseName(filetxt)
        Loop
        Close #1
    End If
    filetxt = Dir
Loop
Application.OnTime Now() + TimeValue("00:03:00"), "gtext"
End Sub
Mặc định thời gian refresh là 3 phút , nếu thay đổi bạn sửa lại chỗ Timevalue, đường dẫn mặc định là "D:\Data_Logfile\", nếu có thay đổi thì bạn sửa lại chỗ spath="D:\Data_Logfile\".
 
Làm theo cấu trúc file text của bạn, bạn thử code này:
PHP:
Sub gtext()
Dim str As String, spath As String, filetxt As Variant
Dim fso As Object, dic As Object, arr, i As Long
Set fso = CreateObject("scripting.filesystemobject")
Set dic = CreateObject("scripting.dictionary")
spath = "D:\Data_Logfile\"
filetxt = Dir(spath & "\*.txt")
arr = Range("H2:H" & [h1000000].End(xlUp).Row)
For i = 1 To UBound(arr)
    If Not dic.exists(arr(i, 1)) Then dic.Add arr(i, 1), ""
Next
Do While Len(filetxt) > 0
    If Not dic.exists(fso.GetBaseName(filetxt)) Then
        Open spath & filetxt For Input As #1
        Do Until EOF(1)
            Line Input #1, str
            [a1000000].End(xlUp).Offset(1).Resize(1, UBound(Split(str, vbTab)) + 1) = Split(str, vbTab)
            [h1000000].End(xlUp).Offset(1) = fso.GetBaseName(filetxt)
        Loop
        Close #1
    End If
    filetxt = Dir
Loop
Application.OnTime Now() + TimeValue("00:03:00"), "gtext"
End Sub
Mặc định thời gian refresh là 3 phút , nếu thay đổi bạn sửa lại chỗ Timevalue, đường dẫn mặc định là "D:\Data_Logfile\", nếu có thay đổi thì bạn sửa lại chỗ spath="D:\Data_Logfile\".

Cảm ơn bạn nhé. Mình đã thử được rồi.

Tuy nhiên bạn có thể giải thích cho mình đoạn code nào dùng để phân tách dữ liệu sau khi nhập vào Excel được tách theo cột không?
 
Lần chỉnh sửa cuối:
Làm theo cấu trúc file text của bạn, bạn thử code này:
PHP:
Sub gtext()
Dim str As String, spath As String, filetxt As Variant
Dim fso As Object, dic As Object, arr, i As Long
Set fso = CreateObject("scripting.filesystemobject")
Set dic = CreateObject("scripting.dictionary")
spath = "D:\Data_Logfile\"
filetxt = Dir(spath & "\*.txt")
arr = Range("H2:H" & [h1000000].End(xlUp).Row)
For i = 1 To UBound(arr)
    If Not dic.exists(arr(i, 1)) Then dic.Add arr(i, 1), ""
Next
Do While Len(filetxt) > 0
    If Not dic.exists(fso.GetBaseName(filetxt)) Then
        Open spath & filetxt For Input As #1
        Do Until EOF(1)
            Line Input #1, str
            [a1000000].End(xlUp).Offset(1).Resize(1, UBound(Split(str, vbTab)) + 1) = Split(str, vbTab)
            [h1000000].End(xlUp).Offset(1) = fso.GetBaseName(filetxt)
        Loop
        Close #1
    End If
    filetxt = Dir
Loop
Application.OnTime Now() + TimeValue("00:03:00"), "gtext"
End Sub
Mặc định thời gian refresh là 3 phút , nếu thay đổi bạn sửa lại chỗ Timevalue, đường dẫn mặc định là "D:\Data_Logfile\", nếu có thay đổi thì bạn sửa lại chỗ spath="D:\Data_Logfile\".
Cảm ơn bạn nhé. Mình đã thử được rồi.

Tuy nhiên bạn có thể giải thích cho mình đoạn code nào dùng để phân tách dữ liệu sau khi nhập vào Excel được tách theo cột không?
 
Cảm ơn bạn nhé. Mình đã thử được rồi.

Tuy nhiên bạn có thể giải thích cho mình đoạn code nào dùng để phân tách dữ liệu sau khi nhập vào Excel được tách theo cột không?
Chỗ Split(str, vbTab) bạn ạ, các cột trong txt cách nhau bởi dấu tab, khi dùng input cho từng line sẽ tạo ra chuỗi str nhưng vẫn cách nhau bởi tab(vbTab), dùng split để tách ra cột thôi, khi số cột thay đổi thì mảng arr và đoạn [h1000000].End(xlUp).Offset(1) cũng phải thay đổi theo để nhận biết không update lại dữ liệu đã có, tôi viết code cứng chỗ này bạn nên tùy biến để thay đổi, ví dụ khi số cột tăng lên 8 thì sửa thành
arr = Range("I2:I" & [I1000000].End(xlUp).Row)
[I1000000].End(xlUp).Offset(1) = fso.GetBaseName(filetxt)
 
Chỗ Split(str, vbTab) bạn ạ, các cột trong txt cách nhau bởi dấu tab, khi dùng input cho từng line sẽ tạo ra chuỗi str nhưng vẫn cách nhau bởi tab(vbTab), dùng split để tách ra cột thôi, khi số cột thay đổi thì mảng arr và đoạn [h1000000].End(xlUp).Offset(1) cũng phải thay đổi theo để nhận biết không update lại dữ liệu đã có, tôi viết code cứng chỗ này bạn nên tùy biến để thay đổi, ví dụ khi số cột tăng lên 8 thì sửa thành
arr = Range("I2:I" & [I1000000].End(xlUp).Row)
[I1000000].End(xlUp).Offset(1) = fso.GetBaseName(filetxt)
Cảm ơn bạn rất nhiều.

Nhờ bạn giúp đỡ thêm vấn đề này nữa:
Trong các file text, dòng đầu tiên có tiêu đề của dữ liệu.
Các file text rất giống nhau về tiêu đề này.
Làm thế nào để khi nhập dữ liệu vào excel thì giữ được tiêu đề này Và không bị lặp lại tiêu đề nhiều lần?
 

File đính kèm

  • Data_Logfile.rar
    758 bytes · Đọc: 4
Web KT
Back
Top Bottom