Ocultar una fila condicionada a un resultado

20/07/2007 - 17:44 por Joan | Informe spam
¿Cómo se puede ocultar una fila de una hoja de Excel, condiciona a que se de
un cierto resultado en una celda? Necesito que una fila o filas en concreto
se me oculten cuando el resultado de una celda en concreto sea un valor que
yo determine.

La cosa sería: Si el resultado de la celda C15 es 0 (por ejemplo), ocultame
la fila 20.

Gracias de antemano

Preguntas similare

Leer las respuestas

#1 Ivan
20/07/2007 - 21:36 | Informe spam
hola Joan,

podrias hacer algo parecido a esto:

en el modulo de la hoja copia/pega esto

Private Sub Worksheet_Change(ByVal Target As Range)
With Rows(20)
If Target.Column = 3 And _
Target.Row = 15 And _
Target = 0 Then _
.Hidden = True Else _
.Hidden = False
End With
End Sub


espero te ayude y si quieres comentas

un saludo
Ivan
Respuesta Responder a este mensaje
#2 Joan
21/07/2007 - 03:04 | Informe spam
Gracias por tu respuesta

La he probado y realmente me funciona y es lo que buscaba, aunque me surgen
unas cuantas más preguntas:

1.- El valor de la casilla de "control" (por ejem. C15), ¿Puede proceder de
alguna operación aritmética, suma, resta ... o tiene que estar introducida
manualmente?

2.- Se pueden ocultar varias filas al mismo tiempo, ya sea contíguas o
espaciadas? Quiero decir, ocultar todas las filas de la 20 a la 28, o las
filas 20, 24, 28.

3.- Que variables puedo usar con las funciones que me has enseñado? Que
sintaxis usa éste módulo?

Gracias de nuevo





"Ivan" escribió:


hola Joan,

podrias hacer algo parecido a esto:

en el modulo de la hoja copia/pega esto

Private Sub Worksheet_Change(ByVal Target As Range)
With Rows(20)
If Target.Column = 3 And _
Target.Row = 15 And _
Target = 0 Then _
.Hidden = True Else _
.Hidden = False
End With
End Sub


espero te ayude y si quieres comentas

un saludo
Ivan


Respuesta Responder a este mensaje
#3 Ivan
21/07/2007 - 16:39 | Informe spam
hola Joan,

aunque dentro de un rato espero poder contestarte (dentro de lo que
se) a tus dudas, de momento cambia la otra macro por esta, pues en la
otra habia un problema que luego te comento

Private Sub Worksheet_Change(ByVal Target As Range)
With Rows(20)
If Target.Column = 3 And _
Target.Row = 15 Then _
If Target = 0 Then _
.Hidden = True Else _
.Hidden = False
End With
End Sub


un saludo y hasta luego
Ivan
Respuesta Responder a este mensaje
#4 Ivan
22/07/2007 - 04:50 | Informe spam
hola Joan,

te comento un poco sobre tu mensaje, pero no te fies 100x100 de lo que te diga e intenta contrastarlo

lo 1º te comento el motivo de la correccion en la macro:

La he probado y realmente me funciona .



en realidad habia una 'pega' en el primer codigo, pues tal y como estaba, si bien es cierto que la fila se ocultaria
cada vez que c15 fuese cero, tambien se mostraria cuando cualquier otra celda de la hoja cambiase, y me imagino que esto
no es lo que querias.

en la correccion de mi ultimo mensaje se ocultaria cuando c15 fuese 0 y solo se mostraria cuando c15 fuese diferente de
0, que supongo se acerca mas a lo que buscas


1.- El valor de la casilla de "control" (por ejem. C15), ¿Puede proceder de
alguna operación aritmética, suma, resta ... o tiene que estar introducida
manualmente?




puede ser el resultado de una formula, aunque en algunos casos (creo que) convendria poner el codigo en el evento
calculate, para que la macro se ejecute al recalcularse la hoja. aunque en general creo que valdria con el change pero
cambiando la forma de referirse a la celda cambiante.

en vez de target (que es un parametro de algunos eventos de la hoja y que se refiere a la celda activa/editada en ese
momento) habria que hacer ref. directa a la celda (c15) pues realmente no es esta la activa sino que se ve modificada
por los cambios en otra.

pej. el codigo anterior quedaria asi:

Private Sub Worksheet_Change(ByVal Target As Range)
With Rows(20)
If Range("C15") = 0 Then _
.Hidden = True Else _
.Hidden = False
End With
End Sub

2.- Se pueden ocultar varias filas al mismo tiempo, ya sea contíguas o
espaciadas? Quiero decir, ocultar todas las filas de la 20 a la 28, o las
filas 20, 24, 28.



si, se pueden ocultar varias filas, contiguas o/y alternas. Por ej. echale un ojo a estos codigos:

