Macro que se ejecute cuando cambia un valor

Tengo un archivo de excel con 2 hojas (hoja1 y hoja2)
En la hoja2, hice un código para que se ejecute una macro automáticamente cada que cambien los valores de una celda la D11. Si cambian el valor de esta celda, y le ponen un 0 necesito que me oculte todas aquellas columnas en las que la fila 11 tiene valor de 0
Esto lo hace sin problema cuando yo coloco un 0 en la celda D11(hoja2), busca en toda la fila 11 los otros 0 y oculta las columnas.
El problema es que en el archivo yo no voy a introducir el valor directo en D11 (hoja2), si no que lo introduzco en la hoja1, y la celda D11 de la hoja2 tiene una fórmula =hoja1! $D$4 pero cuando yo a D4 de la hoja1 le cambio el valor a 0, si lo cambia en D11 de la hoja2, pero no ejecuta la macro, esta solo se ejecuta si el valor es introducido directamente en la hoja2 y esto no lo puedo hacer.
Este es el código que yo hice
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect
If Target.Address = "$D$11" Then
If Cells(11, 4).Value = 0 Then
Range("D11").Select
Do While Not IsEmpty(ActiveCell)
If Trim(LCase(ActiveCell)) = 0 Then
Selection.EntireColumn.Hidden = True
Else
Selection.EntireColumn.Hidden = False
End If
ActiveCell.Offset(0, 1).Select
Loop
End If
Else
Range("D11").Select
End If
ActiveSheet.Unprotect
End Sub
También pensé colocar el código en la hoja1 y que cada que cambiara el valor de D4 (hoja1), se fuera a la hoja 2 y buscara en la fila 11 los 0 y ocultara las columnas pero no me salio.
Hice este código, pero marca error en Range("D11"). Select, y si quito esta línea, si lo hace siempre y cuando yo deje el cursor en esta celda D11 (hoja2) y luego cambie el valor de D4 (hoja1) y se ejecuta la macro bien, pero esto no es funcional por que no seré yo quien use el archivo y no puedo asegurar que el cursor siempre este en D11. Necesito que la macro solita se situé en D11 y busque los 0.
Este es el código de mi 2da opción
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect
If Target.Address = "$D$6" Then
If Cells(6, 4).Value = 0 Then
Sheets("Hoja2").Activate
Range("D11").Select
Do While Not IsEmpty(ActiveCell)
If Trim(LCase(ActiveCell)) = 0 Then
Selection.EntireColumn.Hidden = True
Else
Selection.EntireColumn.Hidden = False
End If
ActiveCell.Offset(0, 1).Select
Loop
Sheets("Hoja1").Select
Else
Sheets("Hoja1").Select
End If
End If
ActiveSheet.Unprotect
End Sub
Espero que me haya explicado, si necesitas el archive dime.
Te agradezco muchísimo soy muy nueva en esto de las macros

1 respuesta

Respuesta
1
Prueba con esto:
Código en la hoja2:
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect
If Target.Address = "$D$11" Then
If Target.Value = 0 Then
Do While Not IsEmpty(ActiveCell)
If Trim(LCase(ActiveCell)) = 0 Then
Selection.EntireColumn.Hidden = True
Else
Selection.EntireColumn.Hidden = False
End If
ActiveCell.Offset(0, 1).Select
Loop
End If
Else
Hoja2.Range("D11").Select
End If
ActiveSheet.Unprotect
End Sub
codigo en la hoja 1:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$4" Then Hoja2.Range("D11").Value = Target.Value
End Sub
Hola, muchas gracias por tu tiempo y respuesta,
Solo tengo un problema, el código de la hoja1
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$4" Then Hoja2.Range("D11").Value = Target.Value
End Sub
Me marca error  en esta línea
Hoja2.Range("D11").Value
En mi archivo la hoja2 se llama "Priorizacion"
Así que yo puse Priorizacion.Range("D11").Value, y nada, y puse en el libro el nombre de Hoja2 y lo corrí como me lo mandas pero sigue mandando error en la línea.
Vi que le falta el End If pero támpoco es eso.
¿Sabes a que se deba?
Mil gracias
Si un IF con su THEN solo ocupa una linea no es necesario ponerle el end if, aunque siempre es mejor ponerlo.
Yo lo probé y funcionaba bien, aunque dependerá de la version de office que utilices, yo uso la 2007.
Puedes hacer referencia a la celda por CELLS en lugar de RANGE, para hacer referencia
A la hoja por su nombre deberías poner algo así:
Worksheets("nombredelahoja").range ... etc.
Aunque si lo haces así el intellisense no te aparecerá (las sugerencias que aparecen cada vez que pones un punto)
hoja2.cells(4, 11).value ... algo asi
Muchas gracias, ya corrió quedo de la siguiente manera
Código de la 1ra hoja:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$6" Then
Worksheets("Priorizacion").Range("$D$11").Value = Target.Value
End If
End Sub
Y el código de la 2da hoja lo cambie, por que si correia pero siempre y cuando yo dejara seleccionada antes la celda D11, si lo hacia como lo enviaste no pasaba nada, y si yo trataba de poner dentro del código cualquier tipo de línea que seleccionara D11 marcaba error (Range("D11").Select, etc), así que opte por hacerlo columna por columna ya que me urge entregarlo quedo así
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect
Sheets("Priorizacion").Select
If Target.Address = "$D$11" Then
If Cells(11, 4).Value = 0 Then
Selection.EntireColumn.Hidden = True
Else
Selection.EntireColumn.Hidden = False
End If
End If
Sheets("Criterios").Select
ActiveSheet.Unprotect
End Sub
Y eso para cada columna :S bueno pero finalmente funciona, muchas gracias por la ayuda!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas