Nombre de Hoja

09/02/2008 - 17:23 por Nicola Lucadamo | Informe spam
Hola a todos,

es posible en Excel 2003 programar, para que el nombre de una o varias hojas
de cálculo de un archivo, se puedan colocar automáticamente.

Por ejemplo:

En una hoja de cálculo en la celda "A1" tengo escrito ENERO 2008.

Hay alguna manera de programar para que el nombre de la hoja también sea
ENERO 2008 sin tener que escribirlo.

De antemano Gracias.

Nicola Lucadamo

Preguntas similare

Leer las respuestas

#6 Ivan
12/02/2008 - 22:57 | Informe spam
hola Nicola

como hacer o que




agregar a la rutina del 1er caso para que ocurra lo mismo, pero tomando el valor de una celda programada.

Es decir, si deseo que el nombre de la hoja sea igual al contenido de la celda $B$1, la cual esta programada para que en ella aparezca en nombre del mes de la fecha que se encuentra en la celda la celda A1.<<<



si te he entendido bien, prueba esto=>

1º) elimina el procedimiento de la hoja (Private Sub
Worksheet_Change(ByVal Target As Range) ) y pon este otro, tambien en
el modulo de la hoja =>

Private Sub Worksheet_Calculate()
On Error Resume Next
Me.Name = [b1]
If Err.Number <> 0 Then MsgBox _
"No se puede cambiar el nombre a la hoja " _
& Me.Name & vbCr & "Comprueba que el nombre" _
& " es valido o no esta duplicado"
On Error GoTo 0
End Sub

2º) vuelve a la hoja y pon esta formula en B1 =>

=TEXTO(ENTERO(A1);"mmmm")

3º) prueba a escribir una fecha cualquiera en A1 (recuerda que si ya
existe una hoja con el nombre del mes de la fecha que pongas en A1, te
lanzara un mensaje por nombre de hoja duplicado

espero te valga

un saludo
Ivan
Respuesta Responder a este mensaje
#7 Ivan
12/02/2008 - 23:08 | Informe spam
hola de nuevo, Nicola

aunque la ultima propuesta es valida, creo que no tiene sentido andar
recalculando y renombrando la hoja cada vez que cambie una formula,
aunque no tenga nada que ver con el tema

para mi gusto, y si al fin y al cabo lo que va a dar el nombre a la
hoja es el mes de la fecha introducida en A1, olvidate de lo anterior
(quita el procedimiento Calculate del modulo de la hoja) y usa mejor
este otro, tambien en dicho modulo =>

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
On Error Resume Next
If IsDate(Target) Then Me.Name = _
Format(CDate(Target), "mmmm")
If Err.Number <> 0 Then MsgBox _
"No se puede cambiar el nombre a la hoja " _
& Me.Name & vbCr & "Comprueba que el nombre" _
& " es valido o no esta duplicado"
On Error GoTo 0
End If
End Sub

creo que este sera menos 'cargante'

espero te ayude

un saludo
Ivan
Respuesta Responder a este mensaje
#8 Nicola Lucadamo
13/02/2008 - 02:51 | Informe spam
Gracias Ivan.

Probé lo que me indicaste en tu exposición anterior y funciona perfectamente
en una hoja nueva, pero cuando la aplico en la hoja de trabajo donde
necesito la macro, no se porque, al ingresar un dato en cualquier celda la
macro se ejecuta y después de varios segundos me muestra el mensaje de
error.

En base a tus sugerencias y mi poca experiencia me puse a investigar un poco
y no se como me aparecieron en el módulo de worksheet, la primera y tercera
línea de las siguientes:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Me.Name = [c6]
End Sub

Se me ocurrió colocar la del medio y funciona bien. No se si a futuro
generará algún error.

En ambos casos tu penúltima propuesta y la indicada arriba, generan error de
ejecución si tengo el libro protegido y entiendo el porque. No se si hay
alguna manera de salvar esto o inevitablemente el libro tiene que seguir sin
protección.

De nuevo gracias por tus sugerencias.

Un saludo

Nicola Lucadamo
Respuesta Responder a este mensaje
#9 Ivan
13/02/2008 - 21:52 | Informe spam
hola Nicola, [te aviso, es un autentico tomo, así que, si no estas interesado en aprender VBA, te recomiendo ir
directamente al final del mensaje, aunque no se si te servirá de mucho]

. cuando la aplico en la hoja de trabajo donde necesito la macro, no se porque, al ingresar un dato en cualquier
celda la macro se ejecuta y después de varios segundos me muestra el mensaje de error. .. <<<







Me temo que, por un lado, no he sabido explicarme, y por otro, tus explicaciones tampoco se ajustaban mucho a la
realidad.

por esta instrucción que comentas mas adelante => Me.Name = [c6] <= deduzco que la celda C6 es de la que quieres tomar
el nombre de la hoja (B1 en tu explicación del mensaje anterior), y por lo que comentas en la cita anterior, supongo que
esta celda no es en la que introduces manualmente (o quizás también lo haces por formula??) la fecha (A1 en tu
exposición del mensaje anterior) sino la que toma el mes de la otra.

Copio la parte de dicho mensaje para intentar aclararnos=>

Es decir, si deseo que el nombre de la hoja sea igual al contenido de la






celda $B$1, la cual esta programada para que en ella aparezca en nombre del
mes de la fecha que se encuentra en la celda la celda A1.<<<

A ver si se explicarte lo que yo creo, pero para ello añado un ultimo fragmento de tu ultimo mensaje =>

. me puse a investigar un poco y no se como me aparecieron en el módulo de worksheet, la primera y tercera línea
de las siguientes:..






Private Sub Worksheet_SelectionChange(ByVal Target As Range) ...<<<<

Lo que posiblemente has hecho en tus 'investigaciones' ha sido desplegar el combo que hay sobre la parte izq. de la
ventana del modulo, y seleccionado 'Worksheets'. Al hacer esto, normalmente se te despliega en dicho modulo el principio
y el final del procedimiento de 'evento' predeterminado del objeto seleccionado en el combo, que en el caso de las hojas
de calculo es el 'evento' SelectionChange'. (también podrías haber desplegado el combo de la derecha y seleccionado
dicho evento, lo cual haría lo mismo)