' este procedimiento oculta/muestra las filas del rango pasado en el parametro 'Refs_Ocultar' si la 'Condicion'
pasada coincide/o no con el contenido de la celda ' pasada en 'Ref_Condicion
'
Sub Ocultar_Por_Condicion(ByVal Ref_Condicion As String, _
ByVal Condicion As Variant, _
ByVal Refs_Ocultar As String)
Range(Refs_Ocultar).EntireRow.Hidden = Range(Ref_Condicion) = Condicion
End Sub

' y podrias usarla por ej. asi ( en este ej. te ocultaria las filas de la 20 a la 24, y ademas la 28 suelta ) en el caso
de que los cambios fueran por formula
'
Private Sub Worksheet_Change(ByVal Target As Range)
Ocultar_Por_Condicion "c15", 0, "a20:a24,A28"
End Sub

' otro uso si es la celda activa la que provoca la ocultacion
'
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("c15"), Target) Is Nothing Then _
Ocultar_Por_Condicion Target.Address, 0, "a13:A14,A20"
End Sub

' una 3ª forma sin usar el procedimiento, es decir directamnte y usando variables, y si se cumple la condicion en una
celda entre varias
'
Private Sub Worksheet_Change(ByVal Target As Range)
Dim CeldasComprobacion As String, filasOcultar As String, dato
CeldasComprobacion = "a2:d2"
If Not Intersect(Range(CeldasComprobacion), Target) Is Nothing Then
filasOcultar = "3:5,8:8,11:11,16:20"
dato = 0
If Target = dato Then Range(filasOcultar).Rows.Hidden = True Else _
Range(filasOcultar).Rows.Hidden = False
End If
End Sub

y una posibilidad mas, para ocultar las filas si se cumple a la vez una condicion (en este caso debe ser numerica (es
decir =0, # etc) en un rango de varias celdas y/o areas (se tiene que cumplir en todas, no como en el anterior, que
solo se tenia que cumplir en una)

Sub Ocultar_Por_Varias_Condiciones(ByVal Ref_Condicion As String, _
ByVal Condicion As Variant, _
ByVal Refs_Ocultar As String)
Dim n As Integer, a As Range
For Each a In Range(Ref_Condicion).Areas
n = n + a.Cells.Count
Next
' por si el valor de alguna de las celdas no fuera numerico
On Error Resume Next
Range(Refs_Ocultar).EntireRow.Hidden = _
Evaluate("Sum(" & Ref_Condicion & ")") / n = Condicion
End Sub

'y podrias llamarla desde el evento Evaluate, pej. mas o menos asi:

Private Sub Worksheet_Calculate()
Ocultar_Por_Varias_Condiciones "b4:b6", 0, "a10:a15"
End Sub

'--
bueno, disculpa el rollo, pero preparate para lo que sigue, que me temo que te va a hacer la ... un lio. Pero espero que
al menos te de una idea del tema.

3. > Que sintaxis usa éste módulo?



la pregunta mas bien se deberia/podria formular +/- asi:

'que sintaxis se usa en este codigo de este modulo?'

te explico lo que creo y sin tecnicismos(los cuales por otro lado apenas controlo).

la sinatxis es la correspondiente al lenguaje de programacion VBA (visual basic para aplicaciones). Aunque si has
probado la macro es que ya conoces el editor de vb, si quieres acceder de forma rapida a el pulsa Alt+F11 y se abrira el
editor. Desde este puedes recurrir a la ayuda (F1) posicionandote sobre cualquier termino sobre el que tengas dudas y
(casi siempre) se te abrira la ayuda correspondiente, que aunque al principo cuesta un poco, acabas cogiendole el
tranquillo, y resulta muy, muy util

una forma de ir familiarizandose con el lenguaje es grabar una macro, abrir el editor y estudiar el codigo resultante
( eso si, ten en cuenta que las macros automaticas suelen grabar una gran cantidad de codigo innecesario, pero es
cuestion de ir discriminando)

en cuanto al 'modulo', este es 'simplemente' un contenedor (lo que en word seria un documento, en excel una hoja, etc)
en el que escribir el codigo que, este si, serian las instrucciones que haran que la macro se ejecute. Estas
instrucciones se pueden estructurar de diversas formas que despues te comento, para acabar antes con los modulos.

Lo que si debes tener en cuenta es que existen (al menos)dos tipos de modulos, y cada uno e ellos se usa para diferentes
fines.

1º) Modulo normal (o standard, general, etc). es en el que por regla general se debe poner la mayor parte de los
codigos que usaras en tus macros. De hecho, si grabas una macro veras que el codigo se deposita en un nuevo modulo
'normal' que se llamara Modulo1, 2 etc, dependiendo de si ya tienes otros modulos. Para insertar un Modulo ve al menu
idem y elige Modulo ( a secas, o normal etc)

2º) Modulo de clase: son modulos especiales que a su vez, creo que se podrian dividir en otros dos tipos: los
modulos adscritos a determinados objetos (Userform, Libro, Hoja ) y los que se usan para crear nuestros propios objetos,
propiedades, eventos, etc y que se corresponden a un nivel de programacion que yo no controlo y no se suelen usar para
las tareas basicas en vba (en general y al menos en mi caso). Estos ultimos nos olvidamos de ellos, pero no asi e los
adscritos a objetos.

estos modulos se suelen utilizar fundamentalmente para manejar/controlar/aprovechar los eventos que se producen cuando
realizamos alguna accion sobre alguno de estos objetos. Por ejemplo en el codigo que te envie antes aprovechamos el
'evento Change, que se produce' cuando se cambia algo en una celda de una hoja, y habia que escribirlo en el modulo (que
aunque no lo ponga, es de clase) de la hoja correspondiente.

si abres el editor, veras que (generalmente) a la izq. hay una ventana llamada explorador de proyectos (si no la hay
activala en Ver o pulsa Ctrl+R) en la cual en forma de arbol te aparecn los diversos proyectos cargados (alguno a lo
mejor ni sabes que esta) entre ellos tu libro que se llamara algo asi VBAProject(nombre_del_libro). De este colgaran los
diversos componentes del proyecto, que originalmente y si no has grabado ninguna macro ni creado un formulario, etc,
estar compuesto por un modulo llamado ThisWorkbook, correspondiente al libro y en el que se manejan sus eventos (pej.
Open, Activate, Deactivate, etc), y otro modulo por cada una de las hojas que tenga el libro. y en los cuales se manejan
los de cada hoja.

3.- Que variables puedo usar con las funciones que me has enseñado?



en realidad el codigo expuesto no se corresponde con lo que entendemos como funcion. Aunque, si te interesa el tema lo
suyo es que intentes tirar de la ayuda y buscar algun manual (en la web hay muchos y por si te interesa al final
intentare ponerte agunos) que te ayude a comenzar a comprender los diversos conceptos, te sigo comentando un poco.

en visual basic (y a nivel basico) existen dos formas fundamentales (existen otras pero seria muy largo y para mi,
complicado, de contar) de estructuras de codigo: los procedimientos Sub y los procedimientos Function. La diferencia
fundamental es que estos ultimos te pueden devolver un resultado y los primeros, aunque pueden realizar la misma accion,
no te devolverian el resultado en si mismo. Pej.:fijate en los siguientes codigo (en realidad su sintaxis seria (o mas
bien convendria que fuera) diferente pero para el ej. nos valen)

Function SumarCeldas(Celda1, Celda2) as Integer
SumarCeldas = Celda1 + Celda2
end Function

Sub Sumar_Celdas(Celda1, Celda2)
Range("a1") = Celda1 + Celda2
End Sub

ambos realizan la misma accion, suman las dos celdas que le pases como argumento (Celda1 y Celda2) pero en el 1er caso
ademas puedes adjudicarle el resultado a, por ej. una celda (Range("a1") = SumarCeldas ([a2],[a3]) ) o, tambien a una
variable ( MiVariable = SumarCeldas([a1], [a2]) ).

sin embargo en el procedimiento sub, aunque la suma la realiza, no puedes obtener el valor directamente del resultado,
aunque si puedes, y tocando el tema de las variables, adjudicaselo a una que, si quieres utilizar el valor en otros
procedimientos, deberias haber declarado fuera del procedimiento, a nivel de modulo, es decir en al zona superior del
modulo ( area de declaraciones ), o si estubiera en otro modulo, declarada como publica., o tambien pasandosela como
parametro al procedimiento

esto creo que te estara liando aun mas de lo que ya estes, pero al menos te ira sonando. Pej. para el caso de la
variable a nivel de modulo y el ej. anterior podrias ahcer algo como esto:

En la parte superior del modulo declaramos la variable (debajo de Option Explicit, si estubiera)=>>

Dim MiVariable as Integer

en el procedimiento le damos el valor de la suma

Sub Sumar_Celdas(Celda1, Celda2)
MiVariable = Celda1 + Celda2
End Sub

y podriamos usarlo +/- asi dentro de otro procedimiento

Sub OtroProcedimiento()
Call Sumar_Celdas([a2], [a3])
If MiVariable <> 0 Then Range("a1") = MiVariable
End sub


bueno, espero no haberte liado demasiado, pero si quieres aprender, te recomiendo que intentes echar un ojo a las
conversaciones de el foro (especialmente a la de los maestros, que suelen ser mucho mas claros y concisos) que te
parwezca puedan ayudarte. Para mi gusto es la mejor escuela.

