Páginas

lunes, 17 de febrero de 2014

VBA: Script para abrir excel y ejecutar una macro.

fuente

Dim xlApp
Dim xlBook

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open("C:\Tester.xls", 0, True) 'abre el archivo que contiene la macro.
xlApp.Run "Sample"
xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing
Se pega este texto en notepad y se guarda con la extension VBS

Luego de eso vamos a Inicio, todos los programas, accesorios, herramientas de sistema, tareas programadas. Y programamos la ejecucion de este script.


10 comentarios:

  1. Cual seria el procedimiento para hacer exactamente lo mismo pero en una macros de outlook?

    ResponderEliminar
  2. ¿Como ejecuto la macro con parámetros definidos?
    En mi vbs abro varios archivos excel y ejecuto las macros de todos los excels. El problema es que a todas las macros le debo enviar parametros de mes y semana (variable).
    Dentro del vbs genero un inputbox preguntando mes y semana. Estas son las variables que debo enviar

    Agradezco de antemano tu respuesta y disposición.

    Saludos. Federico

    ResponderEliminar
    Respuestas
    1. Hola Federico,
      Solo necesitarías agregar los parámetros separados por comas, así:

      xlApp.Run "TuMacro", "Argumento1", "Argumento2"

      Si tus argumentos son enteros, no uses comillas:

      xlApp.Run "TuMacro", 35,57

      Eliminar
  3. Buenas Tardes Ruben, como te va?
    me funciono tu codigo haciendo algunas modificaciones, ahora mi consulta seria, como puedo hacer para poder que excel me abra en primer plano y que el foco estee en el?, la verdad que no lo consigo.


    codigo que he mejorado del tuyo

    Dim xlApp
    Dim xlBook

    Set objShell = CreateObject("WScript.Shell")

    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("C:\Users\hola\Desktop\prueba_excel.xlsm", 0, false)

    xlApp.Visible = true
    xlApp.EnableEvents = True
    WScript.Sleep 3000

    objShell.SendKeys "%{F4}"
    objShell.SendKeys "%{D}"
    objShell.SendKeys "%{K}"
    objShell.SendKeys "%{T}"

    rem objShell.SendKeys "%{D}+%{K}+%{T}"
    WScript.Sleep 4000
    xlApp.Run "Sample"
    WScript.Sleep 4000
    objShell.SendKeys "%{A}+%{D}"
    xlBook.Save
    xlBook.Close
    xlApp.Quit
    WScript.Quit

    Set xlBook = Nothing
    Set xlApp = Nothing

    ResponderEliminar
  4. Estimado Ruben,
    Cuando corro el script me sale el excel como solo lectura, y como la macro es extensa me sale que el excel no responde, crees que el motivo sea porque sale solo lectura?

    Estaré atento a tus comentarios, gracias.

    ResponderEliminar
    Respuestas
    1. Cambiale el nombre y guárdalo con la extensión xlsm, debería funcionar.

      Eliminar
    2. Lo que sucede es que es un archivo xlsb, mi duda es que abre el archivo pero sale solo lectura. Una pregunta que significa el 0 en tu código

      Eliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. Que mas amigo Ruben, como va todo,

    tengo la siguiente consulta, he creado un script desde Sap, pero necesito traer unos datos desde excel ,

    los datos que quiero que me los tome desde la tabla de excel son ; el 2100 , el 3001010020 y el 53.

    session.findById("wnd[0]/usr/ctxtQL_WERKS-LOW").text = "2100"
    session.findById("wnd[0]/usr/ctxtQL_MATNR-LOW").text = "3001010020"

    session.findById("wnd[0]/usr/tabsUD_DATA/tabpBB/ssubSUB_UD_DATA:SAPMQEVA:0102/txtRQEVA-VMENGE01").text = "53"

    Este el el VBScript (.vbs) que grabe desde sap ;

    If Not IsObject(application) Then
    Set SapGuiAuto = GetObject("SAPGUI")
    Set application = SapGuiAuto.GetScriptingEngine
    End If
    If Not IsObject(connection) Then
    Set connection = application.Children(0)
    End If
    If Not IsObject(session) Then
    Set session = connection.Children(0)
    End If
    If IsObject(WScript) Then
    WScript.ConnectObject session, "on"
    WScript.ConnectObject application, "on"
    End If
    session.findById("wnd[0]").maximize
    session.findById("wnd[0]/tbar[0]/okcd").text = "/nqa32"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/usr/ctxtQL_ENSTD-LOW").text = ""
    session.findById("wnd[0]/usr/ctxtQL_ENSTD-HIGH").text = ""
    session.findById("wnd[0]/usr/ctxtQL_WERKS-LOW").text = "2100"
    session.findById("wnd[0]/usr/ctxtQL_MATNR-LOW").text = "3001010020"
    session.findById("wnd[0]/usr/ctxtQL_MATNR-LOW").setFocus
    session.findById("wnd[0]/usr/ctxtQL_MATNR-LOW").caretPosition = 10
    session.findById("wnd[0]/tbar[1]/btn[8]").press
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").currentCellColumn = ""
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectedRows = "0"
    session.findById("wnd[0]/tbar[1]/btn[41]").press
    session.findById("wnd[0]/usr/tabsUD_DATA/tabpBB").select
    session.findById("wnd[0]/usr/tabsUD_DATA/tabpBB/ssubSUB_UD_DATA:SAPMQEVA:0102/txtRQEVA-VMENGE01").text = "53"
    session.findById("wnd[0]/usr/tabsUD_DATA/tabpBB/ssubSUB_UD_DATA:SAPMQEVA:0102/txtRQEVA-VMENGE01").caretPosition = 2
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/usr/tabsUD_DATA/tabpFEHL").select
    session.findById("wnd[0]/usr/tabsUD_DATA/tabpFEHL/ssubSUB_UD_DATA:SAPMQEVA:0103/subUD_DATA:SAPMQEVA:1103/ctxtRQEVA-VCODE").setFocus
    session.findById("wnd[0]/usr/tabsUD_DATA/tabpFEHL/ssubSUB_UD_DATA:SAPMQEVA:0103/subUD_DATA:SAPMQEVA:1103/ctxtRQEVA-VCODE").caretPosition = 0
    session.findById("wnd[0]").sendVKey 4
    session.findById("wnd[1]/usr/btnSPOP-OPTION1").press
    session.findById("wnd[1]/usr/cntlTREE_CONTROL_AREA/shellcont/shell").selectItem " 3","1"
    session.findById("wnd[1]/usr/cntlTREE_CONTROL_AREA/shellcont/shell").ensureVisibleHorizontalItem " 3","1"
    session.findById("wnd[1]/usr/cntlTREE_CONTROL_AREA/shellcont/shell").doubleClickItem " 3","1"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/tbar[0]/btn[11]").press
    session.findById("wnd[0]/tbar[1]/btn[14]").press


    cabe anotar que la idea es que el vbs se repita hasta terminar las lineas del excel.

    un abrazo!

    ResponderEliminar
  7. Buenas tardes. necesito guardar en una carpeta los adjuntos recibidos y cambiarle el nombre por el del asunto del mensaje.

    Public Sub saveAttachtoDisk (itm As Outlook.MailItem)
    Dim objAtt As Outlook.Attachment
    Dim saveFolder As String
    saveFolder = "C:Archivos"
    For Each objAtt In itm.Attachments
    objAtt.SaveAsFile saveFolder & "" & objAtt.DisplayName
    Set objAtt = Nothing
    Next
    End Sub
    esto hace todo pero no me cambia el nombre del adjunto, no se como seguir Ayuda

    ResponderEliminar