¿ComboBox se ejecute sólo cuando cambia el valor?

Soy nuevo en este foro y algo también en vba, por lo que espero no ser muy inocente con la pregunta...
Tengo en un UserForm un ComboBox al que le tengo asignada una macro y el valor de una celda. Al ejecutar el UserForm, se ejecuta también la macro asignada al ComboBox. ¿Cómo puedo hacer para que sólo se ejecute cuando seleccione un valor distinto en el ComboBox, es decir, sólo al cambiar el valor? Muchas gracias de antemano... Os dejo la Macro del ComboBox:
Private Sub ComboBox1_Change()
ActiveCell.Offset(0, 25).Value = ComboBox1
If ComboBox1.Value = "REGULARIZAR" Then
ActiveCell.Offset(0, 17).FormulaR1C1 = "REG. FRA. " & ActiveCell.Offset(0, 1).Text & "/" & Format(ActiveCell.Offset(0, 0).Value, "yy")
End If
End Sub

1 Respuesta

Respuesta
1
Cuando acrgas el form, se activa de inmediato el evento change del macro, lo que puedes hacer es declarar una variable del tipo bolean (public) y en el evento load del form le pasas el valor a true
en el macro del combo pon esto:
Private Sub ComboBox1_Change()
if variable=false then
   ActiveCell.Offset(0, 25).Value = ComboBox1
   If ComboBox1.Value = "REGULARIZAR" Then
   ActiveCell.Offset(0, 17).FormulaR1C1 = "REG. FRA. " & ActiveCell.Offset(0, 1).Text & "/" & Format(ActiveCell.Offset(0, 0).Value, "yy")
   variable=false
   End If
end if
End Sub
De esta forma la variable boleana sera true solo la vez en que se cargue el form por consiguiente no se correrá el macro al inicio
bueno es una idea
Hola, antes de nada, muchísimas gracias por responderme y perdona por haber tardado tanto en hacerlo yo...
Como te comenté soy algo nuevo en esto y hay cosas que aún no he probado, como boolean que no controlo en absoluto. Efectivamente, no me expliqué del todo bien ¡Mea culpa!.
No es en el Load del UserForm cuando se ejecuta la macro sino al activar un CommandButton, ahí tengo asignada una macro, que a continuación te la adjunto, y es ahí cuando se ejecuta automáticamente la macro del Combo.
Lo que quisiera es que al ejecutar el CommButtom no se activara la macro del Combo sino, sólo, al cambiar un valor que seleccione directamente desde la lista del Combo.
'Macro CommandButton1
Private Sub CommandButton1_Click()
On Error GoTo NoEncuentra
ActiveSheet.Range("B2:B65000").Find(what:=NumFra, LookIn:=xlFormulas, _
lookat:=xlWhole, SearchOrder:=xlByColumns, searchdirection:=xlNext, MatchCase:= _
False).Select
ActiveCell.Offset(0, -1).Select
With ActiveCell
Label1 = .Offset(0, 5).Value
'hay más labels, no las pongo para no exajerar
'Fecha prox. vencimientos
If .Offset(0, 16).Value = 0 Then
Label47.Visible = False
Label48.Visible = False
Label46 = "Fecha de Vencimiento"
Else
Label47.Visible = True
Label48.Visible = True
Label47 = .Offset(0, 16).Value
Label46 = "Fecha 1er Vencimiento"
End If
'Página Financiación
TextBox4 = .Offset(0, 24).Value
TextBox4.Text = Format(TextBox4.Value, "#,##0.00 ?")
TextBox5 = .Offset(0, 25).Value
ComboBox1 = .Offset(0, 25).Value
TextBox9 = .Offset(1, 24).Value
TextBox9.Text = Format(TextBox9.Value, "#,##0.00 ?")
End With
'finalizar
Exit Sub
NoEncuentra:
MsgBox "Factura no remesada"
End Sub
'lista del combo que se carga al ejecuar la macro
Private Sub UserForm_Activate()
ComboBox1.AddItem "REMESAR"
ComboBox1.AddItem "DEVOLUCIÓN"
ComboBox1.AddItem "REGULARIZAR"
ComboBox1.AddItem "ABONO"
'macro con tus modificaciones que supongo valdrán para esto. Lo que me da que sí necesitaré es cómo aplicar la condición de boolean a la variable. Imagino que en vez de en el load del UserForm será en el Private Sub del CommandButton1.
Private Sub ComboBox1_Change()
if variable=false then
   ActiveCell.Offset(0, 25).Value = ComboBox1
   If ComboBox1.Value = "REGULARIZAR" Then
   ActiveCell.Offset(0, 17).FormulaR1C1 = "REG. FRA. " & ActiveCell.Offset(0, 1).Text & "/" & Format(ActiveCell.Offset(0, 0).Value, "yy")
   variable=false
   End If
End if
End Sub
De nuevo, muchísimas gracias!
Da igual si esta en un botón, el macro corre en la primera instancia del evento change, pues el evento load llama al anterior (evento change).
Pregunta: ¿Hiciste lo que te indique?... para declarar la variable boleana ( tipo de variable que admite solo dos valores posibles "true o false")
debe en el editor de Vbasic  ir a la primera linea (antes de cualquier linea)  pones dim variable as Boolean  y luego  en el evento load del form le pasas el valor a true
variable=true
luego en el codigo del combo pones:
Private Sub ComboBox1_Change()
if variable=false then
   ActiveCell.Offset(0, 25).Value = ComboBox1
   If ComboBox1.Value = "REGULARIZAR" Then
   ActiveCell.Offset(0, 17).FormulaR1C1 = "REG. FRA. " & ActiveCell.Offset(0, 1).Text & "/" & Format(ActiveCell.Offset(0, 0).Value, "yy")
   variable=false
   End If
end if
End Sub
Hola! Muchas gracias de antemano y perdona de nuevo la tardanza en responder. No he estado en la oficina...
Lo probé, sí, pero sigue cambiando cuando ejecuto la macro de búsqueda "Private Sub CommandButton1_Click()".
Te detallo el evento Load que tengo, por si el lío lo he montado ahí:
Sub Consulta()
Dim variable As Boolean
Load UserForm1
variable = True
UserForm1.Show
End Sub
También lo he probado dando el valor 'true' a la variable después de mostrar el UserForm1.
Te cuento otra cosilla también por si donde la estoy liando es aquí:
A veces, el valor 'REGULARIZAR', necesito dejarlo pero tengo que cambiar la celda donde, con la macro, escribo: "REG. FRA. " & ActiveCell. Offset(0, 1). Text & "/" & Format(ActiveCell. Offset(0, 0).Value, "yy")... escribiendo directamente (manualmente) en la hoja y celda correspondiente del excel, otro valor.
¿Cabe la posibilidad de que aquí es donde esté montando el lío?
De nuevo muchísimas gracias y... de nuevo, perdona por tardar en contestarte!
Esto
Sub Consulta()
Dim variable As Boolean
Load UserForm1
variable = True
UserForm1.Show
End Sub
NO es lo que te indique
La variable boleana la debes declarar como publica ( debes hacerlo en la primera linea del editor de visual basic no en el sub tal vez la primera linea te encuentres con esto Option Explicit si aparece esto declaras la variable bajo esta linea
cuando hablo del evento load del form me refiero a esto
Private Sub UserForm_Initialize()
    variable = True
End Sub
Luego en el codigo del combo pones:
Private Sub ComboBox1_Change()
if variable=false then
   ActiveCell.Offset(0, 25).Value = ComboBox1
   If ComboBox1.Value = "REGULARIZAR" Then
   ActiveCell.Offset(0, 17).FormulaR1C1 = "REG. FRA. " & ActiveCell.Offset(0, 1).Text & "/" & Format(ActiveCell.Offset(0, 0).Value, "yy")
   variable=false
   End If
end if
End Sub
Efectivamente ¡CULPA MÍA! Siento darte tanta paliza...
Lo he puesto como Private en la primera línea del VBA y tampoco. Estoy casi seguro que es algo de lo que no te haya dado yo información suficiente, por lo que, si te parece bien, te dejo las macros que tengo desarrolladas en el UserForm y tienen que ver con el ComboBox o la celda a la que hace referencia o la celda donde se modifica:
'evento load
Private Sub UserForm_Initialize()
variable = True
End Sub
'carga de datos para el Combo
Private Sub UserForm_Activate()
ComboBox1.AddItem "REMESAR"
ComboBox1.AddItem "DEVOLUCIÓN"
ComboBox1.AddItem "REGULARIZAR"
ComboBox1.AddItem "ABONO"
End Sub
'botón buscar (tiene más cosillas pero que no hacen referencia a nada que tenga que ver con el dato o macro del ComboBox)
Private Sub CommandButton1_Click()
On Error GoTo NoEncuentra
ActiveSheet.Range("B2:B65000").Find(what:=NumFra, LookIn:=xlFormulas, _
lookat:=xlWhole, SearchOrder:=xlByColumns, searchdirection:=xlNext, MatchCase:= _
False).Select
ActiveCell.Offset(0, -1).Select
With ActiveCell
Label1 = .Offset(0, 5).Value
'Página Financiación
TextBox5 = .Offset(0, 25).Value
ComboBox1 = .Offset(0, 25).Value
End With
Exit Sub
NoEncuentra:
MsgBox "Factura no remesada"
End Sub
'Combo en cuestión
Private Sub ComboBox1_Change()
If variable = False Then
ActiveCell.Offset(0, 25).Value = ComboBox1
If ComboBox1.Value = "REGULARIZAR" Then
ActiveCell.Offset(0, 17).FormulaR1C1 = "REG. FRA. " & ActiveCell.Offset(0, 1).Text & "/" & Format(ActiveCell.Offset(0, 0).Value, "yy")
variable = False
End If
End If
End Sub
Espero que no me termines odiando y muchísimas gracias por toda tu ayuda!
Tome todo tu código, cree un form, le puse los controles, y active el form... incluso sin la variable boleana Y NO SE PASA AL EVENTO CHANGE DEL COMBO al iniciar el form, si no hasta que efectivamanet cambias el valor en el combo mediante un click
acá va:
Option Explicit
Private Sub UserForm_Initialize()
ComboBox1. AddItem "REMESAR"
ComboBox1. AddItem "DEVOLUCIÓN"
ComboBox1. AddItem "REGULARIZAR"
ComboBox1. AddItem "ABONO"
End Sub
Private Sub CommandButton1_Click()
On Error GoTo NoEncuentra
ActiveSheet.Range("B2:B65000").Find(what:=NumFra, LookIn:=xlFormulas, _
lookat:=xlWhole, SearchOrder:=xlByColumns, searchdirection:=xlNext, MatchCase:= _
False).Select
ActiveCell.Offset(0, -1).Select
With ActiveCell
Label1 = .Offset(0, 5).Value
'Página Financiación
TextBox5 = .Offset(0, 25).Value
ComboBox1 = .Offset(0, 25).Value
End With
Exit Sub
NoEncuentra:
MsgBox "Factura no remesada"
End Sub
Private Sub ComboBox1_Change()
ActiveCell.Offset(0, 25).Value = ComboBox1
If ComboBox1.Value = "REGULARIZAR" Then
ActiveCell.Offset(0, 17).FormulaR1C1 = "REG. FRA. " & ActiveCell.Offset(0, 1).Text & "/" & Format(ActiveCell.Offset(0, 0).Value, "yy")
End If
End Sub
No se que pasa con tu libro, ya no tengo más nada que ofrecerte, no se me ocurre nada, este código funciona bien.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas