............ Foro Excel
Si no lo has hecho aún: REGISTRATE!!!

API's y Form_Load

Ver el tema anterior Ver el tema siguiente Ir abajo

API's y Form_Load

Mensaje por GalileoGali el Vie Ene 09, 2009 5:56 pm

Supongamos que ya tengo identificada/s la/s API que necesito para determinado Efecto y Tengo el Codigo en un Ejemplo...
En ese Ejemplo, generalmente pensado para VISUAL BASIC y no para VBA, aparece frecuentemente una Macro de evento del tipo Sub Form_Load()
Uno se ve tentado de escribir aalgo analogo usando Sub Userform1_Initialize,
Ahora bien, es esto tan así?
y
si yo no necesito ni quiero utilizar un Userform (impensable para VB?, pero totalmente natural en VBA) como adapto el Codigo?....
¿siempre se puede evitar el Form, estando en VBA?

_________________
GalileoGali
M.A.P. 2010-2013
Microsoft Active Professional
avatar
GalileoGali
Admin

Masculino Cantidad de envíos : 1962
Edad : 61
Ciudad - Pais : QUIROGA, Argentina
Version de Excel : 2000-2003-2007-2010
Fecha de inscripción : 24/01/2008

http://excelgali.mejorforo.net

Volver arriba Ir abajo

Re: API's y Form_Load

Mensaje por P@li el Vie Ene 09, 2009 7:09 pm

En mi experiencia, es tan así.
Hice una prueba, los que tengan VB6.0 lo pueden intentar.

1) Demostracion Práctica de la "igualdad funcional" entre el Form_Load de VB y el Userform1_Initialize de VBA
En un módulo de Excel escribí esto:
sub prueba()
load Userform1
end sub

En el formulario Userform1 escribí esto:
Private Sub UserForm_Initialize()
MsgBox "load"
End Sub

Cuando ejecuto el procedimiento prueba(), carga el formulario Userform1, al hacerlo automaticamente se llama al evento Initialize del formulario.

En Visual Basic, agregué un módulo, escribi un procedimiento llamado Sub Main(), en las propiedades del proyecyo, hay una opción que dice Objeto Inicial, ahí coloqué Sub_Main.

En el módulo escribí:
Sub main()
Load Form1
End Sub

y en el formulario Form1:
Private Sub Form_Load()
MsgBox "load"
End Sub

El resultado fue exactamente el mismo, por eso, no me cabe duda que ambos eventos son análogos, seguramente no son idénticos, pero para lo que nosotros generalmente los necesitamos, ambos eventos no presentan diferencias aparentes.

Resumiendo el experimento:
Load (para un Form de VB) desencadena (el Evento,.....) Form_Load
Load (para un Userform de VBA) desencadena (el evento,...) Userform_Initialize


2) Es necesario utilizar un Objeto Userform en VBA, para estructurar una API?

Sí, siempre se puede evitar el Userform1 en VBA, salvo que necesitemos declarar variables Global, ya que no se pueden declarar en un Objeto, generalmente las APIs no requieren este tipo de declaración de variables.
Respuesta: SI, en VBA.....

Pero no es impensable prescindir de un formulario en VB, como dije antes, en las propiedades del proyecto se elige Sub_Main como Objeto Inicial, y se agrega un módulo con un procedimiento llamado Sub Main(), que hará las veces de un Form1_Load(), de esta manera se pueden eliminar todos los formularios y solamente trabajar con un módulo. Obviamente, al salir del procedimiento Sub Main, el programa también finaliza.

Respuesta: SI, por qué no?, tambien en VB....


Última edición por GalileoGali el Vie Ene 09, 2009 8:03 pm, editado 1 vez (Razón : Puse algunos acápites y sub-acápites, a modo aclaratorio....)

P@li
Admin

Masculino Cantidad de envíos : 243
Edad : 33
Ciudad - Pais : Buenos Aires, Argentina
Version de Excel : Microsoft Excel 2002 (10.2614.2625)
Fecha de inscripción : 03/03/2008

Volver arriba Ir abajo

Re: API's y Form_Load

Mensaje por GalileoGali el Vie Ene 09, 2009 8:13 pm

Por ahora, pensemos en API´s dentro de VBA: ¿Te parece?. Así que tu ultimo párrafo lo consideraremos una aclaración interesante y vale el que la hayas hecho !!!,
pero me gustaría concentrarnos más sobre como evitar un USERFORM en VBA
y traigo un ejemplo que creo es muy breve y permitiria manipular código, en procura de un mejor entender:
Código:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1
Private Sub Form_Load()
 
    ShellExecute Me.hwnd, vbNullString, "mailto:galileogali-excel@hotmail.com", vbNullString, "C:\", SW_SHOWNORMAL
End Sub


Última edición por GalileoGali el Sáb Ene 10, 2009 2:48 pm, editado 2 veces

_________________
GalileoGali
M.A.P. 2010-2013
Microsoft Active Professional
avatar
GalileoGali
Admin

Masculino Cantidad de envíos : 1962
Edad : 61
Ciudad - Pais : QUIROGA, Argentina
Version de Excel : 2000-2003-2007-2010
Fecha de inscripción : 24/01/2008

http://excelgali.mejorforo.net

Volver arriba Ir abajo

Re: API's y Form_Load

Mensaje por P@li el Vie Ene 09, 2009 11:50 pm

Si no entiendo mal, querés ejecutar ese código en VBA sin usar formularios.
No es difícil, el hWnd de la aplicación que llama a ShellExecute puede ser tranquilamente el del mismo Excel.

En un módulo de VBA:
Código:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1
Public Sub Auto_Open()
    ShellExecute Application.hwnd, vbNullString, "mailto:galileogali-excel@hotmail.com?subject=Funciona!!&body=aleluya", vbNullString, "C:\", SW_SHOWNORMAL
End Sub

P@li
Admin

Masculino Cantidad de envíos : 243
Edad : 33
Ciudad - Pais : Buenos Aires, Argentina
Version de Excel : Microsoft Excel 2002 (10.2614.2625)
Fecha de inscripción : 03/03/2008

Volver arriba Ir abajo

Re: API's y Form_Load

Mensaje por GalileoGali el Dom Ene 11, 2009 8:41 am

Clarisimo y sencillito, entonces para que "de paso" el ejemplo nos sea útil pongo acá un material que aclara las virtudes de ShellExecute y sus parametros y constantes

extraido de :
[Tienes que estar registrado y conectado para ver este vínculo]


la función del api shellexecute sirve para ejecutar un programa, imprimir un archivo, ejecutar un acceso directo, la aplicación asociada a un fichero, abrir una ventana del explorer de archivos, etc.

la función del api shellexecute sirve para ejecutar un programa, imprimir un archivo, ejecutar un acceso directo, la aplicación asociada a un fichero, abrir una ventana del explorer de archivos, etc. es decir, es como hacer doble click sobre un archivo en el explorador de archivos.

declaramos la función :

private declare function shellexecute lib "shell32.dll" alias _
"shellexecutea" (byval hwnd as long, byval lpoperation as string, _
byval lpfile as string, byval lpparameters as string, _
byval lpdirectory as string, byval nshowcmd as long) as long

y para usarla simplemente :

dim res as long
res = shellexecute(me.hwnd, "open", "c:\documento.doc","", "", 1)


los parámetros de la función son los siguientes :

hinstance shellexecute(

hwnd hwnd, // handle de la ventana padre
lpctstr lpoperation, // puntero a string que especifica la operación a realizar
lpctstr lpfile, // puntero a string con el nombre del fichero o directorio
lpctstr lpparameters, // puntero a string con los parámetros del fich.ejecutable
lpctstr lpdirectory, // puntero a string que especifica el directorio por defecto
int nshowcmd // cómo se muestra el fichero cuando se abre
);


parametros

hwnd

especifica la ventana padre. esta ventana recive los messagebox que produzca
la aplicación. por ejemplo, una aplicación puede reportar un error
produciendo un messagebox.

lpoperation

puntero a un "null-terminated" string que especifica la operación a
realizar. las operaciones válidas son :

"open" : la función abre el fichero especificado por lpfile. el fichero
puede ser un fichero ejecutable, un documento o un directorio para abrir.

"print" : la función imprimirá el fichero especificado en lpfile. el fichero
debe ser un documento. si el fichero es un ejecutable la función lo abre
como si se hubiera especificado "open".

"explore" : la función "explorará" el directorio especificado en lpfile.

"find" : aparece el diálogo "buscar archivos". podemos especificar en el
parámetro lpfile el directorio a partir del cual queremos buscar.

el parámetro lpoperation puede ser null. en este caso la función abre el
fichero especificado en lpfile.

lpfile

puntero a un "null-terminated" string que especifica el fichero a abrir o
imprimir o el directorio a abrir o explorar. la función puede abrir un
fichero ejecutable o un documento pero sólo puede imprimir un documento.

lpparameters

si lpfile especifica un fichero ejecutable, lpparameters es un puntero a un
"null-terminated" string que indica los parámetros que deben ser pasados a
la aplicación. si lpfile es un documento, lpparameters debe ser null.

lpdirectory

puntero a un "null-terminated" string que indica el directorio por defecto.

nshowcmd

si lpfile es un fichero ejecutable, nshowcmd indica cómo se mostrará la
aplicación cuando se abra. este parámetro puede tener los siguientes valores
:

sw_hide: oculta la ventana y activa otra ventana.
sw_maximize : maximiza la ventana.
sw_minimize : minimiza la ventana y activa la siguiente.
sw_restore : activa y muestra la ventana. si la ventana está minimizada o maximizada, windows la restaura a sus originales tamaño y posición. una aplicación debe especificar esta opción cuando restaura una ventana minimizada.
sw_show : activa la ventana y la muestra con su posición y tamaño actuales.
sw_showdefault : da valor al "show state" basado en el flag sw_ especificado en la estructura startupinfo pasada a la función createprocess por el programa que arrancó la aplicación. una aplicación debe llamar a showwindow con este flag para dar valor al estado inicial de su ventana principal.
sw_showmaximized : activa la ventana y la maximiza.window.
sw_showminimized : activa la ventana y la minimiza.
sw_showminnoactive : muestra la ventana minimizada. la ventana activa permanece activa.
sw_showna : muestra la ventana en su estado actual. la ventana activa permanece activa.
sw_shownoactivate : muestra la ventana en sus más recientes tamaño y posición. la ventana activa permanece activa
sw_shownormal : activa y muestra una ventana. si la ventana estaba minimizada o maximizada, windows la restaura a su tamaño y posición originales. una aplicaciñón debe especificar este flag cuando muestra una ventana por primera vez.
si lpfile es un documento, nshowcmd debe ser cero.


valores devueltos

si la función va bien, el valor devuelto es el "instance handle" de la aplicación lanzada, o el handle de una aplicación servidora de dde.
si la función falla, el valor devuelto es un error menor o igual que 32 :

0 : falta memoria o reursos.
error_file_not_found : fichero no encontrado
error_path_not_found : directorio no encontrado
error_bad_format : fichero .exe inválido
se_err_accessdenied : acceso denegado
se_err_associncomplete : la asociación del fichero es inválida o incompleta
se_err_ddebusy : la opreación dde no puede ser completada porque se está procesando otra operación dde
se_err_ddefail : la operación dde falló
se_err_ddetimeout : time out en la operación dde
se_err_dllnotfound : dll no encontrada
se_err_fnf : fichero no encontrado
se_err_noassoc : no hay aplicación asociada con la extensión dada
se_err_oom : no hay memoria suficiente para completar la operación
se_err_pnf el camino especificado no fue encontrado
se_err_share violación de compartición


comentarios

el fichero especificado por el parámetro lpfile puede ser un archivo de documento o un archivo ejecutable. si es un documento, la función shellexecute lo abre o lo imprime, según el valor del parámetro lpoperation.
si es un archivo ejecutable lo abrirá aunque lpoperation especifique que se imprima.
puedes usar shellexecute para abrir o explorar una carpeta. para abrir una carpeta usa una de las siguientes llamadas :

shellexecute(handle, null, path_to_folder, null, null, sw_shownormal);

shellexecute(handle, "open", path_to_folder, null, null, sw_shownormal);


para explorar una carpeta emplea la siguiente llamada :

shellexecute(handle, "explore", path_to_folder, null, null, sw_shownormal);

si lpoperation es null, la función abre el fichero especificado por lpfile.
si lpoperation es "open" o "explore", la función abrirá una ventana o el explorador de windows

_________________
GalileoGali
M.A.P. 2010-2013
Microsoft Active Professional
avatar
GalileoGali
Admin

Masculino Cantidad de envíos : 1962
Edad : 61
Ciudad - Pais : QUIROGA, Argentina
Version de Excel : 2000-2003-2007-2010
Fecha de inscripción : 24/01/2008

http://excelgali.mejorforo.net

Volver arriba Ir abajo

Re: API's y Form_Load

Mensaje por P@li el Lun Ene 12, 2009 10:15 am

Hola Gali,
Excelente explicación, muy instructiva y útil.
Quería hacer una observación con respecto a las constantes, antes de usarlas siempre hay uqe declararlas, para poder referirnos a cada una de ellas por su nombre y no por su valor.
Con Visual Basic 6.0 viene una aplicación que se llama Visor de API, con él podemos extraer infinidad de declaraciones, constantes y tipos que son imprescindibles para la programación con APIs de Windows.
A continuación dejo una lista de constantes de ShowWindows que estimo deben ser similares a las que usa ShellExecute, en el parámetro nshowcmd.

Public Const SW_ERASE = &H4
Public Const SW_HIDE = 0
Public Const SW_INVALIDATE = &H2
Public Const SW_MAX = 10
Public Const SW_MAXIMIZE = 3
Public Const SW_MINIMIZE = 6
Public Const SW_NORMAL = 1
Public Const SW_OTHERUNZOOM = 4
Public Const SW_OTHERZOOM = 2
Public Const SW_PARENTCLOSING = 1
Public Const SW_PARENTOPENING = 3
Public Const SW_RESTORE = 9
Public Const SW_SCROLLCHILDREN = &H1
Public Const SW_SHOW = 5
Public Const SW_SHOWDEFAULT = 10
Public Const SW_SHOWMAXIMIZED = 3
Public Const SW_SHOWMINIMIZED = 2
Public Const SW_SHOWMINNOACTIVE = 7
Public Const SW_SHOWNA = 8
Public Const SW_SHOWNOACTIVATE = 4
Public Const SW_SHOWNORMAL = 1


Saludos,

P@li
Admin

Masculino Cantidad de envíos : 243
Edad : 33
Ciudad - Pais : Buenos Aires, Argentina
Version de Excel : Microsoft Excel 2002 (10.2614.2625)
Fecha de inscripción : 03/03/2008

Volver arriba Ir abajo

Re: API's y Form_Load

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 
Permisos de este foro:
No puedes responder a temas en este foro.