Vba 在不打开文件的情况下读取文件并将其删除
我正在试图找到一种方法,通过excel VBA读取.txt中的第一行文本,而不打开该文件,这是我一直很难找到的,因为我看到的所有示例都涉及以某种方式打开.txt 除此之外,我想知道是否有任何方法可以让VBA代码在excel关闭后的设定时间内删除提到的.txt。。。我不太确定这是否有可能(至少用VBA) 编辑: 简化代码如下所示:Vba 在不打开文件的情况下读取文件并将其删除,vba,excel,Vba,Excel,我正在试图找到一种方法,通过excel VBA读取.txt中的第一行文本,而不打开该文件,这是我一直很难找到的,因为我看到的所有示例都涉及以某种方式打开.txt 除此之外,我想知道是否有任何方法可以让VBA代码在excel关闭后的设定时间内删除提到的.txt。。。我不太确定这是否有可能(至少用VBA) 编辑: 简化代码如下所示: Option Explicit Public g_strVar As String Sub Test_Proc() Dim row as Long
Option Explicit
Public g_strVar As String
Sub Test_Proc()
Dim row as Long
row = 2
Do While Cells(row, 1) <> ""
Cells(row, 2) = ImportVariable(Cells(row, 1))
row = row + 1
Loop
End Sub
Function ImportVariable(strFile As String) As String
Open strFile For Input As #1
Line Input #1, ImportVariable
Close #1
End Function
选项显式
作为字符串的公共g_字符串
子测试程序()
暗排一样长
行=2
“执行While单元格(第1行)”“
单元格(第2行)=输入变量(单元格(第1行))
行=行+1
环
端接头
函数ImportVariable(strFile作为字符串)作为字符串
打开strFile作为#1输入
行输入#1,输入变量
关闭#1
端函数
第1列包含每个.txt文件的位置,在其旁边的列中,我必须详细说明每个文件的第一行文本。问题是,该列表已经出现过几次,大约有10K长,我能想到的唯一可以提高执行时间的地方是“打开/关闭”,因为其中一些.txt文件大小为12.000 KB,需要一点时间才能打开。这可能比打开每个文件更快(在0.1953125秒内读取18.5 Mb文件的第一行)
位嵌套,但它执行以下操作:
- CMD/C-打开命令行窗口,完成后关闭
- FindStr/N.C:\test.txt-查找任意字符,并以格式“1:”输出带有行号的行
- |FindStr ^1:-重定向到另一个FindStr,该FindStr使用正则表达式在行首查找“1:”
- 命令行完成后,将输出返回到Replace函数
- Replace删除“1:”并返回字符串
- 我们可以使用Right()函数:returnright(output,Len(output)-2)
- 或者我们可以使用另一个命令行,将这些行编号为“[1]”:
- 查找/N“C:\test.txt |查找“[1]”
Range(“B1:B”&row)。Value=Application.Transpose(arry)
,因为为每个文件更新工作表会花费一些时间
Option Explicit
Dim cmdLine As Object
Sub Test_Proc()
Dim i As Long, minRow As Long, maxRow As Long, rng1 As Range, rng2 As Range
Dim t As Double, ws As Worksheet, x As Variant, col1 As Variant, col2 As Variant
Set ws = ThisWorkbook.Worksheets(1)
minRow = 2
With ws
.Columns(2).Delete
maxRow = .UsedRange.Rows.Count
Set rng1 = .Range("A1:A" & maxRow)
Set rng2 = .Range("B1:B" & maxRow)
End With
col1 = rng1.Value2: col2 = rng2.Value2
Set cmdLine = CreateObject("WScript.Shell")
Application.ScreenUpdating = False
t = Timer
For i = minRow To maxRow
If Len(col1(i, 1)) > 0 Then
ws.Cells(i, 2).Value2 = Replace(ImportLine(col1(i, 1)), vbCrLf, vbNullString)
End If
Next
'rng2.Value2 = col2
Application.ScreenUpdating = True
InputBox "Duration: ", "Duration", Timer - t '18.5 Mb file in 0.1953125 sec
End Sub
Function ImportLine(ByVal strFile As String) As String
ImportLine = Replace(cmdLine.Exec( _
"%comspec% /C FindStr /N . " & strFile & " | FindStr ^1:" _
).STDOut.ReadAll, "1:", vbNullString)
End Function