Excel VBA和windows命令提示符

Excel VBA和windows命令提示符,excel,vba,find,errorlevel,wscript.shell,Excel,Vba,Find,Errorlevel,Wscript.shell,如果我在windows命令提示符中键入: Find "Foo" "D:\test.txt" | ECHO %ERRORLEVEL% Find "End" "D:\test.txt" | ECHO %ERRORLEVEL% 我得到了9009首先,您可能需要等待wscript来完成命令的执行,所以我会尝试这样的方法 Sub test() Dim cmdLine As Object Dim result As Object Set cmdLine = CreateObj

如果我在windows命令提示符中键入:

Find "Foo" "D:\test.txt" | ECHO %ERRORLEVEL%
Find "End" "D:\test.txt" | ECHO %ERRORLEVEL%

我得到了9009首先,您可能需要等待
wscript
来完成命令的执行,所以我会尝试这样的方法

Sub test()

    Dim cmdLine As Object
    Dim result As Object

    Set cmdLine = CreateObject("WScript.Shell")

    Set result = cmdLine.Exec("%comspec% /C Find ""End of Report"" ""D:\test.csv"" | ECHO %ERRORLEVEL%")

    Do While result.Status = 0
        Application.Wait Now + TimeValue("00:00:01")
    Loop


    Debug.Print result.stderr.readall(), result.stdout.readall()

End Sub
为了查看命令是否真的有效,您可以删除
ECHO%ERRORLEVEL%
,然后您将得到
stdout
resp<代码>标准代码

Sub testA()

    Dim cmdLine As Object
    Dim result As Object

    Set cmdLine = CreateObject("WScript.Shell")

    Set result = cmdLine.Exec("%comspec% /C Find ""End of Report"" ""D:\test.csv""")

    Do While result.Status = 0
        Application.Wait Now + TimeValue("00:00:01")
    Loop


    Debug.Print result.stderr.readall(), result.stdout.readall()

End Sub
更新:如果您只需要在文件中查找特定文本,可以使用以下方法

Sub TestC()
    Debug.Print inFile("D:\Test.csv", "End of Report")
End Sub

Function inFile(fileName As String, searchText As String) As Boolean

    Dim fileContent As String
    Dim fileNo As Long
    fileNo = FreeFile
    Open fileName For Input As #fileNo
    fileContent = Input(LOF(fileNo), fileNo)
    Close #fileNo

    If InStr(1, fileContent, searchText, vbTextCompare) > 0 Then
        inFile = True
    Else
        inFile = False
    End If

End Function
更新2:根据评论,以下方法可能是您问题的解决方案

Sub TestD()
    Dim fileName As String
    fileName = "D:\Test.csv"
    If Not IsFileOpen(fileName) Then
        Debug.Print inFile(fileName, "End of Report")
    End If
End Sub

Function inFile(fileName As String, searchText As String) As Boolean

    Dim fileContent As String
    Dim fileNo As Long
    fileNo = FreeFile
    Open fileName For Input As #fileNo
    fileContent = Input(LOF(fileNo), fileNo)
    Close #fileNo

    If InStr(1, fileContent, searchText, vbTextCompare) > 0 Then
        inFile = True
    Else
        inFile = False
    End If

End Function


Function IsFileOpen(fileName As String)
    Dim filenum As Integer, errnum As Integer

    On Error Resume Next   ' Turn error checking off.
    filenum = FreeFile()   ' Get a free file number.
    ' Attempt to open the file and lock it.
    Open fileName For Input Lock Read As #filenum
    Close filenum          ' Close the file.
    errnum = Err           ' Save the error number that occurred.
    On Error GoTo 0        ' Turn error checking back on.

    ' Check to see which error occurred.
    Select Case errnum

        ' No error occurred.
        ' File is NOT already open by another user.
        Case 0
         IsFileOpen = False

        ' Error number for "Permission Denied."
        ' File is already opened by another user.
        Case 70
            IsFileOpen = True

        ' Another error occurred.
        Case Else
            Error errnum
    End Select

End Function

上面的代码始终返回0是否有更好的地方发布此消息?请尝试
Dim result As Variant
,以及
STDOut.ReadAll()
?如果
Find“Foo”D:\test.txt“| ECHO%ERRORLEVEL%
,我无法确认是否得到9009。对于
Find“Foo”D:\test.txt“| ECHO%ERRORLEVEL%
Find“End”D:\test.txt,我总是得到
0
| ECHO%ERRORLEVEL%
我不是批处理编程专家,我只是说
Find
命令在两种情况下都会在我的计算机上返回
0
,在您的计算机上似乎也是如此。我复制了第一段代码并粘贴了它。。。没有修改。。。但它再次返回0。。。我把“报告结束”改为“你好”,它应该找不到。。。但它仍然返回0虽然只返回一个0。。。如果这意味着什么……是的,正如我在上面的评论中所说的,
errorlevel
似乎总是
0
。如果您尝试文章中的第二个代码,您将看到您确实会得到
stdout
。因此,似乎
ind“报告结尾”D:\test.csv“| ECHO%ERRORLEVEL%
是问题制造者。我很困惑。。。我基本上是想得到一个真/假或1/0…是的,这是正确的,但它返回stdout,对吗?我将用不同的方法更新帖子,以防你只需要在文件中搜索某个字符串。
Sub TestD()
    Dim fileName As String
    fileName = "D:\Test.csv"
    If Not IsFileOpen(fileName) Then
        Debug.Print inFile(fileName, "End of Report")
    End If
End Sub

Function inFile(fileName As String, searchText As String) As Boolean

    Dim fileContent As String
    Dim fileNo As Long
    fileNo = FreeFile
    Open fileName For Input As #fileNo
    fileContent = Input(LOF(fileNo), fileNo)
    Close #fileNo

    If InStr(1, fileContent, searchText, vbTextCompare) > 0 Then
        inFile = True
    Else
        inFile = False
    End If

End Function


Function IsFileOpen(fileName As String)
    Dim filenum As Integer, errnum As Integer

    On Error Resume Next   ' Turn error checking off.
    filenum = FreeFile()   ' Get a free file number.
    ' Attempt to open the file and lock it.
    Open fileName For Input Lock Read As #filenum
    Close filenum          ' Close the file.
    errnum = Err           ' Save the error number that occurred.
    On Error GoTo 0        ' Turn error checking back on.

    ' Check to see which error occurred.
    Select Case errnum

        ' No error occurred.
        ' File is NOT already open by another user.
        Case 0
         IsFileOpen = False

        ' Error number for "Permission Denied."
        ' File is already opened by another user.
        Case 70
            IsFileOpen = True

        ' Another error occurred.
        Case Else
            Error errnum
    End Select

End Function