Como te abr sonado un poco a chino, te explico un poco, pero no me hagas demasiado caso e intenta contrastar lo que te
diga

.Hay algunos términos que conviene mas o menos comprender si te quieres meter un poco en este mundo de VBA. Entre ellos
algunos de los mas importantes quizás sean: objetos, módulos, propiedades, métodos y eventos

.=> objetos son básicamente casi todos los elementos con los que interactuamos en una aplicación, pej. en el caso de
excel -> los libros, hojas, rangos, celdas, gráficos, formas, etc. Estos mas o menos resultan evidentes, aunque algunos
pueden no serlo tanto -> las fuentes, bordes, saltos de pagina, y un largo etc. En cualquier caso para lo que nos ocupa
basta con que comprendas que los primeros son objetos,

a) los objetos a su vez suelen exponer propiedades, métodos y eventos, (aunque no siempre exponen todos) propios de cada
tipo de objetos (aunque pueden compartir algunos). Estas propiedades, métodos y/o eventos nos permiten obtener detalles
de dichos objetos y en su caso actuar sobre ellos. O en el caso de los eventos saber que se ha realizado determinada
acción sobre ellos

Aunque la frontera entre las propiedades y los métodos es a veces un tanto difusa, una definición podría ser la
evidente:

b) las propiedades son características del objeto (nombre, color, posición, etc...).

c) los métodos nos permiten ejecutar determinadas acciones sobre ellos (copiar, eliminar, crear, imprimir, etc...)

d) los procedimientos de 'evento' son un tipo de rutinas especiales que vienen definidos para cada objeto (los que los
exponen) y que se producen/disparan cuando ocurre determinada cosa. Podemos interceptarlos y aprovecharlos para realizar
determinadas acciones cuando esto ocurra.

NOTA:-> estos eventos se manipulan en los módulos adscritos a cada objeto (los de cada hoja, como has visto, en el
modulo de cada una, los del libro en el modulo Thisworkbook, los de Userform en su propio modulo, que se crea al
insertar el userform), aunque no todos los objetos que exponen eventos tienen su propio modulo, sino que algunos se
manipulan en el de su contenedor (pej. los controles, que, incrustados en una hoja se manipularían en el de la hoja, o
incrustados en un formulario, que se haría desde el de este ultimo)

Solo para completar, existen otros tipos de módulos:

=> los módulos de clase (en realidad los de los objetos mencionados también lo son) destinados normalmente a la creación
de nuestros propios objetos, con sus propiedades , métodos, eventos, etc, y que de momento, al menos para mi, son
palabras mayores,

=> los módulos standard, normales, etc, o simplemente módulos a secas. Estos son en los que por regla general debemos
poner nuestras macros, salvo en los casos en los que queramos utilizar algún evento, en cuyo caso irían en el modulo del
objeto/contenedor correspondiente

Pej. en este hilo hemos visto tres eventos de la hoja de calculo =>

1.-> el evento Change, que se produce (casi) siempre que se produce un cambio en cualquier celda/rango de la hoja de
calculo

2.-> el evento Calculate, que se produce cada vez que se recalcula la hoja, es decir que se recalculan las formulas y/o
vínculos que esta pueda contener

3.-> el evento SelectionChange, que se produce cada vez que cambia la selección en la hoja

NOTA-> para ver todos los eventos de la hoja (o de cualquier otro objeto), estando en el modulo correspondiente a dicha
hoja/objeto, selecciona en el combo superior izquierdo el nombre del objeto (que en el caso del propietario del modulo
suele ser genérico: Workbook, Worksheet, Userform, ...) y despliega el combo de la derecha. En este te aparecerán todos
los eventos expuestos por dicho objeto. Si lo seleccionas te pondrá en el modulo (si no esta ya, pues no puede haber
procedimientos repetidos en un mismo modulo) el encabezado y el cierre de dicho procedimiento, pudiendo escribir entre
medias las instrucciones para aprovechar el evento.

Bueno, todo este rollo es para comentarte que, =>

.->dado que los eventos se producen SIEMPRE que 'ocurre' el hecho que los provoca, estemos utilizándolos o no, incluso
aunque ni siquiera sepamos que existen,

.-> a la hora de utilizarlos, es decir, realizar acciones del tipo que sea cuando se disparan, normalmente conviene
condicionar dichas acciones a que se produzcan solo cuando a nosotros nos interese, y no cada vez que se dispare el
evento, o nos arriesgamos. aparte de a posibles errores y/o bucles sin fin, a ralentizar mucho el funcionamiento de la
aplicación, aun mas si estamos utilizando muchas formulas, formatos condicionales, etc,

Esto es lo que ocurría con el evento Calculate , que cada vez que hubiese un recalculo, aunque no afectase en absoluto a
las celdas involucradas en cambiar el nombre a la hoja, el código se ejecutaba de todas formas e innecesariamente. Y en
el caso del SelectionChange, aun puede resultar mas pesado, pues ten n cuenta que normalmente cambiamos de selección una
gran cantidad de veces cuando recorremos una hoja,

Es por esto por lo que te comentaba el volver al uso del Change. Pero eso si, condicionando la ejecución a que el cambio
se produzca en la celda que nos interese.Y si la celda C6 no contiene una formula no debería (creo) haberte dado
problemas con mi ultimo código, siempre y cuando sea en la que introduces la fecha original.

En este caso, si te fijas, los procedimientos Change y SelectionChange admiten un parámetro (Target) que se corresponde
con la celda/rango sobre la que ha 'sucedido' el evento

Podemos utilizar este parámetro para condicionar la ejecución de nuestro código a que el evento recaiga sobre la celda
que nos interese. Pej. para tu caso podría ser algo así (entre bastantes mas posibilidades) =>

If Target.Address = "$C$6" then Me.Name = Range("C6")

NOTAS:

.-> 'Me' es un termino que hace referencia al objeto propietario del modulo [de clase] en que este escrito el código. En
este caso la hoja correspondiente.
.-> 'Address' es una propiedad del objeto/conjunto Range que devuelve la referencia del rango como cadena de texto
(string) en estilo [$A$1]
.-> Range("C6") = [C6] = Cells(6, 3) -> son diferentes formas de nombrar una celda/rango

En cualquier caso te recomiendo, si estas interesado, que tires lo mas posible de la ayuda. Una forma muy útil es poner
el cursor sobre los términos que desconozcas y darle a F1. Normalmente devuelve la ayuda correspondiente a dicho
termino, y aunque al principio pueda costar un poco, acaba haciéndose imprescindible.

Y para acabar este tomo, solo preguntarte =>

¿donde y como pones la fecha original, es decir de la que toma el mes la celda que pondría el nombre a la hoja?


Finalmente, en cuanto a la protección de la hoja =>

... generan error de ejecución si tengo el libro protegido y entiendo el porque. No se si hay






alguna manera de salvar esto o inevitablemente el libro tiene que seguir sin protección. <<<

si no me equivoco podrías usar el parámetro UserInterFaceOnly del método Protect, para permitir la ejecución de código
con el libro protegido (no admite algunas cosas, pero creo que esta si, aunque no me hagas caso)

de todas formas he trabajado poco con ello y además hace tiempo, pero en el foro hay multitud de conversaciones al
respecto. Te recomiendo que busques con el buscador de google en el grupo. O en su defecto, y si alguien no te lo aclara
aquí mismo, abrir un nuevo hilo con dicha consulta (de todas formas si tengo un rato <mas> intentare refrescar mi
memoria y aprender algo sobre el tema y si acaso te comento lo que vea)

bueno, lo dicho, disculpa el rollo

un saludo
Ivan
Respuesta Responder a este mensaje
#10 Nicola Lucadamo
17/02/2008 - 04:02 | Informe spam
Hola Iván,
Disculpa la tardanza y gracias por tu tiempo para instruirme en mis dudas.

Efectivamente, la celda de donde tomo el dato es la c6, y cuando mencionaba
otra era solo a modo de ejemplo.
Es una hoja de cálculo donde se manejan cuentas por cobrar y se crea un
archivo para cada período. En una celda de la hoja se coloca la fecha de
inicio del período, y esa fecha define el período. Por ejemplo si la fecha
es 16/02/2008, en la celda c6 está programado que aparezca "Febrero 2008",
lo que quise agregarle a la hoja es lo que estaba relacionado con la
pregunta.

Las líneas que me aparecieron al escribir la macro se que de alguna forma el
editor del VB las colocó automáticamente, lo que no sabía es como llegué
para que eso ocurriera. Del resto que me explicas tengo idea más no
conocimiento. Tengo varias aplicaciones personales que hice en VFP7 por lo
que entiendo de lo que me hablas más no domino los comandos de VB. Ojala
tuviera más tiempo disponible para aprender más de VB.

De nuevo gracias por tu tiempo.

Saludos

PD: Probé tu última sugerencia pero todavía no logro que la macro funcione
con el libro protegido. Seguramente no estoy aplicando correctamente la
función Protect.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida