Abrir libros de Excel

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Clarck
Mensajes: 5
Registrado: 13 Sep 2016, 08:38

Abrir libros de Excel

Mensaje por Clarck »

Hola a todos.
Soy completamente nuevo en la programación de Autoit. Buscando en el foro encontré el siguiente código que abre todos los archivos con una extensión dada en un directorio. Pero los abre todos a la vez. Me gustaría adaptarlo para poder abrir todos los libros de Excel que hay en un directorio. Pero no todos a la vez sino uno detrás de otro. Es decir, abrir un libro cuando el anterior se haya cerrado. ¿Cómo podría hacerlo y que además me pregunte en qué directorio quiero trabajar?

Os estaría muy agradecido si encontrara una solución.

Saludos
Adjuntos
abrir_libros_directorio.au3
(575 Bytes) Descargado 288 veces
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Abrir libros de Excel

Mensaje por Dany »

Hola. Lo único que tienes que hacer es remplazar ShellExecute por ShellExecuteWait.


Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Clarck
Mensajes: 5
Registrado: 13 Sep 2016, 08:38

Re: Abrir libros de Excel

Mensaje por Clarck »

Gracias Dany por tu aporte.
Con la función ShellExecuteWait me abre los libros uno por uno. Llama al siguiente cuando cierro Excel y el libro. Pero, para que la ejecución sea más rápida, ¿habría alguna forma de que no se cierre Excel? (Sólamente cada uno de los libros)
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Abrir libros de Excel

Mensaje por Dany »

Hola. SI entendí bien. tendrías que usar la UDF de excel. entonces podrías hacer algo así.

Código: Seleccionar todo

#include <File.au3>
#include <Array.au3>
#include <Excel.au3>


Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc") ;Esto para evitar error al verificar un archino que no existe

Local $oExcel = _Excel_Open() ;Crear la instancia de Excel

;Mostrar la cuadro de dialogo para seleccionar la carpeta a trabajar
Local $sCarpetaParaBuscarArchivos = FileSelectFolder("Seleccione la Carpeta para abrir los libros de Excel", @ScriptDir)

Local $sNombreHoja = 0
;si la carpeta es correcta procesar
If $sCarpetaParaBuscarArchivos Then
	Local $aFiles = _FileListToArray($sCarpetaParaBuscarArchivos, "*.xlsx", 0, True) ;cambiar a la extensión Correcta  "*.xlsm"
;~ 	_ArrayDisplay($aFiles)
	For $i = 1 To $aFiles[0]
		$sNombreHoja = StringTrimLeft($aFiles[$i], StringInStr($aFiles[$i], '\', Default, -1)) ;Obtenemos el nombre de la hoja de excel
		_Excel_BookOpen($oExcel, $aFiles[$i])

		;Esperamos hasta quee no exista la hoja de excel para continuar con la siguiente...
		While IsObj($oExcel.Workbooks($sNombreHoja))
			Sleep(100)
		WEnd

	Next
Else
	MsgBox(64, "Información", "No seleccionó ninguna carpeta")
EndIf


; User's COM error function. Will be called if COM error occurs
Func _ErrFunc($oError)
	; Do anything here.
;~     ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
;~             @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
;~             @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
;~             @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
;~             @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
;~             @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
;~             @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
;~             @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
;~             @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
;~             @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc


Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Clarck
Mensajes: 5
Registrado: 13 Sep 2016, 08:38

Re: Abrir libros de Excel

Mensaje por Clarck »

Magistral !! Funciona !!

Un único "pero". Cada hoja de Excel lleva una macro VBA asociada que se ejecuta al abrir el libro con un Auto_Open(). Ahora con la UDF de Excel no se ejecutan las macros VBA. ¿Habría que añadir alguna función para que se ejecuten las macros de Excel?

Continuaré visitando periódicamente este foro y aprendiendo de los maestros del Autoit.
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Abrir libros de Excel

Mensaje por Dany »

Hola. Unas Dudas.

Cuando abres el excel con doble click el macro se ejecuta automáticamente?

Cuando abres el excel con ShellExecute el macro se ejecuta automáticamente?

En cada hoja de excel el macro tiene el mismo nombre?


Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Clarck
Mensajes: 5
Registrado: 13 Sep 2016, 08:38

Re: Abrir libros de Excel

Mensaje por Clarck »

Hola Dany.

Respondo a las preguntas:

- cuando abro excel con doble click la macro se ejecuta automáticamente.
- con ShellExecute la macro también se ejecuta automáticamente.
- las macros tienen el mismo nombre en todos los libros de excel.

Saludos
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Abrir libros de Excel

Mensaje por Dany »

Hola. Podrías probar si el macro se ejecuta de esta forma.

Código: Seleccionar todo






#include <File.au3>
#include <Array.au3>
#include <Excel.au3>


Local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc") ;Esto para evitar error al verificar un archino que no existe

Local $oExcel = _Excel_Open() ;Crear la instancia de Excel

;Mostrar la cuadro de dialogo para seleccionar la carpeta a trabajar
Local $sCarpetaParaBuscarArchivos = FileSelectFolder("Seleccione la Carpeta para abrir los libros de Excel", @ScriptDir)

Local $sNombreHoja = 0
;si la carpeta es correcta procesar
If $sCarpetaParaBuscarArchivos Then
   Local $aFiles = _FileListToArray($sCarpetaParaBuscarArchivos, "*.xlsx", 0, True) ;cambiar a la extensión Correcta  "*.xlsm"
;~    _ArrayDisplay($aFiles)
   For $i = 1 To $aFiles[0]
      $sNombreHoja = StringTrimLeft($aFiles[$i], StringInStr($aFiles[$i], '\', Default, -1)) ;Obtenemos el nombre de la hoja de excel
      _Excel_BookOpen($oExcel, $aFiles[$i])
       $oExcel.Run("Coloca el nombre del macro aqui")
      ;Esperamos hasta quee no exista la hoja de excel para continuar con la siguiente...
      While IsObj($oExcel.Workbooks($sNombreHoja))
         Sleep(100)
      WEnd

   Next
Else
   MsgBox(64, "Información", "No seleccionó ninguna carpeta")
EndIf


; User's COM error function. Will be called if COM error occurs
Func _ErrFunc($oError)
   ; Do anything here.
;~     ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _
;~             @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _
;~             @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _
;~             @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _
;~             @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _
;~             @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
;~             @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _
;~             @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
;~             @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
;~             @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF)
EndFunc   ;==>_ErrFunc

Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Clarck
Mensajes: 5
Registrado: 13 Sep 2016, 08:38

Re: Abrir libros de Excel

Mensaje por Clarck »

Insuperable Dany !!

He añadido también al código la siguiente linea que carga el libro de macros personal de Excel:

$oExcel.Run("PERSONAL.XLSB")

Muy agradecido. Seguieré con detalle todas las entradas de este foro y aprendiendo de ello.

:smt038
Responder