un saludo y la proxima prometo 'intentar' ser mas escueto
un saludo
ivan
Respuesta Responder a este mensaje
#5 Joan
25/07/2007 - 21:00 | Informe spam
Uau!!! MUCHíSIMAS GRACIAS IVAN!!!!

Perdona el retraso en la respuesta pero estoy basante agobiado de trabajo y
ésto, aunque para el curro, lo tengo como un hobby ... aprender cada día un
poco más ...

Ésto era lo que estaba buscando!!!

y para que veas ... aquí te dejo un poco del código que he escrito en base a
lo que me has enseñado ...

Private Sub Worksheet_change(ByVal Target As Range)
Dim CeldasComprobación As String, filasOcultar0 As String, filasOcultar1
As String, filasOcultar2 As String, filasOcultar3 As String, filasOcultar4 As
String, filasOcultar5 As String
CeldasComprobacion = "I19"
If Not Intersect(Range(CeldasComprobacion), Target) Is Nothing Then
filasOcultar0 = "36:113,116:265"
filasOcultar1 = "49:113,141:265"
filasOcultar2 = "62:113,166:265"
filasOcultar3 = "75:113,191:265"
filasOcultar4 = "88:113,216:265"
filasOcultar5 = "101:113,241:265"
If Target = 0 Then Range(filasOcultar0).Rows.Hidden = True Else _
If Target = 1 Then Range(filasOcultar1).Rows.Hidden = True Else _
If Target = 2 Then Range(filasOcultar2).Rows.Hidden = True Else _
If Target = 3 Then Range(filasOcultar3).Rows.Hidden = True Else _
If Target = 4 Then Range(filasOcultar4).Rows.Hidden = True Else _
If Target = 5 Then Range(filasOcultar5).Rows.Hidden = True Else _
Range(filasOcultar).Rows.Hidden = False
End If
End Sub


Te comento: Éste código lo que hace es mirar la casilla I19 y según el
resultado que da, oculta unas filas o unas otras ... Mi pregunta ahora es: ¿Y
si en lugar de ocultar unas filas, lo que quiero es mostrar otras? ¿Cómo lo
hago? Por deducción he escrito el siguiente código pero no me funciona ...

Private Sub Worksheet_change(ByVal Target As Range)
Dim CeldasComprobación As String, filasMostrar1 As String, filasMostrar2
As String, filasMostrar3 As String, filasMostrar4 As String, filasMostrar5 As
String, filasMostrar6 As String
CeldasComprobacion = "I19"
If Not Intersect(Range(CeldasComprobacion), Target) Is Nothing Then
filasMostrar1 = "36:48,116:140"
filasMostrar2 = "36:61,116:165"
filasMostrar3 = "36:74,116:170"
filasMostrar4 = "36:87,116:215"
filasMostrar5 = "36:100,116:240"
filasMostrar6 = "36:113,116:265"
If Target = 1 Then Range(filasMostrar1).Rows.Shown = True Else _
If Target = 2 Then Range(filasMostrar2).Rows.Shown = True Else _
If Target = 3 Then Range(filasMostrar3).Rows.Shown = True Else _
If Target = 4 Then Range(filasMostrar4).Rows.Shown = True Else _
If Target = 5 Then Range(filasMostrar5).Rows.Shown = True Else _
If Target = 6 Then Range(filasMostrar6).Rows.Shown = True Else _
Range(filasOcultar).Rows.Shown = False
End If
End Sub

problemas que me da:
1.- Me dice que hay un conflicto (de nombre creo) con lo del "Private Sub
Worksheet_change(ByVal Target As Range)". Se lo cambio y pongo "Private Sub
Worksheet_change2(ByVal Target As Range)", pero no sabe interpretarlo. ¿Cómo
lo soluciono?
2.- Si lo dejo solo, sin el código de "ocultar filas" ... el segundo
problema que me da es que no entiende lo de "Shown" ... ¿Cúal es el parámetro
para decir que muestre esas filas?


Bien ... creo que voy progresando ... al menos ya estoy metido en el ajo!!!
aunque me haga un poco la Pic un lio!!! como tu dices!!!

Más cosas ... en tu respuesta me comentastes que conocías páginas donde
encontrar "Manuales de VBA para torpes que quieren meterse en el ajo" ...
jeje ... me puedes indicar algunas?

Más ... en tu respueta también comentabas que se pueden gravar marcos y
luego mirarle las "entrañas" ¿cómo se grava una macro? ¿cómo se le
indica lo que quieres conseguir que haga?


Bueno ... por hoy basta de tostón bueno una cosa más ... si quieres, en
la próxima respuesta te dejo mi correo particular y así me puedes ir
enseñando más directamente. Ya me comentarás si lo deseas así.

Ahora soy yo quién debe pedir perdón por el tostón!!!!
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida