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.
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:
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!!!
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?
ResponderBorrarHola 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.
Borrarmuchas gracias, consultare lo que me das y hare algunas pruebas. muchas gracias.
BorrarHola 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?
BorrarHola draki,
BorrarActualmente 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 !!!
Hola buenos días:
ResponderBorrarMe 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
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
BorrarSi no lo logras resolver, dejame un mensaje con el código que escribiste y yo te respondo con el código ajustado.
Saludos,
Hola buenos días.
ResponderBorrarSiento 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
No lo ha marcado en rojo el número de nota es:
ResponderBorrar4100473042
Ok, escribelo de la siguiente forma:
BorrarIf 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,
De nuevo muchísimas gracias por todo y felicitarle por sus aclaraciones tan claras.
ResponderBorrarFunciona perfectamente.Ya solo me queda agregarle un botón que ponga imprimir y listo.
Mil gracias.
Excelente!!!
BorrarMuchas Gracias
ResponderBorrarCon mucho gusto. Saludos!!
BorrarHola buenas noches, muy interesante y util tu articulo me ha servido mucho en mi trabajo.
ResponderBorrarTengo 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.
Hola Victor, dale una mirada a este otro post: https://eduardoalzate.blogspot.com.co/2016/11/macro-para-conectar-excel-y-sap-y.html
BorrarDe 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.
Gracias por contestar, sin embargo continuo con la duda. Agradecería mucho tu ayuda.
BorrarLo 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.
Muy buenas
BorrarTengo el mismo problema que tu, has conseguido algo??
Buenos dias,
ResponderBorrarmuy 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
Hola buenos días, muy bueno el blog.
ResponderBorrarTengo 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?
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.
BorrarSi aun te sirve la respuesta, yo lo solucione cambiando la dirección de donde guarda el script a una carpeta de mis documentos
BorrarHola Ricardo, gracias por aportar!!!
BorrarHola buenas tardes!
ResponderBorrarEstoy 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
Hola, tengo una consulta!
ResponderBorrarLo 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!
Hola tengo un bache, resulta que estoy en una tabla dentro de una transacción en SAP y quiero moverme entre filas, por ejemplo:
ResponderBorrarsession.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
Has intentado con un for i=&filas para que recorra de manera iterativa las filas?
BorrarBuenas, pudieron resolver este problema?? Tampoco he podido integrar variables para encontrar un columna específica mediante un FOR.
BorrarSaludos y Gracias!
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.
ResponderBorrarTengo 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
Hola que tal, ya pude resolver la situación con la alerta, en efecto era con un if, Mi duda ahora es:
ResponderBorrar¿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.
Este comentario ha sido eliminado por el autor.
BorrarHola Héctor, dame por favor más detalles sobre lo que quieres hacer. Que transacción estas usando?
BorrarHola
ResponderBorrarTengo 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?
Hola una consulta, das clases de macros desde SAP por Skype o algo así ? Gracias !
ResponderBorrarHola Gabriel y que macro quieres realizar? Que operación quieres hacer en SAP? Slds.
BorrarHola!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.
BorrarTe paso mi email gabrielcatalans@gmail.com
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.
ResponderBorrarSaludos
ResponderBorrarA 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
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
ResponderBorrarHola.
ResponderBorrar¿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
Exelente info. Me a servido mucho
ResponderBorrarCon mucho gusto!!!
Borrarhola,
ResponderBorrarPrimero 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
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
BorrarSaludos.
Buen dia Admin
ResponderBorrarTengo 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!
buenas noches, que buen blog, me parece super constructivo
ResponderBorrarquerí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
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
Borrarmuchas gracias por la respuesta, aun me puedes ayudar a hacerlo mas dinámico, tengo estos datos:
ResponderBorrarCod 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
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!!
ResponderBorrarSub 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
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?
ResponderBorrarBuenas noches, como puedo correr esta extensión en SAP:
ResponderBorrarsession.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.
Muy buenas
ResponderBorrarno tendrá alguien por casualidad el codigo para Iniciar SAP si este no esta iniciado desde VB o VBA
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?
ResponderBorrarHola 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
BorrarSaludos.
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
ResponderBorrarcomo puedo crear una tabla sensilla, solo para extraer los datos de la transaccion ZVERPLAN Y MB5B ??
ResponderBorrarAyudaaaaaa
hola me sale automation error, que hago pls
ResponderBorrarHola.. 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?
ResponderBorrarGracias!
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¿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?
ResponderBorrarHola
ResponderBorrarHe 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
Hola
ResponderBorrarEstoy 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
Hola
ResponderBorrarEstoy 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
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
ResponderBorrarHola
ResponderBorrarPodrí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.
Hola Buenas noches!!
ResponderBorrarmuy 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??
Hola,
Borrar1. 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
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?
ResponderBorrarsession.findById("wnd[1]/usr/tabsTAB_STRIP/tabpSIVA/ssubSCREEN_HEADER:SAPLALDB:3010/tblSAPLALDBSINGLE/ctxtRSCSEL_255-SLOW_I[1,5]").SetFocus
ResponderBorrarsession.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
Muchas gracias por el aporte.
ResponderBorrarMi 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.
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)
ResponderBorrarGracias
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:
ResponderBorrar'
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
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.
BorrarSaludos! 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
ResponderBorrarHola, por favor algún scripts para la tx f-36 ?
ResponderBorrarHola 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.
ResponderBorrarHola, 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?
ResponderBorrarMe alegra que compartas tu conocimiento. Un artículo muy interesante y de ayuda. Muchas gracias
ResponderBorrar