将批处理文件命令放入VBA Excel

时间:2012-12-11 06:45:06

标签: vba excel-vba batch-file excel

这是批处理文件代码:

@echo off >summary.txt (
    for %%F in (*chkpackage.log) do findstr /l %1 "%%F" nul||echo %%  F:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A:N/A)

以下是调用批处理文件的VBA Excel中的代码:

FileSet = Sheet1.Range("C13")
txtFpath = Sheet1.Range("C7").Value
FilePath = txtFpath & "\res.bat"

ChDrive "D"
RSP = Shell(Environ$("COMSPEC"), vbNormalFocus)
Application.Wait Now + TimeValue("00:00:03")
SendKeys "CD " & txtFpath & "{ENTER}", True
Application.Wait Now + TimeValue("00:00:03")
SendKeys "start " & FilePath & " " & FileSet & "{ENTER}", True
Application.Wait Now + TimeValue("00:00:03")
SendKeys "exit " & "{ENTER}", True
Application.Wait Now + TimeValue("00:00:03")
SendKeys "exit " & "{ENTER}", True

但我不想使用批处理文件。我想将其更改为在VBA上使用的命令。 所以我只能使用VBA并运行命令行,而不是使用VBA来调用批处理和命令行。

简单的解释是我想将批处理文件中的命令放入Excel-VBA并使用VBA调用cmd运行它并自动将该命令输入到cmd代码Sendkeys代码。

1 个答案:

答案 0 :(得分:3)

您可以添加Microsoft Scripting Runtime(来自VBA IDE的工具 - >参考)的引用,该引用提供FileSystemObject并允许您执行以下操作:

Dim fso As New FileSystemObject
Dim fle As Variant
For Each fle In fso.GetFolder(txtFpath).Files
    'processing here
Next

您可以使用Like运算符将文件限制为特定模式:

For Each fle In fso.GetFolder(txtFpath).Files
    If fle.Name Like "*chkpackage.log" Then
        'processing here
    End If
Next

您可以使用OpenAsTextStream方法获取TextStream对象,使用 ReadAll 方法读取文件内容:

For Each fle In fso.GetFolder(txtFpath).Files
    If fle.Name Like "*chkpackage.log" Then
        Dim txt As TextStream, contents As String
        Set txt = fle.OpenAsTextStream(ForReading)
        contents = txt.ReadAll
        txt.Close

        'process contents of file here
    End If
Next

在解析之前,您可以使用Split(contents, vbCrLf)将内容拆分为一个行数组(如果行分隔符是Unix / Mac而不是Windows,则使用vbLfvbCr

或者,您可以使用ReadLine方法逐行读取文件。您需要检查AtEndOfStream属性,以确保您没有尝试读取文件的末尾:

'Within the For Each loop
Dim txt As TextStream, currentLine As String
Set txt = fle.OpenAsTextStream(ForReading)
Do While Not txt.AtEndOfStream
    currentLine = txt.ReadLine

    'process current line here
Loop
txt.Close