Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ocultar una fila condicionada a un resultado

1,316 views
Skip to first unread message

Joan

unread,
Jul 20, 2007, 11:44:00 AM7/20/07
to
¿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

Ivan

unread,
Jul 20, 2007, 3:36:59 PM7/20/07
to

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

Joan

unread,
Jul 20, 2007, 9:04:01 PM7/20/07
to
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ó:

Ivan

unread,
Jul 21, 2007, 10:39:29 AM7/21/07
to
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

Ivan

unread,
Jul 21, 2007, 10:50:46 PM7/21/07
to
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, =23 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


Joan

unread,
Jul 25, 2007, 3:00:01 PM7/25/07
to
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!!!!

Ivan

unread,
Jul 25, 2007, 10:26:15 PM7/25/07
to

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

Joan

unread,
Jul 26, 2007, 2:30:03 PM7/26/07
to
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
joan_vall...@hotmail.com

Ivan

unread,
Jul 27, 2007, 10:43:35 PM7/27/07
to
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, etc....objetos...)

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/access/curso_vba/vba_entregas.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.com/sitecategory.asp?SiteID=12&NoGU...
goryID=18


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/arrays-bobumlas.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/Archivos/Excel%202002.zip
http://www.javeriana.edu.co/decisiones/modelos/ejemplos_y_ejercicios....
http://www.javeriana.edu.co/cursad/diplomado/ejemplos_j_sarmiento.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/interinfo/info_general/manuales/manuales_...
http://www.fullwebs.com.uy/endondeestamos/Downloads/Tutoriales/excel.pdf
http://office.arnulfoperez.com/excel/
http://lacher.com/toc.htm
http://www.sistemaslym.net/vba/excel/excel.html
http://es.geocities.com/lacibelesdepunilla/macros.htm
http://es.geocities.com/lacibelesdepunilla/macros1.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/index.php?article=35

----------------------------------------------------------------------

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


Ivan

unread,
Jul 28, 2007, 2:05:34 PM7/28/07
to
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


Ivan

unread,
Jul 28, 2007, 3:08:21 PM7/28/07
to
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


Ivan

unread,
Jul 28, 2007, 3:54:12 PM7/28/07
to
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" <lomboc...@estoteleline.es> escribió en el mensaje news:eUxzoqU0...@TK2MSFTNGP06.phx.gbl...

Joan

unread,
Aug 7, 2007, 2:20:02 PM8/7/07
to
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

Joan

unread,
Aug 8, 2007, 3:20:02 PM8/8/07
to
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
joan_vall...@hotmail.com

Ivan

unread,
Aug 8, 2007, 4:45:57 PM8/8/07
to
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


Ivan

unread,
Aug 8, 2007, 5:54:34 PM8/8/07
to

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

0 new messages