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

我正在试图找到一种方法,通过excel VBA读取.txt中的第一行文本,而不打开该文件,这是我一直很难找到的,因为我看到的所有示例都涉及以某种方式打开.txt

除此之外,我想知道是否有任何方法可以让VBA代码在excel关闭后的设定时间内删除提到的.txt。。。我不太确定这是否有可能(至少用VBA)

编辑:

简化代码如下所示:

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:”并返回字符串
如果您的文件可能在第一行的其他地方包含字符串“1:”

  • 我们可以使用Right()函数:returnright(output,Len(output)-2)
  • 或者我们可以使用另一个命令行,将这些行编号为“[1]”:

    • 查找/N“C:\test.txt |查找“[1]”

如果Excel中的VBA已关闭,则无法在Excel中运行它。您可能可以通过计划任务使用VBScript。为什么不能打开文本文件?@Rory,因为我想在许多文件中循环使用它,打开/关闭每个文件所花费的时间最终累积为浪费的分钟。因为我不想编辑数据,而只是提取数据,所以不知道是否可以不打开文件就直接读取文件。如果不打开文件,则无法从逻辑上读取文件;如果共享读取代码,则可能需要解释为什么删除文件会有助于改进suggested@AlexK.编辑了条目并添加了我的代码的简化版本(在将文本输入excel时需要考虑大量变量)。我会尝试将文件循环加载到数组中,然后在工作表上执行单个更新:
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