Saltar al contenido

Menú de botones


Antoni

Recommended Posts

Ahora sí, muchas gracias Antoni, por fin lo he podido ver, no lo veo tan inutil como tú comentabas, piensa que con esto se le puede dar a un archivo una presentación mucho más profesional, quitando las etiquetas de hojas y utilizando este código.

Un saludo, Germán.

Enlace a comentario
Compartir con otras webs

Hola Germán, me alegro que lo hayas conseguido.

El valor añadido que creo que tiene este aporte es, por un lado, ver las posibilidades del objeto VBProject, y por otro lado te proporciona un formulario con una estructura creada y que se puede utilizar como formulario Menú, añadiéndole otros controles y adaptandolo a tu gusto y a y tus necesidades.

Hasta otra. Salu2. Antoni.

Enlace a comentario
Compartir con otras webs

..... solo una cosa a tener en cuenta, no siempre el formulario generado se llamará Userform1, porqué si ya existe un Userform1 en el momento de generar el formulario, entonces se llamaría Userform2, y así sucesivamente. Intenté cambiar el nombre al generarlo, pero me da un error aleatorio "Error 75 no se encuentra la ruta de acceso", y lo dejé por imposible.

.

en realidad es muy facil de solucionar si usamos la propiedad name del formulario,tal que..al tener un nombre presonalizado,este no generará ningun problema aunque haya mas forms en el VBEditor :rolleyes:

Sub CrearFormularioMenú()
Dim Formulario As Object
Dim Boton As MSForms.CommandButton
'----------------------------------------------------------------------
Set Formulario = ActiveWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
With Formulario
'..........................códig anterior ya comentado
[COLOR="red"][B][B].Properties("Name") = "MiMenuBotones" 'agregado[/B][/B][/COLOR]
End With[/CODE]

por supuesto habrá que cambiar la rutina que abre el form por su nombre personalizado:

[CODE]Private Sub AbreFormulario()
[COLOR="red"][B]MiMenuBotones[/B][/COLOR].Show
End Sub[/CODE]

caray !!!...creo que si proponermelo sigo realizando cambios en la propuesta inicial.

..... Muchas gracias, me quedo con [b]ProcBodyLine [/b]y [b]ReplaceLine[/b], metodos de [b]CodeModule [/b]que no conocia.

Saludos cordiales. Antoni.

ps de que,para esos estamos para compartir :)

por cierto muy utiles para localizar una macro y cambiar su 'contenido'

Enlace a comentario
Compartir con otras webs

Hola _ST:

.Properties("Name") = "MiMenuBotones" 'agregado

Ese es el problema, de cada tres veces, mas o menos, que ejecuto la macro con esa propiedad, dos me da el error descrito en mi último post.

No sigue ninguna regla, igual funciona 5 veces seguidas que falla otras 7.

Por eso opté por pasar del tema.

No obstante, gracias por el interés.

Hasta siempre.

Antoni.

Enlace a comentario
Compartir con otras webs

No sigue ninguna regla' date=' igual funciona 5 veces seguidas que falla otras 7.[/quote']

pues caray no se me habia ocurrido 'usar mal' las macros (y lo digo con todo respeto por las sig razones)

1.-habrá que considerar que alguna utilida se le puede sacar al tema/propuesta :)

2.-entonces nadie deberia crea un menu si este ya fue creado !!!!!

3.-con lo cual resulta evidente que le haria falta código para que esto no ocurriera

4.-pero si aun así el programador (llamase cualquiera de nosotros) desea por simple capricho hacerlo,creo que entonces deberiamos considerar código 'adicional' para evitar los errores

para lo cual se debria/podrian hacer los sig cambios:

1.-incluir el evento terminate del formulario para que al cerrarlo se ejecute una rutina que actualice

las macros ya que algunas estan delcaradas como privadas y no se ven el el cuadro de dialogos de macros

"disponibles"

2.-cambiar la proiedad caption del form que se esta creando programaticamente y usar una funcion para

que nos devuelva el nombre del ultimo formulario8es decir el que estoy creando),de esta manera vere

cuantos forms creo en tiempo de ejecucion y los distinguire uno de otro,cosa que no podia hacer al

tener el caption igual todos los forms que voy creando

3.-se modifica la macro que abre el formulario para que simpre abra el recien creado o ultimo

utilizando para ello un código totalmente distinto y la funcion que regresa el nombre del ultimo

form creado :)

4.-se agrega una cuarta macro que hace lo contrario a la macro "Modificasubrutinas" es decir

regresa las macros a su estado original

5.-se agrega una maro auxiliar que elimina los forms creados durante el ejercicio.-esta no es indispensable

ya que los forms se pueden eliminar manualmente :)

6.-por ultimo se corrige la seccion que copia los eventos intialize y termimnate a los formularios ya que

copiaban y pegaban lineas de mas (hasta la 19 debiendo ser hasta la 11)

demas decirte que ya tengo probado el código y 'al parecer' se eliminan los errores

me la paso presionando Alt+F8 para mostrar el dialogo y ejecutar las macros y enter para aceptar y Alt+F4 para cerrar cada form creado,de esta forma lo hago hasta

que se me cansan los dedos y desp. simplemente elimino todos los forms excepto el primero .)

Enlace a comentario
Compartir con otras webs

Hola _ST:

Muchas gracias por tus consejos, los tendré en cuenta.

Esto para que no se cansen tus dedos, jajaja

Private Sub BorrarFormulario()
Dim Formulario As Object
Dim Boton As MSForms.CommandButton
On Error Resume Next
For x = __ To __
ActiveWorkbook.VBProject.VBComponents.Remove _
ActiveWorkbook.VBProject.VBComponents.Item("Userform" & x)
Next x
End Sub[/CODE]

Saludos cordiales. Antoni.

Enlace a comentario
Compartir con otras webs

Gracias Antoni

en realidad ya tenia la macro que es muy parecido a tu código,solo que al tener una funcion que me regresa el nombre del ultimo form,puedes encontrar la macro con el nombre "EliminaFormularios"

de paso copio/pego todo(a falta de poder subir el archivo) :mad:

los cambios/adiciones ultimas estan marcadas con azul

'APIS BOTONES DE MAXIMIZAR Y MINIMIZAR
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Public Const WS_MINIMIZEBOX As Long = &H20000
Public Const WS_MAXIMIZEBOX As Long = &H10000
Public Const GWL_STYLE As Long = (-16)
'-------------------------------------------------
Private Sub UserForm_Initialize()
Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
'-------------------------------------------------
lngMyHandle = FindWindow("THUNDERDFRAME", "Menú general")
lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX 'Or WS_MAXIMIZEBOX
SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle
End Sub
[COLOR="blue"][B]Private Sub UserForm_Terminate()
Application.Run ("Inviertesubrutinas")
End Sub[/B][/COLOR]
'--------------------------------------------------------------------
' Esta macro, crea un formulario con un botón con el nombre cada hoja
' .Al ejecutar el formulario, se activa la hoja con el nombre del botón
' .Al formulario, se le han añadido las Apis para poder minimizarlo
'--------------------------------------------------------------------
'
Sub CrearFormularioMenú()
Dim Formulario As Object
Dim Boton As MSForms.CommandButton
'----------------------------------------------------------------------
Set Formulario = ActiveWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
With Formulario
.Properties("ShowModal") = False
.[COLOR="blue"][B]Properties("Caption") = Ultimoform [/B][/COLOR]'"Menú general"
.Properties("Width") = 128
.Properties("Height") = Sheets.Count * 25 + 28
'.Properties("Name") = "MiMenuBotones"
End With
'--------------------------------------------------------------------------
Set Desde = ActiveWorkbook.VBProject.VBComponents("Módulo1").CodeModule
With ActiveWorkbook.VBProject.VBComponents(Formulario.Name).CodeModule
.InsertLines .CountOfLines + 1, Desde.Lines([COLOR="blue"][B]11, 11)[/B][/COLOR] 'de la linea 11 copia 11 lineas
End With
'--------------------------------------------------------------------------
x = ActiveWorkbook.VBProject.VBComponents(Formulario.Name).CodeModule.CountOfLines + 1
For m = 1 To Sheets.Count
Set Boton = Formulario.Designer.Controls.Add("forms.CommandButton.1")
With Formulario
'---------------------------------------------------------------------------------
.Designer.Controls(Formulario.Designer.Controls.Count - 1).Name = "Boton" & m
.Designer.Controls(Formulario.Designer.Controls.Count - 1).Caption = Sheets(m).Name
.Designer.Controls(Formulario.Designer.Controls.Count - 1).Width = 120
.Designer.Controls(Formulario.Designer.Controls.Count - 1).Height = 25
.Designer.Controls(Formulario.Designer.Controls.Count - 1).Top = 2 + 25 * (m - 1)
.Designer.Controls(Formulario.Designer.Controls.Count - 1).Left = 2
'----------------------------------------------------------------------------------
.CodeModule.InsertLines x, "Private Sub Boton" & m & "_Click()": x = x + 1
.CodeModule.InsertLines x, "Sheets(""" & Sheets(m).Name & """).Activate": x = x + 1
.CodeModule.InsertLines x, "End Sub ": x = x + 1
'----------------------------------------------------------------------------------
End With
Next m
Modificasubrutinas
MsgBox "el formualrio ha sido creado"
SendKeys "%{F8}"
End Sub
Private Sub AbreFormulario()
'MiMenuBotones.Show
[COLOR="blue"][B]VBA.UserForms.Add(Ultimoform).Show[/B][/COLOR]
End Sub
Private Sub Modificasubrutinas()
Set localiza = ActiveWorkbook.VBProject.VBComponents("Módulo1").CodeModule
n1 = localiza.ProcBodyLine("CrearFormularioMenú", vbext_pk_Proc)
n2 = localiza.ProcBodyLine("AbreFormulario", vbext_pk_Proc)
localiza.ReplaceLine n1, "Private Sub CrearFormularioMenú"
localiza.ReplaceLine n2, "Sub AbreFormulario"
End Sub
[COLOR="blue"][B]Private Sub Inviertesubrutinas()
Set localiza = ActiveWorkbook.VBProject.VBComponents("Módulo1").CodeModule
n1 = localiza.ProcBodyLine("CrearFormularioMenú", vbext_pk_Proc)
n2 = localiza.ProcBodyLine("AbreFormulario", vbext_pk_Proc)
localiza.ReplaceLine n1, "Sub CrearFormularioMenú"
localiza.ReplaceLine n2, "Private Sub AbreFormulario"
End Sub[/B][/COLOR]
[COLOR="blue"][B]Function Ultimoform()
Set forms = ActiveWorkbook.VBProject.VBComponents
For i = 1 To forms.Count
If forms(i).Type = vbext_ct_MSForm Then
f = forms(i).Name
End If
Next i
Ultimoform = f
End Function
Private Sub EliminaFormularios()
Set Formularioa = ActiveWorkbook.VBProject.VBComponents
ultimo = Val(Right(Ultimoform, 1))
For i = ultimo To 2 Step -1
Formularioa.Remove Formularioa(Ultimoform)
Next i
End Sub[/B][/COLOR][/CODE]

[color=red][b]nota:el requisito previo es que exista por lo menos un formulario ya creado para que corra adecuadamente[/b][/color]

Bajar ejemplo desde este enlace: [b]MenuBotonesST[/b]

Enlace a comentario
Compartir con otras webs

Crear una cuenta o conéctate para comentar

Necesitas ser usuario para poder dejar un comentario

Crear una cuenta

Registrarse para una nueva cuenta en nuestra comunidad. ¡Es fácil!

Registrar una nueva cuenta

Conectarse

¿Ya tienes una cuenta? Conéctate aquí.

Conéctate ahora
  • 96 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Prueba este código. Sin el archivo no te puedo ajustar más. Private Sub btnCargaBancos_Click() 'El tipo de dato debe especificase para cada variable Dim TasaCompra As Double, TasaVenta As Double, InvBanesco As Double, InvVzla As Double Dim MontoBanesco As Double, MontoVzla As Double, TasaDiaBan As Double, TasaDiaVzla As Double Dim TasaActual As Double 'Hay que comprobar que los textbox tienen contenido numérico 'Los datos numéricos solo pueden contener números y el separador decimal, cualquier otro caracter dará error al convertir If Not IsNumeric(txtInverBanesco) Or _ Not IsNumeric(txtInverVzla) Or _ Not IsNumeric(txtTasaCompra) Or _ Not IsNumeric(txtTasaVenta) Then MsgBox "Los datos deben ser numéricos", vbCritical Exit Sub End If InvBanesco = CDbl(txtInverBanesco) InvVzla = CDbl(txtInverVzla) TasaCompra = CDbl(txtTasaCompra) TasaVenta = CDbl(txtTasaVenta) 'Los datos de los divisores no pueden ser 0 (Indeterminación matemática) If TasaCompra = 0 Or _ InvBanesco = 0 Or _ InvVzla = 0 Then MsgBox "Los datos no admiten valor cero", vbCritical Exit Sub End If MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055) TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then TasaActual = TasaDiaBan Else TasaActual = TasaDiaVzla End If 'En VBA, los datos numéricos no admiten ser formateados, formatear directamente en las celdas, 'MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) 'MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) 'TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco = MontoBanesco txtBcoVenezuela = MontoVzla txtTasaDiaria = TasaActual End Sub  
    • Hola a ambos, @MarianoCruz, si con la respuesta de @Israel Cassales ya tienes resuelto el problema, perfecto. Punto final y a otra cosa. Pero piensa que tu archivo lleva vínculos externos, así que se hace difícil (prácticamente imposible) comprobar si las propuestas dadas ofrecen el resultado esperado. A tal efecto, te sugiero que vuelvas a subir otro archivo, esta vez insertando nuevas hojas que contengan los datos existentes en esos archivos externos.  Tal vez así se vea claro qué es lo que buscas conseguir, y se puedan hacer pruebas que verifiquen la bondad de el/los resultado/s. Tampoco iría mal que insertaras a mano qué resultado debe aparecer en la celda C3 en cada uno de los 3 casos: cuando se inserte 'XI', 'XL' o unos u otros números en los lugares apropiados. Así iremos totalmente sobre seguro acerca del método a emplear. Saludos,
    • Hi Trate de ver que hacían las fórmulas en cuestión pero a su libro le falta o le faltan hojas, por lo que solo podría participar con un par de ideas en general. Lo que entiendo es que según el valor de B3 en C3 debe poner una fórmula u otra, así que es posible que si combina DIRECCION() con INDIRECTO() pueda intercambiar de una fórmula a otra. =SI(B3="Xl",INDIRECTO(DIRECCION(3,5)),SI(O(B3=1,B3=2,B3=3),INDIRECTO(DIRECCION(4,5)),"")) Otra forma sería poner nombre a esas fórmulas en el cuadro de nombres para que las pueda mandar llamar a una o a la otra según el resultado de B3. Por favor tome en cuenta, es solo una idea.
    • Buenas tardes! Tengo el siguiente código: Private Sub btnCargaBancos_Click() Dim TasaCompra, TasaVenta As Double Dim InvBanesco, InvVzla, MontoBanesco, MontoVzla As Double Dim TasaDiaBan, TasaDiaVzla, TasaActual As Double 'Inversion = Val(txtInversion.Text) InvBanesco = Val(CDbl(txtInverBanesco.Text)) InvVzla = Val(CDbl(txtInverVzla.Text)) TasaCompra = Val(CDbl(txtTasaCompra.Text)) TasaVenta = Val(CDbl(txtTasaVenta.Text)) MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055)      TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then     TasaActual = TasaDiaBan Else     TasaActual = TasaDiaVzla End If MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco.Value = MontoBanesco txtBcoVenezuela.Value = MontoVzla txtTasaDiaria.Value = TasaActual End Sub   Como se puede apreciar InvBanesco ,  InvVzla , TasaCompra y TasaVenta, son valores que introduce el usuario a través de los respectivos cuadros de texto. Tengo los siguientes problemas: a. Las fórmulas no se ejecutan correctamente (pareciese que no reconociese los números entrados vía cuadros de texto). b. Al darle valor cero (0) a cualquiera de los valores de InvBanesco o  InvVzla, me genera un error en TasaDiaBan o TasaDiaVzla (según sea el caso), aunque, como se puede apreciar, debería generar un valor cero (0). Como dije en mi presentación estoy empezando en esto de la codificación...y quiero aprender de Uds! Agradezco su ayuda! Nota: lamentablemente el fichero es mas grande de lo permitido y no pude anexarlo.  
    • Hola buenas tardes. En una hoja plantilla donde realizo diferentes consultas de datos. tengo ya establecido dos formulas diferentes con función SI y buscar. estos buscan diferentes rangos de datos y recibendiferentes resultados. Cada formula varia según una palabra o numero  ejemplo si pongo Xl pone la formula 1 y si pongo cualquier numero entre 1 y 3 pone la segunda formula. Lo que necesito hacer es que si en una celda de la columna B3 pongo XL debería de considerar la formula 1 y si pusiera el numero 1 me pondría la segunda formula, dentro de la misma formula. Ya agregue la función SI($C3="Xl",Formula1.. Pero no me funciona, espero me puedan ayudar.   Muchas gracias Mariano   Formula doble si en celda existe.xlsx
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.