sábado, 29 de octubre de 2016

Como construir una macro para conectar Excel y SAP y automatizar tareas - Ejemplo 1

Lo prometido es deuda y el día de hoy es el momento de cumplir con lo dicho. Hace tiempo había prometido un post con los pasos básicos para poder aprovechar nuestro ERP SAP, el poder del vba y la flexibilidad y funcionalidad del excel. Como? Por medio de la construcción de una macro que nos permita conectar SAP con excel, aprovechando un API que trae el primero de los dos. Esta macro, nos puede servir para administrar datos maestros, para ingresar información transaccional a nuestro sistema o para generar un reporte que no tengamos a la mano. Lo más importante de todo esto, es que trabajemos inicialmente en nuestro sistema de pruebas (calidad), construyamos, probemos y ajustemos hasta obtener los resultados deseados. 

Todo esto es necesario, porque al igual que como lo mencioné en el post sobre LSMW, lo que haga nuestra macro en el sistema, en especial si es utilizando las transacciones terminadas en 01 o 02 que por lo general son para crear y modificar.

Si creamos una macro para crear proveedores y esta queda mal, el dato maestro en el sistema va a quedar también mal y al final va a generar re-procesos, costos innecesarios y fricciones internas en la empresa y con terceros.

A nadie le gusta escuchar que el pago que esta esperando no se pudo realizar por un error en la configuración de los datos con los que fue creado en el sistema.

Vamos a seguir entonces, una serie de pasos, que después vamos a revisar estén grabados en el script de SAP y de ahí vamos a extraer la información, pegarla en un módulo de macros y realizar unos pequeños ajustes.

Paso 1: Estando en SAP, vamos a activar el grabador de scripts de SAP. Esto lo hacemos dando clic en el último botón de nuestra barra de herramientas (el que esta resaltado por la flecha azul):




Paso 2: Seleccionamos la opción Grabar y reproducir script:





Paso 3: Al hacerlo, va a aparecer un cuadro de dialogo como el que vemos en la figura siguiente y todo lo que tenemos que hacer para iniciar la grabación es dar clic en el botón de grabar (el del circulo rojo):




Paso 4: Ingresamos la transacción que vamos a utilizar, en este ejemplo, vamos a trabajar con una transacción de centros de costos, más exactamente con la de consulta KS03:




Paso 5: Ingresamos un centro de costos válido y le damos enter:




Paso 6: Damos un clic en el campo Área de jerarquía:



Paso 7: Vamos a detener la grabación con el botón stop (cuadrado amarillo) del mismo cuadro de diálogo con el que iniciamos la grabación. 

Paso 8: Vamos a editar el script creado. Este queda guardado en la ruta que podemos ver en el mismo cuadro de dialogo del paso anterior. Para editar el script debemos dar clic derecho sobre el archivo y seleccionar editar y vamos a ver lo siguiente:




Paso 10: Vamos a copiar todo el código y nos lo vamos a llevar para el editor de vba:



En el código que de la imagen anterior ya incluimos la declaración de variables necesarias para que el código funcione ( las dos primeras líneas).

Si revisamos el código con detenimiento, después de la declaración de las dos variables, los condicionales if que siguen se encargan de realizar las respectivas conexiones y verificación de sesión en SAP.

Después de estos viene lo mas interesante. Si recuerdan, la transacción que usamos fue la KS03, la cual aparece claramente en nuestro script:




Luego de ingresar la transacción dimos enter, y esto también quedó capturado en la grabación del script:



Y estando dentro de la KS03 ingresamos nuestro centro de costos y dimos enter:




Por último dimos clic en el campo de jerarquía:


En esta última línea e código cambiamos SetFocus por Text. SetFocus es para ubicarnos en ese objeto, mientras que Text nos devuelve el texto contenido en el objeto, en este caso: 3101.

Adicional a la última linea grabada, incluimos una para capturar el texto del campo descripción:




Si nos fijamos bien, estas dos últimas líneas tienen la información técnica del campo, la cual también podemos ver con F1 cuando estamos parados en el mismo. Es decir, si estando en SAP damos clic en el área de jerarquía y después damos F1, vamos a ver esto:






Y dando clic en el 4to boton:



Para finalizar, estando en SAP, en la pantalla inicial, vamos a correr nuestra macro paso a paso con F8: cuando lleguemos a las dos últimas filas, podemos verificar que se esta almacenando en las dos variables:




Como pueden ver, Excel se ha conectado con SAP y ha logrado extraer y almacenar el contenido de los dos campos. Que sigue después de esto? Pues podemos crear una macro para crear un objeto de datos maestros en nuestro sistema, o modificar uno o varios objetos. Ya sabemos que con un for en vba podemos hacer que se repita la misma tarea cuantas veces queramos, asi que podemos tener por filas en excel la información que queremos agregar a SAP y mediante una macro hacer que se repita el código para cada línea. 

Plus: Las líneas de código que graba SAP también las podemos pegar en Java!!!

78 comentarios:

  1. Hola, no veo la opcion para grabar el script en sap. excel debe tener habilitado algo extra? hago cambios masivos en la BD y esta opcion es lo que estoy buscando. tal ve soy un usuario "restringido" o "limitado", pero quiero hacer mas eficiente mi trabajo y de lograrlo proponerlo y asi mejorar el de varios de mis compañeros. de no poder por mis permisos, que otra opcion me sugieres?

    ResponderBorrar
    Respuestas
    1. Hola draki, en efecto, si no puedes ver el botón de grabar es porque no tienes los permisos necesarios en tu perfil de usuario. Otra alternativa es utilizar LSMW, para usarla puedes ver el siguiente post: http://eduardoalzate.blogspot.com.co/2016/07/herramientas-para-administrar-datos.html Aunque creo que si no tienes permisos para los scripts seguramente no tendrás los permisos para LSMW. Por último, creo que si puedes automatizar muchas de tus tareas con la herramienta Data Load: http://dataload.com/downloads/spreadsheets/index.html En la página puedes encontrar incluso macros que ya grabaron otros usuarios y que ya fueron probadas. Es intuitiva, práctica y no requiere conocimientos avanzados en programación.

      Borrar
    2. muchas gracias, consultare lo que me das y hare algunas pruebas. muchas gracias.

      Borrar
    3. Hola me sirvió mucho tu post, tengo otras preguntas ojala puedas ayudarme, consiste en saber como manejar las alertas o mensajes de error que genera sap y que no permite seguir la secuencia de algo "normal" en el proceso de interacción con sap, ejemplo mucho de lo que tengo q hacer tiene que ver con la extension de vistas en sap, la mm01, a veces tengo que cambiar la configuración del material pero en ocasiones la previa configuracion del material no arroja el mismo procedimiento, para ser mas claro, un numero x tiene 4 vistas listas pero ahora como voy a cambiar de tipo de material tengo q extenderle otras 3 mas, el problema es q no siempre se cuales si tiene y cuales no, entonces cuando intento extender selecciono el total de vistas q deseo extender y solo "lleno" las que les falta algo de informacion, estas vistas son variables segun la configuracion anterior. no se si me explique?

      Borrar
    4. Hola draki,

      Actualmente estoy en la misma situación que tu quiero hacer mas eficiente mi trabajo y tampoco tengo autorización para poder grabar en SAP, me gustaría preguntar si tienes códigos que te pudieron servir para que Excel pueda abrir SAP y abrir transacciones para obtener datos.

      Cualquier ayuda es bienvenida.

      Saludos !!!

      Borrar
  2. Hola buenos días:
    Me gustaría que me explicara cómo añadir una rutina repetitiva.
    Ya tengo la macro creada y funciona pero me falta que una vez terminado el proceso de la primera línea de la columna A1 posición 1 del Excel,pase a la posición 2 y haga el mismo proceso, luego a la posición 3 y haga el mismo preciso y así sucesivamente.

    Muchas gracias por su excelente trabajo.

    Un saludo

    ResponderBorrar
    Respuestas
    1. Hola, te felicito por tener creada tu primera macro que se conecta a SAP. Lo que debes hacer es utilizar la palabra reservada de VBA: for. Esta sirve para realizar iteraciones. Fijate en el código de esta otra macro: http://eduardoalzate.blogspot.com.co/2016/11/macro-para-conectar-excel-y-sap-y.html

      Si no lo logras resolver, dejame un mensaje con el código que escribiste y yo te respondo con el código ajustado.

      Saludos,

      Borrar
  3. Hola buenos días.

    Siento molestar de nuevo pero no consigo ver el error. Tengo que decir en contra mía que no tengo ni idea de macros y hazte hace 3 años no he tenido ni ordenador. En la línea que Marco en rojo entre comillas está el número de nota y ese campo es que quiero modificar para que cogiera del Excel las notas de la casilla A sucesivamente. Si tiene alguna duda y quiere le puedo enviar un privado con la macro.

    Muchas gracias.
    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 = "VL03N"

    session.findById("wnd[0]").sendVKey 0

    session.findById("wnd[0]/usr/ctxtLIKP-VBELN").Text = "4100473042"

    session.findById("wnd[0]/usr/ctxtLIKP-VBELN").caretPosition = 10

    session.findById("wnd[0]/mbar/menu[0]/menu[6]").Select

    session.findById("wnd[1]/usr/tblSAPLVMSGTABCONTROL").getAbsoluteRow(0).Selected = True

    session.findById("wnd[1]/tbar[0]/btn[6]").press

    session.findById("wnd[2]/usr/ctxtNAST-LDEST").Text = "LOCL"

    session.findById("wnd[2]/usr/txtNAST-ANZAL").Text = "1"

    session.findById("wnd[2]/usr/txtNAST-TDRECEIVER").Text = "TALAVERJ"

    session.findById("wnd[2]/usr/txtNAST-TDRECEIVER").SetFocus

    session.findById("wnd[2]/usr/txtNAST-TDRECEIVER").caretPosition = 8

    session.findById("wnd[2]/tbar[0]/btn[0]").press

    session.findById("wnd[1]/tbar[0]/btn[86]").press

    session.findById("wnd[0]").sendVKey 12

    End Sub

    ResponderBorrar
  4. No lo ha marcado en rojo el número de nota es:
    4100473042

    ResponderBorrar
    Respuestas
    1. Ok, escribelo de la siguiente forma:

      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

      for i = 1 to 10
      session.findById("wnd[0]").maximize

      session.findById("wnd[0]/tbar[0]/okcd").Text = "VL03N"

      session.findById("wnd[0]").sendVKey 0

      session.findById("wnd[0]/usr/ctxtLIKP-VBELN").Text = range("A" & i)

      session.findById("wnd[0]/usr/ctxtLIKP-VBELN").caretPosition = 10

      session.findById("wnd[0]/mbar/menu[0]/menu[6]").Select

      session.findById("wnd[1]/usr/tblSAPLVMSGTABCONTROL").getAbsoluteRow(0).Selected = True

      session.findById("wnd[1]/tbar[0]/btn[6]").press

      session.findById("wnd[2]/usr/ctxtNAST-LDEST").Text = "LOCL"

      session.findById("wnd[2]/usr/txtNAST-ANZAL").Text = "1"

      session.findById("wnd[2]/usr/txtNAST-TDRECEIVER").Text = "TALAVERJ"

      session.findById("wnd[2]/usr/txtNAST-TDRECEIVER").SetFocus

      session.findById("wnd[2]/usr/txtNAST-TDRECEIVER").caretPosition = 8

      session.findById("wnd[2]/tbar[0]/btn[0]").press

      session.findById("wnd[1]/tbar[0]/btn[86]").press

      session.findById("wnd[0]").sendVKey 12

      next i

      End Sub

      Para que lo tengas en cuenta, la linea for i = 1 to 10 va a realizar 10 iteraciones, la variable i va a ir tomando el valor de 1 hasta 10. Eso es lo que nos va a permitir leer las celdas de excel. Si tienes 50 datos, lo modificas asi: for i = 1 to 50. Si los datos inician en la tercera fila: for i = 3 to 50.

      La linea: session.findById("wnd[0]/usr/ctxtLIKP-VBELN").Text = range("A" & i) Lo que hace es que en vez de dejar siempre el valor: 4100473042, lee el contenido de la celda, A1, luego la de A2 ... hasta llegar a A10 ( todo depende del valor que le asignes al for). Por último, la línea next i, cierra el for. Todo el código que tengamoes entre el inicio del for y esa línea es el que se va a repetir en cada iteración. Espero te pueda servir. Recuerda probar siempre tus macros en el ambiente de pruebas. Hacerlo directamente en el de producción no es una buena práctica.

      Saludos,

      Borrar
  5. De nuevo muchísimas gracias por todo y felicitarle por sus aclaraciones tan claras.
    Funciona perfectamente.Ya solo me queda agregarle un botón que ponga imprimir y listo.
    Mil gracias.

    ResponderBorrar
  6. Hola buenas noches, muy interesante y util tu articulo me ha servido mucho en mi trabajo.
    Tengo una pregunta, es posible guardar en una variable un dato especifico de una tabla que me arroja una transacion en sap? Como conocer el nombre del campo.
    Saludos y gracias agradeceria tu apoyo.

    ResponderBorrar
    Respuestas
    1. Hola Victor, dale una mirada a este otro post: https://eduardoalzate.blogspot.com.co/2016/11/macro-para-conectar-excel-y-sap-y.html
      De igual manera, fíjate que cuando grabas el script en SAP, en el archivo plano quedan el nombre técnico del campo. Para ver el nombre técnico desde la interfaz de SAP, solo debes estar ubicado en el campo, le das F1, das clic en el botón que tiene un martillo y una llave y listo. Ahí te va a salir el nombre técnico del campo, la tabla en la que se almacenan los datos y algunas cosas más. Espero te sea de utilidad. Saludos.

      Borrar
    2. Gracias por contestar, sin embargo continuo con la duda. Agradecería mucho tu ayuda.
      Lo que intento hacer es extraer de sap un dato especifico de una tabla, no de un campo de texto, actualmente lo que hago es exportar la tabla que muestra sap a excel y ahi extraigo la información que necesito, todo mediante una macro, hay forma de traerse un dato especifico de sap sin necesidad de exportar toda la tabla?.

      Saludos y gracias.

      Pd. Tendras un email que puedas compartir para contactarte y enviarte alguna imagen.

      Borrar
    3. Muy buenas

      Tengo el mismo problema que tu, has conseguido algo??

      Borrar
  7. Buenos dias,
    muy bueno tu blog. me ha ayudado bastante, logre grabar el VBS, pasarlo a Excel, el inconveniente es q al correr la macro me sale un error "automation error -
    Invalidad sintax", resaltando la linea: Set SapGuiAuto = GetObject("SAPGUI")
    podrias ayudarle a resolverlo? esto seria de mucha ayuda para mi.
    te dejo el codigo completo que me genero a ver si encontras donde le puedo estar equivocando:

    gracias y saludos.

    Sub Button1_Click()

    Dim application
    Dim connection

    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 = "zarmmr005"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/usr/ctxtIMATNR-LOW").Text = "2005101540"
    session.findById("wnd[0]/usr/ctxtIWERKS-LOW").Text = "A101"
    session.findById("wnd[0]/usr/ctxtIWERKS-HIGH").Text = "A102"
    session.findById("wnd[0]/usr/ctxtP_VAR07").Text = "/MAT_VIGENTE"
    session.findById("wnd[0]/usr/ctxtP_VAR07").SetFocus
    session.findById("wnd[0]/usr/ctxtP_VAR07").caretPosition = 12
    session.findById("wnd[0]/tbar[1]/btn[8]").press
    session.findById("wnd[0]/mbar/menu[0]/menu[4]/menu[2]").Select
    session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").Select
    session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").SetFocus
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[1]/usr/ctxtDY_PATH").Text = "c:\temp"
    session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "material.xls"
    session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 12
    session.findById("wnd[1]/tbar[0]/btn[11]").press

    End Sub

    ResponderBorrar
  8. Hola buenos días, muy bueno el blog.
    Tengo un inconveniente al guardar el código mediante el SAP GUI scripting: lo que sucede es que cuando voy a la dirección de ruta donde guardé el código, el archivo no se encuentra. Luego lo busco mediante el buscador de la PC en el disco (C:) y lo encuentra pero al intentar abrirlo me aparece un cartel de advertencia diciendo que el archivo no existe. ¿Sabes la razón por la cual sucede esto? ¿Como puedo solucionarlo?

    ResponderBorrar
    Respuestas
    1. Hola León, siento haber tardado tanto en responder. La verdad es que ese problema nunca se me ha presentado. No estoy seguro si este relacionado con algún permiso en la carpeta donde estas guardando el archivo. Saludos.

      Borrar
    2. Si aun te sirve la respuesta, yo lo solucione cambiando la dirección de donde guarda el script a una carpeta de mis documentos

      Borrar
    3. Hola Ricardo, gracias por aportar!!!

      Borrar
  9. Hola buenas tardes!
    Estoy intentando correr la macro con el scrip que copie de SAP (Ver abajo) sin embargo al correrlo me lanza el siguiente error: compile datos invalide outside procedure y me resalta en Azul la palabra "application" de la línea inicial: If Not IsObject(Application) Then
    Me podrías ayudar por favor con la razón por la que sucede esto?

    No estoy familiarizada con el uso de macros ni VBA pero estoy en el intento de hacer más facil la descarga de información de reportes recurrentes.

    Gracias! Espero tus amables comentarios :)

    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 = "SQ00"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]").sendVKey 8
    session.findById("wnd[0]/usr/ctxtGSTRP-LOW").text = "01.01.2018"
    session.findById("wnd[0]/usr/ctxtGSTRP-HIGH").text = "31.12.2018"
    session.findById("wnd[0]/usr/ctxtGSTRP-HIGH").setFocus
    session.findById("wnd[0]/usr/ctxtGSTRP-HIGH").caretPosition = 10
    session.findById("wnd[0]/tbar[1]/btn[8]").press

    ResponderBorrar
  10. Hola, tengo una consulta!

    Lo que pasa es que el script se graba perfecto, ejecuta la transacción correctamente (ksb1) pero al momento de guardar/exportar el archivo se me abre el cuadro de dialogo en donde se le coloca el nombre del archivo y la ruta donde lo quiero guardar... existe algún código para poder automatizar ese proceso también? porque es la piedra de tope que tengo para poder automatizar al 100% esa tarea.

    desde ya, muchas gracias!

    ResponderBorrar
  11. Hola tengo un bache, resulta que estoy en una tabla dentro de una transacción en SAP y quiero moverme entre filas, por ejemplo:

    session.findById("wnd[0]/usr/ssubSUB_MAIN_CARRIER:SAPLMIGO:0002/subSUB_ITEMLIST:SAPLMIGO:0200/tblSAPLMIGOTV_GOITEM/ctxtGOITEM-NAME1[1,0]").Text = Sheets("Hoja1").Range("I2").Text

    lo que esta en [1,0], como hago para que tome una variable por ejemplo [1,&filas], pero no me funciona, muchas gracias

    ResponderBorrar
    Respuestas
    1. Has intentado con un for i=&filas para que recorra de manera iterativa las filas?

      Borrar
    2. Buenas, pudieron resolver este problema?? Tampoco he podido integrar variables para encontrar un columna específica mediante un FOR.

      Saludos y Gracias!

      Borrar
  12. HOla que tal, me gustaría saber si me puedes apoyar. Tengo la macro definida, pero quisiera saber como puedo manejar las alertas de las transacciones, por ejemplo "credito" ya que si aparecer la alerta hay que dar un click más que si no aparece dicha alerta.

    Tengo pensado emplear un:
    if "alerta" then
    instrucciones
    end if

    Quiero utilizar una bandera de manera que si se aparece la alerta entre en el if y si no, pues pase de largo

    ResponderBorrar
  13. Hola que tal, ya pude resolver la situación con la alerta, en efecto era con un if, Mi duda ahora es:

    ¿Cómo puedo hacer para agregar notas dentro de una orden después de aquellas que ya se encuentren en la misma?

    Muy interesante todo lo que se encuentra por acá, sigue así.

    Saludos.

    ResponderBorrar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Borrar
    2. Hola Héctor, dame por favor más detalles sobre lo que quieres hacer. Que transacción estas usando?

      Borrar
  14. Hola
    Tengo una duda lo que pasa es que me toca descargar una información de sap desde una macro en excel, que solo sea dar clic en el botón de la macro y me descargue la información que necesito desde sap es posible hacerlo en Sap business one?

    ResponderBorrar
  15. Hola una consulta, das clases de macros desde SAP por Skype o algo así ? Gracias !

    ResponderBorrar
    Respuestas
    1. Hola Gabriel y que macro quieres realizar? Que operación quieres hacer en SAP? Slds.

      Borrar
    2. Hola!Básicamente extraer datos desde FLB3n y otras, para que se descargue en un formato que yo pueda manipular sin tener que bajar toda la data manual.

      Te paso mi email gabrielcatalans@gmail.com

      Borrar
  16. Básicamente extraer datos desde FLB3n y otras, para que se descargue en un formato que yo pueda manipular sin tener que bajar toda la data manual.

    ResponderBorrar
  17. Saludos

    A pesar de que e hecho todo lo indicado en esta presentacion aun me toma trabajo entender como se conecta SAP y excel. Solo quiero preguntar si es possible una tutorial a traves de skype o cualquier otra aplicacion. Obviamente no seria gratis. Me urge poder lograr corer un reporte de SAP pero que sea desde excel. Gracias Pedro Morales

    ResponderBorrar
  18. Hola, me puedes ayudar?, me sale un error que pone "se ha producido un error 619 en tiempo de ejecucion error definido por la aplicacion o el objeto" yo entro en sap con iw38 para ver las ordenes de mantenimiento preventivo que hay que realizar en una planta, pero no me funciona la macro, me puedes ayudar? gracias por tu tiempo

    ResponderBorrar
  19. Hola.

    ¿Puedes ayudarme? He realizado la Macro para extraer el stock de la transacción MB52. Esta se conecta con SAP y obtiene el stock pero me falta el último paso. Es decir, ¿qué tengo que añadir a la macro para exportarlo a Excel?

    Esta es la Macro creada.

    Sub conectar_sap()

    Dim application
    Dim connection

    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 = "mb52"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/tbar[1]/btn[17]").press
    session.findById("wnd[1]/usr/txtENAME-LOW").Text = "VILCHESM"
    session.findById("wnd[1]/usr/txtENAME-LOW").SetFocus
    session.findById("wnd[1]/usr/txtENAME-LOW").caretPosition = 8
    session.findById("wnd[1]/tbar[0]/btn[8]").press
    session.findById("wnd[0]/tbar[1]/btn[8]").press

    End Sub

    ResponderBorrar
  20. hola,
    Primero de todo agradecerte el blog. esta genial!
    En mi caso quiero hacer un cn41 y ejecuta el script pero no importa los datos al excel
    ¿Que estoy haciendo mal ¿?
    Sub qq()

    Dim application
    Dim connection

    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 = "cn41"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/usr/ctxtCN_PSPNR-LOW").Text = "X-25104651/C"
    session.findById("wnd[0]/usr/ctxtCN_PSPNR-LOW").SetFocus
    session.findById("wnd[0]/usr/ctxtCN_PSPNR-LOW").caretPosition = 12
    session.findById("wnd[0]").sendVKey 8
    session.findById("wnd[0]/usr/lbl[6,5]").SetFocus
    session.findById("wnd[0]/usr/lbl[6,5]").caretPosition = 19
    End Sub

    Muchas gracias.
    Un saludo

    ResponderBorrar
    Respuestas
    1. Hola, gracias por leer mi blog y comentar, dale una mirada a este otro post: http://eduardoalzate.blogspot.com/2016/11/macro-para-conectar-excel-y-sap-y.html si lo que deseas es pasar info al excel, debes usar una instrucción como esta: Range("E" & filas + 2) = Session.findById("wnd[0]/usr/tabsSEG_TABSTRIP/tabpRECE/ssubSUB1:SAPMKAL1:0481/sub:SAPMKAL1:0481/txtKGALF-TEXT1[0,0]").Text
      Saludos.

      Borrar
  21. Buen dia Admin

    Tengo un script para crear materiales por la MM41
    Necesito que grabar un campo de la tx al excel y poder hacer una conversion por ejemplo
    cuando estoy creando el material hay un campo en los datos basicos que ya me arroja el numero de material que me va a arrojar cuando grabe yo necesito bajar al excel ese numero para después volverlo a subir en otro campo que requiero como codigo alfanumero pero creo que no me estoy dando explicar .tiene algun medio por donde lo pueda contactar? este es mi correo : jorge.degollado@outlook.es


    saludos!

    ResponderBorrar
  22. buenas noches, que buen blog, me parece super constructivo
    quería consultarte si tienes alguna publicación con ejemplos de como hacer que información que tengo en un excel me suba a una transacción de SAP

    ResponderBorrar
    Respuestas
    1. Hola Alexander, gracias por tu comentario, intenta dándole una mirada a este post: http://eduardoalzate.blogspot.com/2016/11/macro-para-conectar-excel-y-sap-y.html

      Borrar
  23. muchas gracias por la respuesta, aun me puedes ayudar a hacerlo mas dinámico, tengo estos datos:

    Cod Cl Hora1 Hora 2 Fecha 1 Fecha 2
    31658 9001 7:00 10:00 15.08.2019 15.08.2019
    31658 9001 7:00 10:00 15.08.2019 15.08.2019
    32226 9001 7:00 10:00 15.08.2019 15.08.2019
    32229 9001 7:00 10:00 15.08.2019 15.08.2019
    33380 9001 7:00 10:00 15.08.2019 15.08.2019
    19396 9001 7:00 10:00 15.08.2019 15.08.2019
    31597 9001 7:00 10:00 15.08.2019 15.08.2019
    31534 9001 7:00 10:00 15.08.2019 15.08.2019
    32324 9001 7:00 10:00 15.08.2019 15.08.2019

    la tabla tiene 13 filas y así lo monte en la ejecución de la macro, quedando fija, como puedo cambiar el código para que valide las filas y me ejecute el rango para las mismas posiciones en la tabla de SAP.

    session.FindById("wnd[0]").Maximize
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,0]").Text = Sheets("Plantilla").Range("B2").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,1]").Text = Sheets("Plantilla").Range("B3").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,2]").Text = Sheets("Plantilla").Range("B4").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,3]").Text = Sheets("Plantilla").Range("B5").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,4]").Text = Sheets("Plantilla").Range("B6").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,5]").Text = Sheets("Plantilla").Range("B7").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,6]").Text = Sheets("Plantilla").Range("B8").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,7]").Text = Sheets("Plantilla").Range("B9").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,8]").Text = Sheets("Plantilla").Range("B10").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,9]").Text = Sheets("Plantilla").Range("B11").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,10]").Text = Sheets("Plantilla").Range("B12").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,11]").Text = Sheets("Plantilla").Range("B13").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,12]").Text = Sheets("Plantilla").Range("B14").Text
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,12]").SetFocus
    session.FindById("wnd[0]/usr/tblMP200000TCFAST/ctxtRP50M-PERNR[0,12]").CaretPosition = 5
    session.FindById("wnd[0]").SendVKey 0

    ResponderBorrar
  24. Amigo, favor me podrías ayudar con lo siguiente, genere este script de SAP, pero se solo llega hasta "Set SapGuiAuto = GetObject("SAPGUI")" allí se cae la macro, no se si tengo un problema de conexión entre SAP y Excel, o me faltan librerías. por favor ayúdame!!

    Sub conectar_sap()

    Dim Application
    Dim connection

    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]").resizeWorkingPane 208, 29, False
    session.findById("wnd[0]/tbar[0]/okcd").Text = "mmbe"
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[0]/usr/ctxtMS_MATNR-LOW").Text = "2H6338.000"
    session.findById("wnd[0]/tbar[1]/btn[8]").press
    session.findById("wnd[0]/usr/cntlCC_CONTAINER/shellcont/shell/shellcont[1]/shell[1]").selectItem " 4", "C 2"
    session.findById("wnd[0]/usr/cntlCC_CONTAINER/shellcont/shell/shellcont[1]/shell[1]").ensureVisibleHorizontalItem " 4", "C 2"
    session.findById("wnd[0]/usr/cntlCC_CONTAINER/shellcont/shell/shellcont[1]/shell[1]").itemContextMenu " 4", "C 2"
    session.findById("wnd[0]/usr/cntlCC_CONTAINER/shellcont/shell/shellcont[1]/shell[1]").selectContextMenuItem "HULI"
    session.findById("wnd[0]/usr/lbl[6,4]").SetFocus
    session.findById("wnd[0]/usr/lbl[6,4]").caretPosition = 11
    session.findById("wnd[0]").sendVKey 2
    session.findById("wnd[0]/usr/ctxtVEKP-EXIDV").SetFocus
    session.findById("wnd[0]/usr/ctxtVEKP-EXIDV").caretPosition = 0


    End Sub

    ResponderBorrar
  25. Buenas tardes, ya hice la macro pero cuando la ejecuto dice en SAP una alerta "Un Script está intentando ejecutarse" y al darle ok la macro deja de funcionar. Que puedo hacer para que el darle "OK" este dentro del codigo?

    ResponderBorrar
  26. Buenas noches, como puedo correr esta extensión en SAP:
    session.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1107/tabsTS_1100/tabpMUEB/ssubSUB_AUFTRAG:SAPLCOMK:3020/tblSAPLCOMKTCTRL_3020/ctxtRESBD-MATNR[1,2]").text = "5568816"
    session.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1107/tabsTS_1100/tabpMUEB/ssubSUB_AUFTRAG:SAPLCOMK:3020/tblSAPLCOMKTCTRL_3020/txtRESBD-MENGE[4,2]").text = "10"
    session.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1107/tabsTS_1100/tabpMUEB/ssubSUB_AUFTRAG:SAPLCOMK:3020/tblSAPLCOMKTCTRL_3020/ctxtRESBD-LGORT[8,2]").text = "1000"
    session.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1107/tabsTS_1100/tabpMUEB/ssubSUB_AUFTRAG:SAPLCOMK:3020/tblSAPLCOMKTCTRL_3020/txtRESBD-VORNR[10,2]").text = "0010"
    session.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1107/tabsTS_1100/tabpMUEB/ssubSUB_AUFTRAG:SAPLCOMK:3020/tblSAPLCOMKTCTRL_3020/txtRESBD-VORNR[10,2]").setFocus
    session.findById("wnd[0]/usr/subSUB_ALL:SAPLCOIH:3001/ssubSUB_LEVEL:SAPLCOIH:1107/tabsTS_1100/tabpMUEB/ssubSUB_AUFTRAG:SAPLCOMK:3020/tblSAPLCOMKTCTRL_3020/txtRESBD-VORNR[10,2]").caretPosition = 4
    session.findById("wnd[0]").sendVKey 0

    Deseo que corra la fila en SAP [4,2] en [4,3] conforme corra el excel en fila corra en fila en SAP para el caso de la Trx mb21.

    ResponderBorrar
  27. Muy buenas

    no tendrá alguien por casualidad el codigo para Iniciar SAP si este no esta iniciado desde VB o VBA

    ResponderBorrar
  28. Cómo puedo hacer si en vez de escribir yo el centro de costo, quiero que sean valores que se encuentran en una columna determinada de excel?

    ResponderBorrar
    Respuestas
    1. Hola Pili, no es complicado, debes incluir el código en un bloque for next. Revisa como ejemplo este post y me cuentas: http://eduardoalzate.blogspot.com/2016/11/acta-de-reuniones-en-excel-y-vba-con-la.html?m=1

      Saludos.

      Borrar
  29. Buen día, verá ya tengo en script que me descarga los datos de SAP a varios ficheros de excel pero conforme va corriendo el script, estos archivos los va abiendo en automático y son bastantes, quisiera ver la forma de que esto no ocurra ya que pretendo automatizar la ejecución del script por medio del task schedule, pero como va abriendo los excel, me da error. Espero haberme explicado

    ResponderBorrar
  30. como puedo crear una tabla sensilla, solo para extraer los datos de la transaccion ZVERPLAN Y MB5B ??
    Ayudaaaaaa

    ResponderBorrar
  31. hola me sale automation error, que hago pls

    ResponderBorrar
  32. Hola.. es posible crear una macro que descargue saldos de cuentas desde la fbk3n o fbl1n que ya tengo filtradas por variantes? Se puede programar para que haga la descarga a cierta hora del día?
    Gracias!

    ResponderBorrar
  33. Por otro lado, tengo una tabla Excel que vamos actualizando diariamente (tipos de cambio de distintas paginas) y copiamos y pegamos la info a una tabla sap todos los días. Se puede resolver grabando un script y guardando la tabla como macro?

    ResponderBorrar
  34. ¿Cómo hacer que un código script SAP-Excel no me abra los ficheros de excel que va generando y como ejecutarlo desde una macro?

    ResponderBorrar
  35. Hola
    He hecho una prueba, digamos que he dado a iniciar la grabación, he hecho los pasos que necesito de un cierto informe, lo quiero termianar y le doy al amarillo, peor no se si estoy parando la macro y si bien me lo deja en una ruta, alli no esta.
    Otra cosoa es; ¿como vuelvo a accionarlo?
    Saludos y muchas gracias

    ResponderBorrar
  36. Hola
    Estoy tratando de descargar un archivo xls por medio de grabacion de scripting a la transaccion zlx02 y guardar por medio de una macro con diferente nombre en una misma carpeta 4 veces por dia. Favor si tienes algo para esto. Saludos

    ResponderBorrar
  37. Hola
    Estoy tratando de descargar un archivo xls por medio de grabacion de scripting a la transaccion zlx02 y guardar por medio de una macro con diferente nombre en una misma carpeta 4 veces por dia. Favor si tienes algo para esto. Saludos

    ResponderBorrar
  38. Que tal buen dia a todos, me podrían apoyar con lo siguiente, requiero realizar una conexión de excel con sap para cargar datos, en este caso seria a la transacción iw21 - Crear avisos de mantenimiento, actualmente ya puede realizar la conexión para descargar, pero no encuentro como cargar datos

    ResponderBorrar
  39. Hola

    Podrían apoyarme con lo siguiente:

    como puedo importar una base de datos de sap a excel que permita visualizar las entregas que se encuentran completas y las que no sin alterar algunas columnas como por ejemplo comentarios y respetar algunas formulas.

    ResponderBorrar
  40. Hola Buenas noches!!

    muy buena ayuda si funciono con mi usuario a la perfección solo tengo un par de preguntas veo que sabes mucho de los dos temas.

    como ejecutar el mismo script de SAP con un usuario diferente en este caso con el usuario de mi compañero para que también el tenga el benéfico??

    2.- como copiar una casilla de el sistema sap e incluir en una celda de excel, esto es posible??

    ResponderBorrar
    Respuestas
    1. Hola,

      1. Tu compañero debe tener los mismos permisos que tu tienes en SAP.

      2. Dale una mirada a este post: http://eduardoalzate.blogspot.com/2016/11/macro-para-conectar-excel-y-sap-y.html?m=0

      Borrar
  41. Hola buen dia, busco crear una Macro que descargue de manera automatica de SAP un reporte de ZSHRT, pero a la hora de generarse (F8) la macro termina hasta el cuadro de Texto donde yo le asigno el nombre y la ubicacion de guardado, hay algun comando para que se guarde el archivo con un nombre definido y la ubicacion de guardado?

    ResponderBorrar
  42. session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,5]").SetFocus
    session.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,5]").caretPosition = 8
    session.findById("wnd[1]/tbar[0]/btn[8]").press
    session.findById("wnd[0]/tbar[1]/btn[8]").press
    session.findById("wnd[0]/tbar[1]/btn[33]").press
    session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").firstVisibleRow = 191
    session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").firstVisibleRow = 290
    session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").currentCellRow = 328
    session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").firstVisibleRow = 323
    session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").selectedRows = "328"
    session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").clickCurrentCell
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell").selectedRows = "0"
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell").contextMenu
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell").selectContextMenuItem "&XXL"
    session.findById("wnd[1]/usr/cmbG_LISTBOX").Key = "10"
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[0]/tbar[0]/btn[3]").press

    End Sub


    Esta es la parte donde defino el Layout y el guardado, paro no se hace automaticamente por no definir el nombre y ubicacion del file

    ResponderBorrar
  43. Muchas gracias por el aporte.
    Mi problema es el siguiente. Tengo que descargar información de 3 ventanas distintas de sap al mismo tiempo.
    Intento grabar el código para manipular las 3 pero en el código esta parte siempre aparece así:
    session.findById("wnd[0]")
    Cuando lo modifico por ejemplo de esta forma para cambiar de ventana y hacer su respectivo proceso, me marca un error.
    session.findById("wnd[1]")
    Por lo que he visto en otros códigos que he grabado (solo para una ventana de SAP) creo que cambiar el cero por el uno se refiere a que cambia de ventanas secundarias dentro de la ventana principal.
    Como podría cambiar completamente de venta por ejemplo para en una manipular la transacción MB52 y (casi) simultáneamente la MB51 en otra ventana.

    ResponderBorrar
  44. Hola, en caso necesite cada mes cambiar la fecha de extracción de datos, que dato tendría que poner en la macro para que automáticamente cambie la fecha ( siempre sería el día 5 del mes en que extraiga los datos de sap)
    Gracias

    ResponderBorrar
  45. Hola! muy util el post, tengo la macro creada y me funciona perfectamente en mi pc. Sin embargo, cuando se usa el archivo desde otro pc, la macro accede a SAP, baja el archivo pero luego, excel no encuentra el documento. Salta en la linea:
    '
    Windows("EXPORT.XLSX").Activate
    como podría arreglarse? he probado de guardar la ruta en sap que guarde el archivo en una carpeta compartida pero no funciona tampoco

    gracias

    ResponderBorrar
    Respuestas
    1. Sugiero que para automatizar la fecha, la generes usando la funcion mounth de vba conbinada con la funcion now(). Si deseas algo mas especifico pasame tu emails ya que yo tengo la una interface que conbina EXCEL y ACCESS para genear y/o compilar la informacion en un reporte especifico.

      Borrar
  46. Saludos! muy buen post estoy intentando hacer una macro para crear reportes (Quality Notifications) repetitivos, en la transaccion QF01 pero ya que apenas comienso con esto de las macros tengo algunas dificultades puedo grabar el script pero no me conecta desde exel a sap para ejecutarlo

    ResponderBorrar
  47. Hola, por favor algún scripts para la tx f-36 ?

    ResponderBorrar
  48. Hola super bueno tu post, necesito saber si al ejecutar una macro desde excel puedo indicarle en cual de las ventanas abiertas en SAP necesito que se ejecute?. Intenté incluso que abriera una nueva ventana SAP pero siempre se ejecuta en la primera ventana de la derecha. Saludos desde Chile.

    ResponderBorrar
  49. Hola, muy buen post!, logré realizarlo, pero quisiera que esa información sea exportada a una hoja de excel ya existente, en una fila y columna determinada. como podría ser la macro?

    ResponderBorrar
  50. Me alegra que compartas tu conocimiento. Un artículo muy interesante y de ayuda. Muchas gracias

    ResponderBorrar