Wątek przeniesiony 2021-01-28 13:32 z Inne języki programowania przez cerrato.

Exit code w VB - jak działa?

0

Cześć,

mam macro w Excelu:

Sub CreateAfile(Optional inputfolder, Optional outputfolder, Optional ExitCode)

    Dim fs As Object
    Dim a As Object

    Set fs = CreateObject("Scripting.FileSystemObject")
    
   '' inputfolder = "C:\Users\admin\Desktop\Newest Pull request\VBScriptTests\input\"
    
    If Len(Dir(inputfolder, vbDirectory)) = 0 Then
        MkDir inputfolder
    End If
    
  ''  outputfolder = "C:\Users\admin\Desktop\Newest Pull request\VBScriptTests\output\"
    
    If Len(Dir(outputfolder, vbDirectory)) = 0 Then
        MkDir outputfolder
    End If
    
    Set a = fs.CreateTextFile(inputfolder & "test.txt", True)
    a.WriteLine ("This is a test.")
    a.Close
    
    fs.CopyFile inputfolder & "test.txt", outputfolder
    
    If Len(ExitCode) = 0 Then
        ExitCode = 0
    End If

End Sub

proste makro.

I teraz mam VBSript:

Option Explicit

On Error Resume Next

ExcelMacroIntegration

Sub ExcelMacroIntegration()

Dim exitCode
Dim inputFolder 
Dim outputFolder

inputFolder = "C:\Users\admin\Desktop\Newest Pull request\VBScriptTests\input\"
outputFolder = "C:\Users\admin\Desktop\Newest Pull request\VBScriptTests\output\"

Dim xlApp
Dim XlBook
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("C:\Users\admin\Desktop\Newest Pull request\VBScriptTests\Book1.xlsm", 0, True)
xlApp.Visible = True
xlApp.Run "CreateAfile", inputFolder, outputFolder, exitCode
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing

wscript.Quit(exitCode)

End Sub

gdzie mam exitCode jako parameter.
I to co mam w excelu w makrze zostanie przekazane dalej .

Czyli jak mam ExitCode = 2 w Excelu to wscript.quit(exitCode) to tutaj ExitCode = 2 również.
Dlaczego?

W excelu to nie funkcja zwracajaca argument tylko procedura Sub...

Aby przetestować uzywam innego vbscripta:

Set oWS = WScript.CreateObject("WScript.Shell")
returnCode = oWS.Run("wscript.exe RunTest.vbs", 0, True)
MsgBox "Script2's Return Code: " & returnCode

PRośba o wyjaśnienie dlaczego to działa?

2

Nie wiem jak to się ma do automatyzowania Excel'a, ale wszystkie parametry które przekazujesz do funkcji/procedury są przekazywane przez referencje, czyli jeżeli ciało zmienia wartość takiej zmiennej to jest to "widoczne na zewnątrz".

Więc jeżeli w Twoim przypadku CreateAfile zmienia wartość exitCode to ta zmiana jest "widoczna" w skrypcie VBS.

Jak przekażesz przez wartość exitCode:

Sub CreateAfile(Optional inputfolder, Optional outputfolder, Optional ByVal ExitCode)

To zmiana w procedurze nie zmieni wartości w VBScript.

dodatkowo to czy parametr został przekazany sprawdzasz isMissing, anie LEN

3

@Panczo, z tym przekazywaniem przez referencję, to nie do końca jest prawdą, co napisałeś.... Wsyzstko zależy od ... sposobu przekazania zmiennej.

Sub x(ByRef wartosc As Long)
wartosc = 2
End Sub

Sub test()
Dim liczba As Long

liczba = 0
x liczba

Debug.Print liczba

liczba = 0
x (liczba)

Debug.Print liczba

End Sub

Jeśli dasz parametr w nawiasach, to zostanie przyjęty ByVal :) niezależnie od deklaracji nagłówka.

0

@Marcin.Miga: tego mówiąc szczerze nie wiedziałem, ale rozbudowując to z nawiasami też się da byref

Sub x(ByRef wartosc As Long)
wartosc = 2
End Sub

Sub test()
Dim liczba As Long

liczba = 0
x liczba

Debug.Print liczba

liczba = 0
x (liczba)

Debug.Print liczba

liczba = 0
Call  x(liczba)

Debug.Print liczba
End Sub

O tym z nawiasami dokumentacja nie wspomina: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/sub-statement

Zresztą dokumentacja wspomina, że nawiasów używasz tylko jak użyjesz call

Call Optional; keyword. If specified, you must enclose argumentlist in parentheses.

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/call-statement

Jak na to wpadłeś, ja nie używam praktycznie VBA Excelowego więc to dla mnie nowość?

0

@Panczo: a sprawdz: Call x((liczba)) ... W domu nie mam office ;)

1

Zwraca 0...

Pogooglałem trochę i znalazłem opis takiego działania w dokumentacji ale vb.net: How to: Force an Argument to Be Passed by Value (Visual Basic)

I to pasuje do VBA, bo już zapis, dla zmodyfikowanej funkcji:

Sub x(ByRef wartosc As Long, ByRef x As Integer)
wartosc = 2
End Sub

wywali błąd: Microsoft Visual Basic for Applications Compile error: Expected: =

x (liczba,x)

zapis z nawiasami będzie ok:

x (liczba), (x)

Wychodzi, że to nie bug a "ficzer"

1 użytkowników online, w tym zalogowanych: 0, gości: 1