programación - Ejecutando archivo VBScript desde macros VBA de Excel
visual basic excel 2013 (1)
Necesito algunos ejemplos de Excel vba, donde con el código VBA (Macro de Excel) podría llamar a un VBScript y obtendré algunos valores como el nombre de archivo y la información del directorio de vbscript y los asignaré a las variables en código VBA. Gracias de antemano
Algo como esto
Macro VBA:
Sub Foo2Script
Dim x As Long
x=2
''Call VBscript here
MsgBox scriptresult
End Sub
VBScript:
Dim x, y ,Z
x = x_from_macro
y = x + 2
Z = X+Y
scriptresult = y,Z
Se puede hacer, pero tendría que estar de acuerdo con Tomalak y otros en que no es la mejor manera de hacerlo. Sin embargo, dicho esto, VBScript puede hacer maravillas ocasionalmente si lo usa como una especie de mecanismo de disparo y olvido. Se puede usar con bastante eficacia para simular el multi-threading en VBA por lo que descompone la carga útil y la distribuye a VBScripts individuales para que se ejecuten de forma independiente. Por ejemplo, podría organizar un "enjambre" de VBScripts individuales para la descarga masiva de sitios web en segundo plano, mientras que VBA continúa con otro código.
A continuación se muestra un código de VBA que he simplificado para mostrar lo que se puede hacer y escribe un simple VBScript sobre la marcha. Normalmente prefiero ejecutarlo usando ''wshShell.Run """" & SFilename & """"
que significa que puedo olvidarlo pero he incluido en este ejemplo este método Set proc = wshShell.exec(strexec)
que permite una prueba del objeto para completar
Pon esto en MODULE1
Option Explicit
Public path As String
Sub writeVBScript()
Dim s As String, SFilename As String
Dim intFileNum As Integer, wshShell As Object, proc As Object
Dim test1 As String
Dim test2 As String
test1 = "VBScriptMsg - Test1 is this variable"
test2 = "VBScriptMsg - Test2 is that variable"
''write VBScript (Writes to Excel Sheet1!A1 & Calls Function Module1.ReturnVBScript)
s = s & "Set objExcel = GetObject( , ""Excel.Application"") " & vbCrLf
s = s & "Set objWorkbook = objExcel.Workbooks(""" & ThisWorkbook.Name & """)" & vbCrLf
s = s & "Set oShell = CreateObject(""WScript.Shell"")" & vbCrLf
s = s & "Msgbox (""" & test1 & """)" & vbCrLf
s = s & "Msgbox (""" & test2 & """)" & vbCrLf
s = s & "Set oFSO = CreateObject(""Scripting.FileSystemObject"")" & vbCrLf
s = s & "oShell.CurrentDirectory = oFSO.GetParentFolderName(Wscript.ScriptFullName)" & vbCrLf
s = s & "objWorkbook.sheets(""Sheet1"").Range(""" & "A1" & """) = oShell.CurrentDirectory" & vbCrLf
s = s & "Set objWMI = objWorkbook.Application.Run(""Module1.ReturnVBScript"", """" & oShell.CurrentDirectory & """") " & vbCrLf
s = s & "msgbox(""VBScriptMsg - "" & oShell.CurrentDirectory)" & vbCrLf
Debug.Print s
'' Write VBScript file to disk
SFilename = ActiveWorkbook.path & "/TestVBScript.vbs"
intFileNum = FreeFile
Open SFilename For Output As intFileNum
Print #intFileNum, s
Close intFileNum
DoEvents
'' Run VBScript file
Set wshShell = CreateObject("Wscript.Shell")
Set proc = wshShell.exec("cscript " & SFilename & "") '' run VBScript
''could also send some variable
''Set proc = wsh.Exec("cscript VBScript.vbs var1 var2") ''run VBScript passing variables
''Wait for script to end
Do While proc.Status = 0
DoEvents
Loop
MsgBox ("This is in Excel: " & Sheet1.Range("A1"))
MsgBox ("This passed from VBScript: " & path)
''wshShell.Run """" & SFilename & """"
Kill ActiveWorkbook.path & "/TestVBScript.vbs"
End Sub
Public Function ReturnVBScript(strText As String)
path = strText
End Function
Esto demostró varias formas en que las variables pueden transmitirse.