Página 1 de 1

Abrir libros de Excel

Publicado: 13 Sep 2016, 10:32
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

Re: Abrir libros de Excel

Publicado: 15 Sep 2016, 17:28
por Dany
Hola. Lo único que tienes que hacer es remplazar ShellExecute por ShellExecuteWait.


Saludos :smt027

Re: Abrir libros de Excel

Publicado: 16 Sep 2016, 09:54
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)

Re: Abrir libros de Excel

Publicado: 16 Sep 2016, 14:43
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

Re: Abrir libros de Excel

Publicado: 17 Sep 2016, 09:19
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.

Re: Abrir libros de Excel

Publicado: 17 Sep 2016, 13:40
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

Re: Abrir libros de Excel

Publicado: 17 Sep 2016, 23:25
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

Re: Abrir libros de Excel

Publicado: 18 Sep 2016, 00:00
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

Re: Abrir libros de Excel

Publicado: 18 Sep 2016, 20:01
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