Cómo leer datos de SAP desde Excel con VBA y SAP GUI Scripting

¿Necesitas extraer información de SAP sin abandonar tus plantillas de Excel favoritas? Con unas cuantas líneas de VBA y la potencia de SAP GUI Scripting es posible automatizar consultas, llenar informes y acelerar tareas que a mano tomarían horas, todo desde la misma hoja de cálculo.

Índice

Ventajas de conectar Excel con SAP

  • Eficiencia instantánea: reutiliza fórmulas, tablas dinámicas y gráficos que ya tienes preparados.
  • Menor curva de aprendizaje: los analistas dominan Excel; no necesitas capacitar a todo el equipo en ABAP o en BW.
  • Reducir errores: copias y pegados desaparecen; los datos llegan directo desde la pantalla de SAP a la celda correcta.
  • Escalabilidad: la misma macro puede recorrer decenas, cientos o miles de materiales, centros o usuarios con un bucle sencillo.

Requisitos previos

Antes de empezar asegúrate de contar con lo siguiente:

ElementoVersión mínima recomendadaComentarios
SAP GUI for Windows7.70 Patch 8Las versiones 7.50+ ya incluyen el componente de scripting.
Microsoft Excel2016 u Office 365VBA habilitado; se requiere el Editor de Visual Basic.
Permiso de ScriptingActivo en cliente y servidorConsulta con Basis si la casilla está deshabilitada a nivel de sistema.

Cómo habilitar SAP GUI Scripting

  1. Abre SAP Logon, selecciona el sistema y pulsa Options.
  2. Navega a SAP GUI ► Scripting.
  3. Marca Enable scripting y guarda.
  4. Pide al administrador que habilite el parámetro sapgui/user_scripting = TRUE en el servidor (si no lo está).

Preparar el libro de Excel

  1. Activa la pestaña Desarrollador (Opciones ► Personalizar cinta).
  2. Pulsa Visual Basic (o Alt + F11) para abrir el Editor de VBA.
  3. En Referencias marca “SAP GUI Scripting API” (fichero sapfewse.ocx) para contar con IntelliSense.
  4. Inserta un Módulo estándar y pega el procedimiento que veremos a continuación.

Macro mínima para leer datos de SAP

El ejemplo extrae el nombre corto de un material usando la transacción MM03 y lo deposita en la columna B de la misma fila:

Sub LeerDeSAP()

    'Declaración de objetos
    Dim SapGuiAuto As Object, app As Object
    Dim conn As Object, ses As Object

    'Conectar con SAP GUI en ejecución
    Set SapGuiAuto = GetObject("SAPGUI")
    Set app = SapGuiAuto.GetScriptingEngine
    Set conn = app.Children(0)          'Primera conexión
    Set ses = conn.Children(0)          'Primera sesión

    '--- Ejecución de la transacción
    ses.StartTransaction "MM03"
    ses.findById("wnd[0]/usr/ctxtRMMATNR-LOW").Text = 
        ThisWorkbook.Sheets("Sheet1").Range("A2").Value
    ses.findById("wnd[0]/tbar[1]/btn[8]").Press   'Ejecutar

    '--- Captura de resultado
    ThisWorkbook.Sheets("Sheet1").Range("B2").Value = _
        ses.findById("wnd[0]/usr/tblSAPLMGMMTCVIEWTAB/ctxtMARA-MATNR[1,0]").Text

    '--- Salir
    ses.findById("wnd[0]/tbar[0]/btn[12]").Press 'Regresar
    Set ses = Nothing: Set conn = Nothing: Set app = Nothing

End Sub

¿Qué hace cada línea?

  • GetObject(“SAPGUI”): encuentra el proceso en ejecución; no abre uno nuevo.
  • StartTransaction: funciona igual que en la barra de comandos de SAP GUI.
  • findById(…).Text = …: inyecta el valor de la celda A2 en el campo de selección.
  • Press: emula clics de botones por su posición (tbar[1]/btn[8] es Ejecutar/F8).
  • Range(“B2”).Value = …: lleva la respuesta al libro de Excel.

Ampliar el script para múltiples registros

Para leer varios materiales basta con un bucle que recorra las filas pobladas:

Sub LoteMateriales()
    Dim i As Long, ultima As Long
    ultima = Cells(Rows.Count, "A").End(xlUp).Row
    For i = 2 To ultima
        Call LeerFila(i)   'Procedimiento que replica la lógica de LeerDeSAP usando la variable i
        DoEvents           'Cede tiempo al sistema para evitar congelamientos
    Next i
End Sub

Buenas prácticas de rendimiento

  • Desactiva Application.ScreenUpdating y Application.Calculation mientras corre la macro.
  • Añade ses.FindById("wnd[0]").SendVKey 0 al final de cada vuelta para asegurar que la pantalla terminó de cargarse.
  • Usa variables tipo Long en lugar de Integer cuando el recuento supere los 32 k registros.

Manejo de errores y depuración

On Error Resume Next
If ses Is Nothing Then
    MsgBox "No se pudo abrir la sesión de SAP", vbCritical
    Exit Sub
End If
On Error GoTo 0

Incluye ventanas emergentes solo al depurar. En producción registra errores en una pestaña Log para no interrumpir el proceso.

Seguridad y cumplimiento

  • Credenciales: la macro usa la sesión ya autenticada; no guardes contraseñas en texto plano.
  • Firma digital: añade un certificado a tu proyecto VBA para evitar avisos de macros potencialmente peligrosas.
  • Registro de auditoría: cada acción de Scripting queda en el log de sistema (SM20) si tu equipo de Basis lo configuró.

Comparativa rápida con otros métodos

MétodoTiempo de desarrolloRendimientoEscenario ideal
SAP GUI ScriptingHorasMedioAutomatizar tareas repetitivas de usuario sin ABAP.
RFC/BAPI (VBA + Librería .NET)DíasAltoIntegraciones backend a gran escala.
OData / API RESTMedioMedio‑AltoAplicaciones web y móviles.
ODP / BW ExtractorsSemanasExcelenteReporting masivo y alimentado en tiempo casi real.

Preguntas frecuentes

¿Por qué mi macro se detiene con “object required”?

La sesión pudo haberse desconectado. Implementa una rutina que verifique si ses.Info.IsLowSpeedConnection está activo y reabra la transacción.

¿Puedo acceder a varios sistemas (PRD, QAS, DEV) desde el mismo libro?

Sí. Crea conexiones múltiples (app.Children(index)) y administra las variables por separado, o bien usa un parámetro en tu hoja de control.

¿Se puede programar la ejecución cada noche?

Coloca el libro en un servidor con Office y crea una tarea en el Programador de Windows que abra Excel y ejecute la macro a la hora deseada.

Conclusión

Uniendo Excel y SAP mediante SAP GUI Scripting obtienes la flexibilidad de las hojas de cálculo con la robustez de los datos transaccionales. Para proyectos rápidos, informes ad‑hoc o pruebas de concepto, la técnica es imbatible. En operaciones críticas o de alto volumen, evalúa RFC, OData u ODP para obtener el máximo rendimiento y seguridad.

Índice