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

#11 Ivan
28/07/2007 - 21:54 | Informe spam
definitivamente no se estarme quietecito

cambiala por esta, eliminando el bucle

Public Sub Ocultar_Mostrar_Filas_6(rango1 As Range, rango2 As Range)
Dim n As Byte, filasOcultar
If Not Intersect(rango1, rango2) Is Nothing Then
filasOcultar = Array("36:113,116:265", "49:113,141:265", _
"62:113,166:265", "75:113,191:265", _
"88:113,216:265", "101:113,241:265", _
"36:113,116:265")
If rango1 < 0 Or rango1 > 6 Then Exit Sub
With ActiveSheet
.Range(filasOcultar(0)).EntireRow.Hidden = False
.Range(filasOcultar(rango1)).EntireRow.Hidden = rango1 < 6
End With
End If
End Sub
"Ivan" escribió en el mensaje news:
mejor cambialo por este:

Public Sub Ocultar_Mostrar_Filas_5(rango1 As Range, rango2 As Range)
Dim n As Byte, filasOcultar, filasMostrar
If Not Intersect(rango1, rango2) Is Nothing Then
filasOcultar = Array("36:113,116:265", "49:113,141:265", _
"62:113,166:265", "75:113,191:265", _
"88:113,216:265", "101:113,241:265")
With ActiveSheet
If rango1 = 6 Or (rango1 > 0 And rango1 < 6) Then _
.Range(filasOcultar(0)).EntireRow.Hidden = False
If rango1 < 0 Or rango1 > 5 Then Exit Sub
For n = 0 To UBound(filasOcultar)
If rango1 = n Then _
.Range(filasOcultar(n)).EntireRow.Hidden = True: Exit Sub
Next
End With
End If
End Sub

no se si sera realmente mejor(en algo si, pero...) pero a mi me gusta mas

y ya si que me estoy quietecito...

un saludo
Ivan

Respuesta Responder a este mensaje
#12 Joan
07/08/2007 - 20:20 | Informe spam
Gracias Ivan por todas tu respuestas

He estado unos días de vacaciones por eso no he podido contestarte antes.

Ahora me toca el trabajo de asimilarlo todo. Me lo he leído todo, aunque no
lo he podido digerir aún. Espero que en sucesivas lecturas, y sobretodo, en
las pruebas "fallo-corrección-error-acierto" lo llegue a entender.

No te preocupes por el tema de "definitivamente no se estarme quietecito"
pues ese mismo aspecto me llevó a mi a hacer la pregunta de la ocultación de
filas condicionada. Con lo fácil que sería decirle al que va a usar mi hoja
de excel "cuando no necesites estas filas, vas y las ocultas así" ...
pos no ... no se estarme quietecito yo también y quiero automatizarlo!!

Jeje

Gracias de nuevo y en breve volveré a preguntar, ya verás porque, aunque te
explicas muy bien, para mi me suena a Italiano (por no decir chino) ya que
voy pillando palabras aunque muchas veces el significado entero se me
desvanece.

GRACIAS DE NUEVO
Respuesta Responder a este mensaje
#13 Joan
08/08/2007 - 21:20 | Informe spam
Iván

Después de unas lecturas y pruebas he llegado, gracias a tu ayuda a varias
conclusiones y otras tantas dudas:

Vamos allá:

1.- De la teoría ... bufff ... complicado pero sí que me ha ayudado,
sobretodo en lo que se refiere a lo de grabar macros, ojearle el código,
comprenderlo y modificarlo (ya lo verás más adelante)

2.- De las páginas web ... mil gracias ... ya sé como saturarme cuando no
pueda contar más ovejitas a la hora de irme a dormir ... jeje

3.- De la práctica y en cuanto a:
''en el modulo Thisworkbook --
'
Private Sub Workbook_Open()
Worksheets("Hoja2").Protect _
Password:="6666", _
UserInterfaceOnly:=True
End Sub



Éste código no me ayuda mucho puesto que lo que hace es preguntar la
contraseña del libro a la hora de abrir el archivo Excel. Así que lo he
borrado.

Mi problema era que cuando quería activar o iniciar la macro con el código
"Ocultar_Filas" pues se bloqueaba mandándome un error que intuí era debido a
que la hoja estaba bloqueada. Este aspecto lo he solucionado grabando una
macro (como me enseñaste) y viendo sus entrañas. Así he cogido tu código
'' en el modulo de la hoja donde esta la lista (asegurate de no duplicar el procedimiento, si hace >falta borra el que tengas
'
Private Sub Worksheet_Change(ByVal Target As Range)
Ocultar_Mostrar_Filas_2 Target, Range("i16")
End Sub



y lo he modificado un poco:
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect Password:="6666"
Ocultar_y_Mostrar_Filas Target, Range("I16")
ActiveSheet.Protect Password:="6666", DrawingObjects:=False,
Contents:=True, Scenarios:= _
False
End Sub

de ésta forma, cuando va a realizar la macro "Ocultar_y_Mostrar_Filas" en la
hoja correspondiente primero desbloquea la hoja, realiza la macro y finaliza
volviendo a bloquear la hoja. Esto, de rebote, me permite que cada hoja pueda
tener un password diferente.

4.- Otro pequeño error que me daba, y que he hallado una solición simple y
que ha ayudado a superar el error lo he encontrado en:

Public Sub Ocultar_Mostrar_Filas_6(rango1 As Range, rango2 As Range)
Dim n As Byte, filasOcultar
If Not Intersect(rango1, rango2) Is Nothing Then
filasOcultar = Array("36:113,116:265", "49:113,141:265", _
"62:113,166:265", "75:113,191:265", _
"88:113,216:265", "101:113,241:265", _
"36:113,116:265")
If rango1 < 0 Or rango1 > 6 Then Exit Sub
With ActiveSheet
.Range(filasOcultar(0)).EntireRow.Hidden = False
.Range(filasOcultar(rango1)).EntireRow.Hidden = rango1 < 6
End With
End If
End Sub



Cuando la celda de comprobación (I16) en este caso era 6, me daba un error
en la línea " .Range(filasOcultar(rango1)).EntireRow.Hidden = rango1 < 6
" el cual he solucionado añadiendo un tramo más en la línea " filasOcultar
= Array("36:113,116:265", . , "36:113,116:265")" para acabarla mediante "
filasOcultar = Array("36:113,116:265", . , "36:113,116:265",
"265:265")" .

De esta forma no se me produce el error puesto que la celda de comprobació
(I16) la tengo limitada mediante una lista en la que sólo aparecen los num.
1,2,3,4,5 y 6 evitando la posibilidad de otro dato.

Hasta aquí mis flirteos positivos con el VBA ... ahora mis dudas ...

a) ¿Por qué ha veces no puedo colocar ":=" en algunas expresiones tipo
"password:="? He notado que me dice "se esperaba una expresión". Elimino
los "dos punto" (:) y me funciona.

b) Lo mismo me ocurre con el guión bajo (_) en líneas como " filasOcultar
= Array("36:113,116:265", "49:113,141:265", _ ". ¿Puede que entre la
coma y el guión bajo necesite un espacio? Yo lo he solucionado colocando toda
la matriz (array) en un sola línea.

c) ¿Para que usar las variables "n" y "rango2" en las líneas "
Public Sub Ocultar_Mostrar_Filas_6(rango1 As Range, rango2 As Range)
Dim n As Byte, filasOcultar
If Not Intersect(rango1, rango2) Is Nothing Then" si al final no existen tales variables?



d) Y ahora la pregunta más difícil: ¿Cómo puedo hacer que cuando la celda de
comprobación (I16) sea 1 ó 2, por ejemplo, me oculte o muestre unas celdas,
cuando sea 3,4 ó 5 otras y cuando sea 6 otras totalmente diferentes? Eso sí
... usando el código "> Public Sub Ocultar_Mostrar_Filas_6" !!!

Gracias de nuevo Iván

Joan Vallespir

Respuesta Responder a este mensaje
#14 Ivan
08/08/2007 - 22:45 | Informe spam
hola Joan, eso 'vacaciones' es un termino que me suena a castellano(/catalan/vasco/o lo que sea,,,) antiguo, asi que
enhorabuena por ellas.

en cuanto al resto te comento un poco (en serio):



4.- Otro pequeño error que me daba, y que he hallado una solición simple y
que ha ayudado a superar el error lo he encontrado en:
<
Cuando la celda de comprobación (I16) en este caso era 6, me daba un error
en la línea "
" el cual he solucionado añadiendo un tramo más en la línea "



solo como informacion, creo que el error se debia a que debes tener 'Option Base' establecido como 1 y esto decabalaba
toda la matriz [aunque no me hagas mucho caso]. En cualquier caso el fallo seria mio por dar por hecho que tendrias base
0. Si te funciona pues ahi se queda

a) ¿Por qué ha veces no puedo colocar ":=" en algunas expresiones tipo
"password...". Elimino los "dos punto" (:) y me funciona.



en el caso concreto que expones no creo que te lo admita sin los 2 puntos.

Me exoplico: el uso de ':=' ( dos puntos + signo igual), que yo haya visto hasta ahora se aplica para dar valores a los
parametros de los 'Metodos', mientras que cuando se trata de darles un valor directo (como en Hidden) o se trata de
propiedades se suele utilizar el '=' a secas, y en el caso que expones 'Password' es un parametro del metodo open.

Lo que si te puede pasar es que como los parametros se pueden pasar sin el nombre, en cuyo caso hay que poner las comas
correspondientes a los parametros que omitas( al menos hasta el ultimo puesto), en algun caso hayas alternado ambas
formas (con y sin nombre) y te de el error. Tambien a veces, que no sabria explicarte sin liarte mas, los parametros hay
que pasarlos entre parentesis y otras no. Paciencia


b) Lo mismo me ocurre con el guión bajo (_) ... ". ¿Puede que entre la
coma y el guión bajo necesite un espacio?



efectivamente, debe llevar un espacio (y solo uno) entre el ultimo caracter de la linea y el guion bajo. Y en el caso de
romper una cadena de texto, debes cerrar con comillas dobles la cadena antes del espacio, y abrir en la siguiente linea
la fraccion de cadena con otras comillas dobles (OJO: entre ambas sub cadenas debes poner un operador de
concatenacion(&) en la linea que quieras, al final de una o al principio de la otra, pero respetando la norma de acabar
la linea truncada con 'espacio+_'

c)¿Para que usar las variables "n" y "rango2" en las líneas "





1.- la n es chatarra que se me ha quedado de pruebas anteriores (sorry)

2.- por un lado en realidad todo el procedimiento se podria eliminar como tal e incluir el codigo dentro del propio
change, en cuyo caso esto:=>

If Not Intersect(rango1, rango2) Is Nothing Then

se convertiria en esto=>

If Not Intersect(Target, Range("i16")) Is Nothing Then

supongo que esto te da una idea. De todas formas habria bastantes opciones y se podria eliminar sin problemas dicho
argumento pero habria que modificar la macro y para el caso creo que tampoco molesta demasiado

d) Y ahora la pregunta más difícil: ¿Cómo puedo hacer que cuando la celda de
comprobación (I16) sea 1 ó 2, por ejemplo, me oculte o muestre unas celdas,
cuando sea 3,4 ó 5 otras y cuando sea 6 otras totalmente diferentes? Eso sí
... usando el código "> Public Sub Ocultar_Mostrar_Filas_6" !!!



en realidad eso es lo que hace la macro actual, aunque encadenando los rangos mostrados/ocultados de la manera que +/-
pedias.

en el caso de que quieras mostrar rangos diferente y mostrar el resto prueba a cambiar esto =>

.Range(filasOcultar(0)).EntireRow.Hidden = False

por esto

.Rows.Hidden=false


bueno, a ver que tal y nada, a seguir dandole, que, si te gusta (ojo: es adictivo ), se acaba sacandole cosillas

unsaludo
Ivan
Respuesta Responder a este mensaje
#15 Ivan
08/08/2007 - 23:54 | Informe spam
FE de (muchas) erratas/errores/omisiones:

1º) aqui=>

y en el caso que expones 'Password' es un parametro del metodo open







seria => metodo protect (en vez de open)

2º) y como omision, aqui=>

'para dar valores a los parametros de los 'Metodos',







seria=> para dar valores a los parametros de los 'Metodos', [cuando
los pasamos con el nombre]

3º) aqui seria asi (pej)=>

en el caso de que quieras [ocultar/]mostrar rangos diferente y mostrar el resto prueba a cambiar esto =>



4º) y he dado por hecho que modificando en la matriz los rangos
respectivos por los nuevos que quieras ocultar.

5º)IMPORTANTE: tambien deberias quitar el '< 6' y dejar asi esta
instruccion=>

.Range(filasOcultar(rango1)).EntireRow.Hidden = true

5º) la matriz en concreto deberia tener solo 6 elementos y cada uno
de ellos se correesponderia con las filas que quieras ocultar segun el
nº (es decir 1er elemento filas a ocultar con 1 , 2º filas con 2,
etc), pues automaticamente te ocultaria esas y te mostraria todas las
demas

NOTA: respecto a esto ultimo, y sin probar ni estar del todo seguro,
si realmente tienes puesto Option Base como 1, seria asi, pero si el
error que mencionabas no se debe a la base ( y tienes option base en
0), tambien deberias dejar solo los 6 elementos en la matriz y en
igual orden, pero al asignar el indice a la matriz deberias restarle 1
al rango, es decir +/- asi:

.Range(filasOcultar(rango1 - 1)).EntireRow.Hidden = true

6º) y como al final son muchas cosas aqui va la macro corregida (ojo:
la corrijo aqui mismo, asi que revisala) para el caso de option base 1
(si te da problemas prueba a quitar el -1)


Public Sub Ocultar_Mostrar_Filas_6(rango1 As Range, rango2 As Range)
Dim filasOcultar
If Not Intersect(rango1, rango2) Is Nothing Then
filasOcultar = Array("36:113,116:265", "49:113,141:265", _
"62:113,166:265", "75:113,191:265", _
"88:113,216:265", "101:113,241:265")
With ActiveSheet
.Rows.Hidden = False
.Range(filasOcultar(rango1 - 1)).EntireRow.Hidden =true
End With
End If
End Sub

un saludo
Ivan
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida