Error: se requiere un objeto... En userform

Tengo este código en un userform :
Private Sub UserForm_Initialize()
Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
'Obtenemos el "Handle" del Userform
lngMyHandle = FindWindow("THUNDERDFRAME", Me.Caption)
'Obtenemos el estilo actual del UserForm
lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
'Creamos un nuevo estilo de titulo con los botones deseados
lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX
'Aplicamos las nuevas propiedades al UserForm
SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle
end sub

Pero este, al momento de ejecutarlo me muestra un error ("se requiere un objeto")
Pero en el momento que agrego el nombre completo del userform en la primera linea ("USERFORM8"), ya no me aparece este error y me abre mi formulario, pero no me lo abre correctamente, pues no me trae el botón de Minimizar como se lo estoy diciendo en la instrucción del código.

1 Respuesta

Respuesta
3

¿Puedes mandarme el fichero?

Mi correo es

[email protected]

Pon como asunto el título de la pregunta y como nombre del fichero pon

ErrorRequiereObjeto.XLSM

Este tipo de funciones se tienen que declarar en un módulo con DECLARES, no sé si lo habrás hecho. Y hay una complicación adicional con los sistemas de 64 bits que las instrucciones son distintas que para los Windows de 32 bits. Yo lo tengo de 64 y si tu lo tienes de 32 no serviría lo que te mandara. Dime si tu windows es 32 o 64 e intentaré hacer lo que pueda si no lo tienes de 64.

Hola!

el archivo es demasiado pesado y no me deja enviarlo.

y si paso el userform a otra hoja donde esta mi problema, ya no me sale este...

me explicas bien:

"Este tipo de funciones se tienen que declarar en un módulo con DECLARES, no sé si lo habrás hecho. Y hay una complicación adicional con los sistemas de 64 bits que las instrucciones son distintas que para los Windows de 32 bits. Yo lo tengo de 64 y si tu lo tienes de 32 no serviría lo que te mandara. Dime si tu windows es 32 o 64 e intentaré hacer lo que pueda si no lo tienes de 64."
Mil gracias

Es un poco complicado. Este tipo de programación solo está al alcance de los programadores expertos. Se usan las funciones que contienen las ficheros DLL lo que se llama la API de Windows. Hay miles de funciones en ella, pero ya te he dicho que es para un nivel bastante alto de programación. Pero de vez en cuando ves alguna página web donde se ha hecho uso de alguna de esas funciones. Yo conteste hace poco una pregunta que usaba una DLL, es esta:

Averiguar el nombre de usuario Windows

En esencia, para poder usar una función de estas en Excel, se tiene que crear una función Excel similar a la función que hay en la DLL. Y se tiene que declarar con una sentencia Declare (de tan poco que lo he usado me parecía que era Declares).

Esa declaración contiene parámetros enteros que van a actuar como punteros. Entonces el problema está en que en los sistemas de 32 bits loas punteros son de 32 bits y en los de 64 son de 64 y puede haber problemas en las direcciones de memoria. Para que una DLL de 32 funcione en un sistema de 64 se tienen que hacer algunos arreglos como poner la sentencia

Declare PtrSafe

Y usar el tipo LongPtr en lugar de Long en algún caso.

Entonces yo solo podría probar la macro que necesita un sistema de 64 y no la de 32, aunque a lo mejor conseguiría que te funcionara.

En esa macro aparecen las funciones GetWindowLong y SetWindowLong, las cuales estoy seguro que están en una DLL y para que todo funcione bien tienen que estar declaradas en algún módulo de Visual Basic, normalmente en las líneas primeras. Mira a ver si tienes esas sentencias Declare. Otra cosa intereseante es que dijeras la línea donde se produce el fallo, eso se sabe dandoa depurar cuando se produce.

Bueno, en el Google se puede encontrar de todo

Información de Microsoft

En efecto, son fuciones de la API que están en el fichero User32.DLL

Poco más puedo decirte, este es un tema que aun tengo mucho que aprender y tu fichero me habría venido bien para probar y aprender. No me lo podrías pasar por Dropbox o algo similar. Aunque no manejo yo muy bien cómo se puede hacer eso pero a mi me han pasado ficheros de esa forma el que sabía hacerlo.

Hola!

el conocimiento que tengo de visual basic es muy básico...

la cosa es que tengo otros userform similares en el mismo libro y este si me funciona correctamente... ese es el único que me saca ese problema...

No lo entiendoo!

Tu problema creo que es el típico problema de hacer que el formulario tenga el botón de minimizar. Por el mismo precio aquí tienes un código tomado de internet que te hará que tenga el botón minimizar y maximizar.

Además lo he probado y funciona con el mismo código en Windows 32 y 64.

Si tu Windows es de 64 simplemente pon esto en tu módulo userform. Antes quita la que tienes o ponle comentarios a las líneas.

Option Explicit
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const GWL_STYLE As Long = (-16)
Private Sub UserForm_Initialize()
 Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
 If Application.Version < 9 Then
 lngMyHandle = FindWindow("THUNDERXFRAME", Me.Caption)
 Else
 lngMyHandle = FindWindow("THUNDERDFRAME", Me.Caption)
 End If
 lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
 lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
 SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle
End Sub

Si es de 32 bits haz lo mismo pero quita la palabra PtrSafe que aparece en las tres primeras líneas.

Ojala te funcione bien, como no tengo tu fichero no lo sé. Tampoco sé si en otro módulo tienes las sentencias Declare y pueda haber algún conflicto. Pero bueno, si pruebas esto en un libro nuevo te tendría que funcionar y de ahí hacer las correcciones que necesite el que tienes.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas