Estoy creando una macros para poder automatizar la extracción de un reporte de producción, pero tengo dos problemas, el codigo no me esta copiando bien los textos desde las celdas, los copia la primera vez pero si cambio los parametros y ejecuto nuevamente el codigo, este copia los parametros que tenia la primera vez, como puedo hacer que el codigo vaya por los datos y los pegue bien?
Segundo, el codigo no me opera de manera automatica el guardar como, quedando excel a la espera de funcion OLE, les dejo el codigo y espero me puedan ayudar.
Sub EjecutarSAPConParametrosDesdeExcel()
On Error GoTo ErrorHandler
' Declarar variables de Excel
Dim xlApp As Object
Dim xlWorkbook As Object
Dim xlWorksheet As Object
Dim BUDAT_LOW As String
Dim BUDAT_HIGH As String
Dim EXNAM_LOW As String
Dim AUART_LOW As String
Dim ARBPL_LOW As String
' Abrir Excel y el archivo específico
Set xlApp = CreateObject("Excel.Application")
If xlApp Is Nothing Then
MsgBox "Error: No se pudo crear el objeto Excel.Application."
Exit Sub
End If
Set xlWorkbook = xlApp.Workbooks.Open("C:\Users\dsaavedram\Desktop\informesturnoSAP\macrosfj.xlsm")
If xlWorkbook Is Nothing Then
MsgBox "Error: No se pudo abrir el libro de Excel."
Exit Sub
End If
Set xlWorksheet = xlWorkbook.Sheets("MACROS PROD")
If xlWorksheet Is Nothing Then
MsgBox "Error: No se pudo obtener la hoja 'MACROS PROD'."
xlWorkbook.Close False
xlApp.Quit
Exit Sub
End If
' Leer valores desde la hoja de Excel
BUDAT_LOW = Trim(xlWorksheet.Range("A2").Value)
BUDAT_HIGH = Trim(xlWorksheet.Range("C2").Value)
EXNAM_LOW = Trim(xlWorksheet.Range("B4").Value)
AUART_LOW = Trim(xlWorksheet.Range("B6").Value)
ARBPL_LOW = Trim(xlWorksheet.Range("B5").Value)
' Verificar valores leídos desde Excel
MsgBox "Valores leídos desde Excel:" & vbCrLf & _
"BUDAT_LOW: " & BUDAT_LOW & vbCrLf & _
"BUDAT_HIGH: " & BUDAT_HIGH & vbCrLf & _
"EXNAM_LOW: " & EXNAM_LOW & vbCrLf & _
"AUART_LOW: " & AUART_LOW & vbCrLf & _
"ARBPL_LOW: " & ARBPL_LOW
' Cerrar Excel
xlWorkbook.Close False
xlApp.Quit
Set xlWorksheet = Nothing
Set xlWorkbook = Nothing
Set xlApp = Nothing
' Declarar variables de SAP
Dim SapGuiAuto As Object
Dim application As Object
Dim connection As Object
Dim session As Object
' Conectar a SAP
Set SapGuiAuto = GetObject("SAPGUI")
If SapGuiAuto Is Nothing Then
MsgBox "Error: No se pudo obtener el objeto SAPGUI."
Exit Sub
End If
Set application = SapGuiAuto.GetScriptingEngine
If application Is Nothing Then
MsgBox "Error: No se pudo obtener el motor de scripting de SAP."
Exit Sub
End If
Set connection = application.Children(0)
If connection Is Nothing Then
MsgBox "Error: No se pudo obtener la conexión SAP."
Exit Sub
End If
Set session = connection.Children(0)
If session Is Nothing Then
MsgBox "Error: No se pudo obtener la sesión SAP."
Exit Sub
End If
' Interactuar con SAP usando los valores de Excel
If session.findById("wnd[0]", False) Is Nothing Then
MsgBox "Error: No se pudo encontrar la ventana SAP 'wnd[0]'."
Exit Sub
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").selectedNode = "F00002"
session.findById("wnd[0]/usr/cntlIMAGE_CONTAINER/shellcont/shell/shellcont[0]/shell").doubleClickNode "F00002"
' Copiar valores a los campos correspondientes en SAP
session.findById("wnd[0]/usr/ctxt$AUART-LOW").Text = AUART_LOW
session.findById("wnd[0]/usr/ctxt$BUDAT-LOW").Text = BUDAT_LOW
session.findById("wnd[0]/usr/ctxt$BUDAT-HIGH").Text = BUDAT_HIGH
session.findById("wnd[0]/usr/ctxt$EXNAM-LOW").Text = EXNAM_LOW
session.findById("wnd[0]/usr/ctxt$ARBPL-LOW").Text = ARBPL_LOW
session.findById("wnd[0]/usr/ctxtALV_DEF").Text = "/PROD TURNO"
session.findById("wnd[0]/usr/ctxtALV_DEF").SetFocus
session.findById("wnd[0]/usr/ctxtALV_DEF").caretPosition = 11
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[1]/btn[8]").press
' Guardar el archivo exportado
session.findById("wnd[0]/tbar[1]/btn[45]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/usr/ctxtDY_PATH").Text = "C:\Users\dsaavedram\Documents\SAP\SAP GUI"
session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "export.xlsx"
session.findById("wnd[1]/tbar[0]/btn[11]").press
' Finalizar sesión
session.findById("wnd[0]/tbar[1]/btn[43]").press
session.findById("wnd[0]/tbar[0]/btn[3]").press
Exit Sub
ErrorHandler:
MsgBox "Se ha producido un error: " & Err.Description
If Not xlApp Is Nothing Then xlApp.Quit
Set xlWorksheet = Nothing
Set xlWorkbook = Nothing
Set xlApp = Nothing
Set SapGuiAuto = Nothing
Set application = Nothing
Set connection = Nothing
Set session = Nothing
End Sub