Repregunta a Fernando Arroyo

21/01/2004 - 12:43 por claudio | Informe spam
La otra vez preguntaba como hacer determinadas tareas si
el usuario cambiaba un valor de un rango de celdas
determinado.
Lo que me dijeron (Fernando Arroyo) que lo pongo abajo
anda perfecto pero hay una sola cosa que NO me funciona y
me es fundamental. En realidad cuando te decía que tenía
3 comboboxs hechos con el menú Data\Validation NO era tan
así sino que tenía 1 combobox y las otras 2 celdas están
con un fórmula de un programa que si le hago doble clic
me aparece una lista de valores y tengo que elegir uno.
El GRAN problema es que cuando cambio un valor de estas 2
celdas haciendo doble clic y eligiendo otro elemento NO
se activa el evento "Worksheet_Change" con lo cual NO
hace lo que quiero.
Podré usar algún otro evento que si me reconozca el
cambio de elemento en la celda?????
(El evento Worksheet_SelectionChange SI se ejecuta
correctamente)



PREGUNTA Y RESPUESTA ANTERIOR:

Hacer varias cosas cuando se cambia el valor de una
celda???
Tengo 3 comboboxs hechos con el menú Data\Validation y en
la solapa Settings le pongo List y en Source los valores
(ej. para el combo de años le pongo de 1990 a 2004).
Hasta acá todo bien.
El tema que cuando el usuario elige un valor distinto en
cualquiera de estos combos (que están en A5, A6 y A7), se
tiene que borrar el contenido de las celdas B15, B16, B17
y B18 de la Hoja 1, las celdas C4, C5 y C6 de la Hoja2 y
presionar el botón Refrescar de la Hoja1 (que es un botón
que cree yo llamando a una macro de un programa de
terceros).
Cómo puedo hacer esto???

Rta:
Entiendo que el borrado de celdas tan sólo debe
producirse si alguna de las celdas en el rango A5:A7 de
Hoja1 cambia su valor ¿?. Si es esto, el siguiente código
debería servirte:


Dim vAnterior As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, [A5:A7]) Is Nothing
Or Target = vAnterior Then Exit Sub
Application.EnableEvents = False
[B15:B18].ClearContents
Worksheets("Hoja2").[C4:C6].ClearContents
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As
Range)
If Not Application.Intersect(Target, [A5:A7]) Is
Nothing And Target.Cells.Count = 1 Then vAnterior = Target
End Sub


Tendrías que ponerlo en el módulo de Hoja1, y lo que hace
es almacenar en una variable el contenido de la celda en
el momento de seleccionarla, y si se cambia su valor
borrar las celdas que necesitas (es decir, que si al
salir de la celda su valor no ha cambiado, no se borrarán
las otras).

Respecto a lo del botón, en principio no parece necesario
presionarlo. Dado que dices que llama a otro código, lo
único que tendrías que hacer es ejecutar dicho código
mediante el método Run del objeto Application. Esta
llamada podrías ponerla después de
Application.EnableEvents = True

Preguntas similare

Leer las respuestas

#1 Fernando Arroyo
21/01/2004 - 16:51 | Informe spam
Pienso que el otro evento que podría servirte es Calculate, pero el problema es que éste se lanza cada vez que se produce un recálculo en la hoja.

Lo primero que habría que hacer sería verificar que dicho evento es lanzado por el cambio de alguna de las dos celdas a vigilar, y en caso afirmativo crear un par de variables públicas en el nivel de módulo de algún módulo:

Public Celda1 as Variant, Celda2 as Variant

llenarlas con el contenido de las celdas en el momento de abrir el libro:

Private Sub Workbook_Open()
Celda1 = Worksheets("Hoja1").[A1]
Celda2 = Worksheets("Hoja2").[A2]
End Sub

y poner el código para controlar las celdas en el módulo de la hoja:

Private Sub Worksheet_Calculate()
If [A1] <> Celda1 Then
MsgBox "Se ha modificado la celda A1"
Celda1 = [A1]
End If
If [A2] <> Celda2 Then
MsgBox "Se ha modificado la celda A2"
Celda2 = [A2]
End If
End Sub


Nada más puedo decirte al no poder reproducir tu situación, dado que no tengo el programa externo que estás usando y que ni siquiera sé cual es.
Un saludo.


Fernando Arroyo
MS MVP - Excel


"claudio" escribió en el mensaje news:17e801c3e013$c06faad0$
La otra vez preguntaba como hacer determinadas tareas si
el usuario cambiaba un valor de un rango de celdas
determinado.
Lo que me dijeron (Fernando Arroyo) que lo pongo abajo
anda perfecto pero hay una sola cosa que NO me funciona y
me es fundamental. En realidad cuando te decía que tenía
3 comboboxs hechos con el menú Data\Validation NO era tan
así sino que tenía 1 combobox y las otras 2 celdas están
con un fórmula de un programa que si le hago doble clic
me aparece una lista de valores y tengo que elegir uno.
El GRAN problema es que cuando cambio un valor de estas 2
celdas haciendo doble clic y eligiendo otro elemento NO
se activa el evento "Worksheet_Change" con lo cual NO
hace lo que quiero.
Podré usar algún otro evento que si me reconozca el
cambio de elemento en la celda?????
(El evento Worksheet_SelectionChange SI se ejecuta
correctamente)
Respuesta Responder a este mensaje
#2 Henry Sanchez
22/01/2004 - 23:33 | Informe spam
Hola Claudio,
Tengo entendido que este problema de que Excel no
reconozca el evento Change cuando se usa una validacion
tipo lista solo ocurria en Excel 97, tal vez ese es el
problema y la solucion bien sencilla ens actualizarte

Saludos,

Henry
La otra vez preguntaba como hacer determinadas tareas si
el usuario cambiaba un valor de un rango de celdas
determinado.
Lo que me dijeron (Fernando Arroyo) que lo pongo abajo
anda perfecto pero hay una sola cosa que NO me funciona y
me es fundamental. En realidad cuando te decía que tenía
3 comboboxs hechos con el menú Data\Validation NO era tan
así sino que tenía 1 combobox y las otras 2 celdas están
con un fórmula de un programa que si le hago doble clic
me aparece una lista de valores y tengo que elegir uno.
El GRAN problema es que cuando cambio un valor de estas 2
celdas haciendo doble clic y eligiendo otro elemento NO
se activa el evento "Worksheet_Change" con lo cual NO
hace lo que quiero.
Podré usar algún otro evento que si me reconozca el
cambio de elemento en la celda?????
(El evento Worksheet_SelectionChange SI se ejecuta
correctamente)



PREGUNTA Y RESPUESTA ANTERIOR:

Hacer varias cosas cuando se cambia el valor de una
celda???
Tengo 3 comboboxs hechos con el menú Data\Validation y en
la solapa Settings le pongo List y en Source los valores
(ej. para el combo de años le pongo de 1990 a 2004).
Hasta acá todo bien.
El tema que cuando el usuario elige un valor distinto en
cualquiera de estos combos (que están en A5, A6 y A7), se
tiene que borrar el contenido de las celdas B15, B16, B17
y B18 de la Hoja 1, las celdas C4, C5 y C6 de la Hoja2 y
presionar el botón Refrescar de la Hoja1 (que es un botón
que cree yo llamando a una macro de un programa de
terceros).
Cómo puedo hacer esto???

Rta:
Entiendo que el borrado de celdas tan sólo debe
producirse si alguna de las celdas en el rango A5:A7 de
Hoja1 cambia su valor ¿?. Si es esto, el siguiente código
debería servirte:


Dim vAnterior As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, [A5:A7]) Is Nothing
Or Target = vAnterior Then Exit Sub
Application.EnableEvents = False
[B15:B18].ClearContents
Worksheets("Hoja2").[C4:C6].ClearContents
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As
Range)
If Not Application.Intersect(Target, [A5:A7]) Is
Nothing And Target.Cells.Count = 1 Then vAnterior = Target
End Sub


Tendrías que ponerlo en el módulo de Hoja1, y lo que hace
es almacenar en una variable el contenido de la celda en
el momento de seleccionarla, y si se cambia su valor
borrar las celdas que necesitas (es decir, que si al
salir de la celda su valor no ha cambiado, no se borrarán
las otras).

Respecto a lo del botón, en principio no parece necesario
presionarlo. Dado que dices que llama a otro código, lo
único que tendrías que hacer es ejecutar dicho código
mediante el método Run del objeto Application. Esta
llamada podrías ponerla después de
Application.EnableEvents = True


.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida