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

#6 Ivan
26/07/2007 - 04:26 | Informe spam
hola Joan,

la verdad es que hay unas cuantas cosas 'comentables' en tus codigos,
pero si acabas de empezar es normal. Ahora no tengo tiempo pero mañana
por la tarde noche intentare mandarte una respuesta.

entre tanto, procura no duplicar nombres de procedimientos, variables
etc y menos si se trata de procedimientos de evento (pej:
Worksheet_Change).

De todas formas lo que buscas no parece complicado y si tiras de la
ayuda (F1 desde el editor y con el cursor sobre los terminos que
tengas dudas, o escribiendolos en el cuadro de busqueda que te
aparezca al pulsar F1. Prueba a escribir Change en dicho cuadro o
Eventos, a ver que tal

si puedo mañana 'hablamos'

un saludo
Ivan
Respuesta Responder a este mensaje
#7 Joan
26/07/2007 - 20:30 | Informe spam
Ivan:

Comenta, comenta!!!

No me duele que me rectifiquen ya que esa es la manera de aprender.

Y no te preocupes por el tiempo que tardes ya mucho has hecho.


Pero creo que te voy a poner las cosas un pelín más difíciles.
Mira, la macro o módulo que te me has enseñado la uso para ocultar (y
mostrar intentaré que también) ciertas filas de unas fichas que estoy creando.
Dependiendo del dato que me dan en la celda de control, necesito que se
muestren unas filas o unas otras en las que he hecho unos cálculos o escrito
unas obsevaciones. Hasta ahora lo había hecho con simples
SI(C15=0;"correcto";"amplia") y encadenando SIes, Y, O, etc. pero al ir
ampliando la ficha y haciendola crecer, me encontraba que la cosa se alargaba
y en muchas celdas la respuesta era un simple "sin incidencias" o un "nada
que objetar" o simplemente la dejaba en blanco. Así optaba por ocultar esas
filas y al imprimir me había ahorrado unas cuantas páginas de texto casi en
blanco. Éste es el motivo por el que quiero que se "automatice" la ocultación
de filas.

AHORA VIENE LA COMPLICACION: Ahora he querido bloquear las celdas para que
no me cambien las fórmulas por error y cosas por el estilo pues muchas celdas
estan vinculadas y otras estan fijadas a ciertos valores.

La cosa es que al proteger la hoja, la macro ha dejado de funcionar puesto
que no puede "Hidden" u ocular la fila que deseo. Desbloqueo la hoja y la
macro va de seda ... vuelvo a bloquear la hoja y otra vez el error. Con ello
deduzco que la macro está bien escrita (mejorable o comentable como tu dices)
y que funciona siempre y cuando la hoja no esté bloqueada.

Como te he comentado, quiero y deseo que la hoja esté bloqueada. ¿Cómo lo
hago para que la macro funcione aunque la hoja esté bloqueada? ¿Debería hacer
que primero la macro desbloquee la hoja, oculte las filas, y luego vuelva a
bloquear la hoja?

Perdona por el nuevo tostón ... pero me ha entrado el gusanillo de la
programación y ahora estoy ansioso por conocer más entrañas del excel y del
VBA.

Gracias de nuevo

Joan Vallespir

Respuesta Responder a este mensaje
#8 Ivan
28/07/2007 - 04:43 | Informe spam
hola Joan, preparate para un rollazo. Si prefieres saltartelo al final tienes una propuestaque podria solucionar el
ultimo problema

voy a intentar darte 'mi punto de vista' sobre lo que pueda, pero primero permiteme volver a recomendarte que antes de
dar por cierto lo que te diga intentes contrastarlo, pej., con la propia ayuda que te comentaba, o con el bucador del
foro (via Google), pues, aunque en lo mas general creo que mas o menos estoy en lo cierto puede colarseme algun que otro
gazapo de mi 'imaginacion'.

Comenta, comenta!!!
No me duele que me rectifiquen ya que esa es la manera de aprender





(estoy totalmente de acuerdo. A mi me ocurre lo mismo, asi que no dude(i)s en hacerlo si cree(i)s que se me ha ido la
olla)

bueno, al grano, pero antes de meterle mano a los codigos te comento algunas cosas sueltas que creo viene bien saber y
te ayudaran a entenderlos mejor:

Mi pregunta ahora es: ¿Y si en lugar de ocultar unas filas, lo que quiero es mostrar otras?





el propio 'metodo' Hidden realiza ambas tareas:

ocultar la fila 1->> Rows(1).Hidden = True
mostrar la fila 1->> Rows(1).Hidden = False

Por deducción he escrito el siguiente código pero no me funciona Range(filasMostrar1).Rows.Shown = True





no se si sabre explicarlo (tampoco te creas que acabo de tenerlo claro) pero, aunque la deduccion esta muy bien y es
totalmente logica (de hecho el metodo 'Show' se utiliza en algunos objetos para mostrarlos), me temo que en los
lenguajes de programacion (o al menos en VB) los objetos ya 'traen' incorporados sus metodos, propiedades y/o eventos,
y nosotros lo que podemos hacer es utilizarlos para nuestros fines, pero deben ser admitidos por dicho objeto (y salvo
que entraramos en esos niveles superiores de programacion que te comentaba en el otro mensaje, en los que (creo que)
podemos crear nuestros propios metodos, propiedades, etcobjetos...)

muchas de estas prop., metodos, eventos pueden ser comunes a muchos objetos, pero otros pueden ser exclusivos de la
clase u objeto de turno y si intentamos usar pej. una propiedad con un objeto que no la admite nos generaria un error
(caso de Shown, que ademas creo que tal cual la pones no existe)

pej: si intentamos mostrar un formulario co el metodo Hidden (creo que ) se generara un error, pues no admite dicho
metodo y sin embargo podriamos usar 'Show' y se mostraria sin problemas, mientras que con un objeto Range nos ocurriria
lo contrario, deberiamos usar Hidden, pero para liarlo mas, para ocultar el formulario deberiamos usar 'Hide' bueno
un cacao pero es cuestion de practicar y ...


INCISO: por si no lo supieras, cuando hablo de objeto, y por darte una explicacion muy 'personal', me refiero a casi
cualquiera de las cosas que en definitiva estamos manipulando, es decir, en el plano +/- evidente estarian pej. celdas,
filas, hojas, libros, formularios, botones, cuadros de texto,etc,... pero tambien existen el objeto Fuente, Caracter,
Salto de pagina, y un largo etc, que aparte de no ser tan evidentes ademas en muchos casos comparten nombre con una
propiedad de otros objetos. Creo que me stoy liando, asi que a ver si este ej. aclara algo

la siguiente instruccion supongo que es evidente que pone en 12 el tamaño de la fuente de la celda A1 de la hoja
"MiHoja" del libro "MiLibro"

Workbooks("MiLibro.xls").Worksheets("MiHoja").Range("a1").Font.Size = 12

bien pues si vamos paso a paso vemos que Workbooks es una propiedad del objeto digamos que 'supremo': el objeto
Application (el cual se puede omitir en algunos casos, como este, pero podriamos haber puesto
Application.Workbooks). Esta propiedad nos devuelve un objeto Workbook ( en este caso el llamado "MiLibro.xls"),
miembro de la coleccion Workbooks

con Worksheets pasa exactamente lo mismo, pero en este caso se trata de una propiedad del objeto Workbook, y
evidentemente nos devuelve un objeto Worksheet (hoja de calculo). Igfualmente para Range

t finalmente llegamos a Font que asi mismo es una propiedad, en este caso del objeto Range, e igulmente devuelve un
objeto 'Font'. el cual tiene sus propias propiedades pej: negrita, color, size, etc.. sin embargo, y pej. esta ultima
propiedad (Size) no devuelve ningun objeto Size ( que si no me equivoco no existe), simplemente devuelve o permite
modificar el tamaño de la fuente.

bueno, una vez 'presentado' el objeto 'objeto', comentarte que estos tienen (o mejor dicho pueden tener ):

a) 'Propiedades' => que devuelven una cualidad/carateristica/estado/etc del objeto, y, en muchos casos, nos
permite manipularla/modificarla (ej de propiedades son:. Size, Color, Height, y otras muchas no tan evidentes)

b) 'Metodos' => que nos permiten realizar/ejecutar una accion sobre el objeto (la frontera entre los metodos y las
propiedades a veces es un tanto difusa)
algunos ej: podrian ser: Hidden, Show, Hide, Clear, Delete e igualmente un largo etc

c) 'Eventos' => son un tip'o de procedimientos 'sub' que quizas deberia haberte mencionado en mi anterior mensaje, y
que se ejecutan cada vez que 'sucede' determinada accion/situacio/circunstancia en/sobre el objeto. No todos los objetos
tienen/exponen procedimientos de evento y de los que si lo hacen cada uno responde a determinados, que en algunos casos
pueden ser comunes a varios objetos y en otros ser exclusivos de el o de su clase Como, si los conocemos, podemos
predecir/saber cuando se van a disparar, pueden ser muy utiles para realizar ciertas acciones en determinado momento y
de una forma llamemosle automatica.

Su sintaxis es +/- asi:

Private Sub Objeto_Evento(Parametros si los tiene)
' aqui pondriamos el codigo para aprovechar el evento
End Sub

Algunos ejs. de eventos podrian ser:

1.- de Libro (Workbook) : Open, Activate, WindowActivate, BeforeClose, .
2.- de Hoja (WorkSheet): Activate, SelectionChange, Change, Deactivate ...
3.- de Formulario (UserForm) : Initialize, Activate, Click, Resize
4.- de TextBox : Enter, Click, DobleClick, Change, Exit,

en general sus nombre suelen ser bastante descriptivos de cuando se producen.

pej. si quieres ver los eventos disponibles para un libro, abre el editor (alt+F11), haz doble click sobre el modulo
thisworkbook, en la ventana que se te abre despliega el cuadro de texto que veras sobre la zona editable de la ventana a
la izq. y elige Workbook. Automaticamente se te colocara el cursor dentro del procedimiento del evento predeterminado
para el libro (Open). ahora si quieres ver el resto de eventos que podrias manejar despliega el cuadro que esta a la
derecha del anterior y en el que ahora mismo deberia poner 'Open'. Esa es la lista de los eventos para el objeto
Workbook. Haz click en el que quieras y se te desplegara en la ventana

(NOTA: para ver la ayuda sobre un evento con F1 una forma seria ponerte entre el guion bajo que lo precede en el codigo,
dar a la barra espaciadora para separar el guion del nombre del evento y ahora pulsa F1, se te abrira la ayuda sobre ese
evento. No te olvides, de , al cerrar la ayuda volver a dejar el evento como estaba, eas decir quitar el espacio que has
introducido y juntar el guion con el nombre del evento)

todo esto viene a colacion de estos comentario =>>

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?





el conflicto de nombre (nombre 'ambiguo' seguramente) se debe a (como bien has intuido) la duplicacion del nombre del
procedimiento. Lo que pasa es que la solucion no es la adecuada: solo existe un (procedimiento de) evento Change para
cada hoja, y lo que has hecho con tu modificacion del nombre del procedimiento es crear un procedimiento 'sub' normal,
que para que se ejecutase tendrias que llamarlo desde 'algun' sitio (otro procedimiento, un boton, el cuadro de dialogo
'Macros', ...el evento Change de la hoja, etc..)

es decir, el procedimiento "Private Sub Worksheet_Change(ByVal Target As Range)". es un procedimiento de evento de las
hojas de calculo (de excel, je,je,,..) que se dispara cada vez que se cambia algo (con alguna excepcion, creo) endicha
hoja. y viene ya predefinido en la aplicacion.

si se quieren realizar varias acciones diferentes en un mismo evento, debes 'coordinarlas' mediante las diversas
posibilidades del lenguaje VBA, como pueden ser codicionales tipo If ... Then u otras formas, u organizarlo para que
sucedan unos tras otros y/o salir del procedimiento si se cumple o no determinada condicion.

bueno, creo que me estoy yendo demasiado de bareta

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?





estando en excel ve al menu Herramientas => Macros => Grabar macro => se te abrira un cuadro de dialogo, echale un ojo
y si quieres rellenas lo que creas y si no simplemente aceptas. A partir de ese momento las aciones que realices se
estaran grabando para poder ejecutarlas automaticamente cuando quieras. Para detener la grabacion pulsa el boton detener
grabacion de la pequeña barra flotante que se te habra puesto por ahi.

para ver el codigo ve otra vez a herramientas => Macros => Macros y en el cuadro elige modificar (tambien puedes ir al
editor y abrir el nuevo modulo que se te habra añadido. El codigo que veras es el resultado de tus acciones y en teoria,
si ejecutaras la macro esas instrucciones son las que repetirian tus acciones durante la grabacion. A partir de aqui lo
mejor es tirar de F1 y de este foro.

me comentastes que conocías páginas donde
encontrar "Manuales de VBA para torpes que quieren meterse en el ajo"







la verdad es que hay muchas opciones en la web, pero por darte uno en concreto que creo es bastante completo, y aunque
es para vba access, el ¿90%? es comun a excel, sobre todo lo que se refiere a la sintaxis y diversos tipos de
estructuras, datos, variables, etc

Euardo Olaz: manual VBA acces, bastante completo y en general aplicable a excel
http://www.olaz.net/descargas/acces...tregas.htm

vinculo a conversaciones sobre eñ tema 'Manuales VBA', en ellas encontraras muchas propuestas
http://tinyurl.com/2r5jqn

y aqui va una respuesta de HM al repecto.

-hector Miguel --

Hay alguna forma de descargar algun excelente manual.
Gracias Ante todo y me regalan alguan dire wwww




en cuanto a alguna 'recomendacion' por material de aprendizaje [generalmente
'mi' respuesta es la que te 'apunto' al final]...
[ademas] acostumbro 'afirmar' que: "cada quien avanza, al 'ritmo' que
quiere/puede/necesita/..." :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.


-> me gustaria decirte que leyendo 'tales o cuales' libros ... [pero,
estaria siendo 'excluyente'] ;)
todo material de estudio [manuales, {F1}, libros, revistas, cursos,
web's, estos foros, etc.] ->es excel...ente<-
ademas considera que [en muchas de las ocasiones]
-> 'buscando una cosa'... 'encuentras otra' [que se te habia 'perdido']
-> o ['te topas' con] 'la hermana que se escapo de su prision'
[sor-presa... NO esta !!!] :))


-> cuando 'se atora la carreta' [que nos sucede a todos] :-(
NO es 'imprescindible' saberlo todo ;) es suficiente con saber...
el telefono del que sabe... o el e-mail... o la web... o... por que no
consultas en el foro? :D


aunque [supongo que de algun modo] no 'escaparas' de consultar al asistente
{F1} de excel/vba...
encontraras [algunos] manuales/instructivos/cursos/etc. en las siguientes
direcciones:
[aunque... 'calificarlo/s' de sencillos/complicados/completos/buenos/...
dependera de factores 'personales'] :D


una lista de manuales y tutoriales [ingles]
http://www.virtualhelpdeskcentral.c...asp?SiteID&NoGU...
goryID


algunas paginas en ingles...
Charles Williams (DecisionModels): http://www.decisionmodels.com/
Tushar Mehta: http://www.tushar-mehta.com/excel/
Laurent Longre: http://xcell05.free.fr/
Rob Bovey: http://www.appspro.com/Tips/Tips_And_Tricks.htm
Stephen Bullen' Excel MVP's page: http://www.bmsltd.ie/MVP/Default.htm
Jurgen Volkerink (KeepItCool):
http://members.chello.nl/keepitcool/addins.html
Matt Evans: http://www.exinfm.com/free_spreadsheets.html
Karl Peterson: http://vb.mvps.org/samples/
Bob Umlas: http://www.emailoffice.com/excel/ar...umlas.html
Carlo Quintero: http://www.mztools.com/
Van Gelder: http://homepages.paradise.net.nz/~robree/excel/
MiStupid (Training Online): http://mistupid.com/tutorials/excel/
ExtremeVBTalk(newsgroup): http://www.visualbasicforum.com/


algunas paginas en castellano...
http://www.franciscopascual.com/Arc...202002.zip
http://www.javeriana.edu.co/decisio...ejercicios
http://www.javeriana.edu.co/cursad/...iento.html
http://members.fortunecity.es/tonelorc/eexcel.html
http://www.aulaclic.es/excel2000/f_excel2000.htm
http://64.226.188.26/sivnetwork-www/cursos_gratis/excel/Excel.htm
http://www.territoriopc.com/excel/
http://interinfo.iespana.es/interin...nuales_...
http://www.fullwebs.com.uy/endondee.../excel.pdf
http://office.arnulfoperez.com/excel/
http://lacher.com/toc.htm
http://www.sistemaslym.net/vba/excel/excel.html
http://es.geocities.com/lacibelesde...macros.htm
http://es.geocities.com/lacibelesde...acros1.htm
http://www.macroheavy.com/excel/excel.asp
http://www.geocities.com/gorita_2000/VBA.htm
http://www.excelavanzado.com/
http://www.xtec.es/~rlloren4/KBEsp2.htm
http://www.exceluciones.com/portal/...p?article5

-

bueno y en cuanto al codigo y las protecciones, prueba a, con la hoja desprotegida desbloquear la celda 'I15' y vuelve
a proteger la hoja. Ahora añade los siguientes codigos en los modulos que te indico. Guarda todo, cierra el libro y
vuelve a abrirlo, a ver que tal

''en el modulo Thisworkbook --
'
Private Sub Workbook_Open()
Worksheets("Hoja2").Protect _
Password:="6666", _
UserInterfaceOnly:=True
End Sub

'' 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

'' finalmente en un modulo normal copias/pegas es te codigo =>>

Public Sub Ocultar_Mostrar_Filas_2(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")
filasMostrar = Array("36:48,116:140", "36:61,116:165", _
"36:74,116:170", "36:87,116:215", _
"36:100,116:240", "36:113,116:265")
With ActiveSheet
For n = 0 To UBound(filasOcultar)
If rango1.Value = n Then
.Range(filasOcultar(n)).EntireRow.Hidden = True
ElseIf rango1.Value = n + 1 Then _
.Range(filasMostrar(n)).EntireRow.Hidden = False
End If
Next
End With
End If
End Sub


esta conversacion puede interesar:te:

.- sobre protecciones y macros
http://tinyurl.com/2ljgeu

bueno, al final lo de escueto como que no, ¿no?

un saludo
Ivan
Respuesta Responder a este mensaje
#9 Ivan
28/07/2007 - 20:05 | Informe spam
hola de nuevo Joan,

con la que te solte ayer y todavia tengo ganas [debes pensar]

bueno, el caso es que ayer cuando cerre tu mensaje estaba un tanto aturuyado con otro tema y no me acaba de gustar lo
que te mande:

1º) por un lado, y aunque posiblemente es evidente y ya te habras dado cuenta, aqui

''en el modulo Thisworkbook --

'

Private Sub Workbook_Open()

Worksheets("Hoja2").Protect _
Password:="6666", _
UserInterfaceOnly:=True
End Sub







donde pone "Hoja2" iria el nombre de tu hoja y en donde pone "6666" debe ir la contraseña que le hayas puesto a la hoja
(para versiones anteriores al 2002 <o al 2000, no estoy del todo seguro>no haria falta poner la clave). Ambas deben ir
entre comillas, como en el ej.

2º) por otro lado cambia el procedimiento. 'Public Sub Ocultar_Mostrar_Filas_2'

por este otro que evita acciones y variables innecesarias:=>>

'ya sabes en un modulo normal-

Public Sub Ocultar_Mostrar_Filas_3(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")
With ActiveSheet
For n = 0 To UBound(filasOcultar)
If rango1= n Then
.Rows.Hidden = False
.Range(filasOcultar(n)).EntireRow.Hidden = True
Exit Sub
End If
Next
If rango1 = 6 Then _
.Range(filasOcultar(0)).EntireRow.Hidden = False
End With
End If
End Sub

'y por supuesto cambia el 2 por el 3 del nombre del nuevo procedimiento en el evento change de la hoja:=>>

Private Sub Worksheet_Change(ByVal Target As Range)
Ocultar_Mostrar_Filas_3 Target, Range("i16")
End Sub

'****************************
y ahora y solo como curiosidad para que te hagas una idea de las diversas formas que puede haber para estructurar un
mismo codigo (o mas bien de conseguir un mismo resultado) este otro ej. seria igual que el de mi anterior mensaje pero
usando una estructura Select Case (mirala en la ayuda) en vez de 'If ...Then ...ElseIf Then End If '. Ya que lo
he probado te lo pongo para que veas una posibilidad mas

'''''''''en un modulo normal

Public Sub Ocultar_Mostrar_Filas_4(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")
filasMostrar = Array("36:48,116:140", "36:61,116:165", _
"36:74,116:170", "36:87,116:215", _
"36:100,116:240", "36:113,116:265")
With ActiveSheet
For n = 0 To UBound(filasOcultar)
Select Case rango1.Value
Case Is = n
.Range(filasOcultar(n)).EntireRow.Hidden = True
Exit Sub
Case Is = n + 1
.Range(filasMostrar(n)).EntireRow.Hidden = False
Exit Sub
Case Else
End Select
Next
End With
End If
End Sub

bueno,

espero te ayuden

un saludo
Ivan
Respuesta Responder a este mensaje
#10 Ivan
28/07/2007 - 21:08 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida