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

obtener nombre de las hojas de un libro sin abrirlo

1,313 views
Skip to first unread message

Ivan

unread,
Feb 3, 2007, 8:58:36 PM2/3/07
to
hola a todos

prácticamente el asunto lo dice todo: ¿es posible obtener vía código los
nombres de las hojas de un libro sin tener que abrirlo? no me haría falta
acceder a los datos de dicho libro, tan solo obtener estos nombres, y de
paso (como mucho, pero no imprescindible) el valor de otras propiedades tipo
: fecha creación, ultima modificación. etc..

para esto ultimo he pensado que quizás me valiera DocumentProperty (no lo he
probado ), pero lo cierto es que para el nombre de las hojas no se muy bien
como intentarlo

si podéis echarme una mano os lo agradezco

un saludo y hasta pronto
Ivan


Héctor Miguel

unread,
Feb 3, 2007, 9:25:07 PM2/3/07
to
hola, Ivan !

> ... es posible obtener via codigo los nombres de las hojas de un libro sin tener que abrirlo?
> ... y de paso (como mucho, pero no imprescindible) el valor de otras propiedades tipo: fecha creacion, ultima modificacion. etc...

el siguiente ejemplo 'trabaja bien' leyendo los nombres/etiquetas de las hojas de un libro cerrado:
si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

-> IMPORTANTE: establece primero en tu proyecto de macros VBA una referencia a la libreria...
-> Microsoft ADO Ext. x.x for DDL and Security
== en un modulo de codigo 'normal' ==
Sub Nombres_hojas()
Dim Libro As ADOX.Catalog, Hoja As ADOX.Table, Archivo As String, Msj As String
Set Libro = New ADOX.Catalog
Archivo = "Ruta y\Sub-carpetas a tu\Archivo cerrado.xls"
Libro.ActiveConnection = _
"Provider=MSDASQL.1;Data Source=Excel Files;Initial Catalog=" & Archivo
For Each Hoja In Libro.Tables
If Right(Hoja.Name, 1) = "$" Then
If Msj <> "" Then Msj = Msj & vbCr
Msj = Msj & Left(Hoja.Name, Len(Hoja.Name) - 1)
End If
Next
MsgBox Msj
Set Libro = Nothing
End Sub


Héctor Miguel

unread,
Feb 3, 2007, 9:55:04 PM2/3/07
to
hola [denuevo], Ivan !

para la segunda parte de esta consulta...
> ... y de paso (como mucho, pero no imprescindible) el valor de otras propiedades tipo: fecha creacion, ultima modificacion. etc...

[exceptuando lo que pudiera implicar el 'etc.'] :))

Sub Info_de_archivo_cerrado()
With CreateObject("Scripting.FileSystemObject")
With .GetFile("c:\ruta y\sub carpetas a\tu archivo cerrado.xls")
MsgBox .DateCreated & " es la fecha de creacion" & vbCr & _
.DateLastAccessed & " es la fecha del ultimo acceso" & vbCr & _
.DateLastModified & " es la fecha de su ulima modificacion"
End With
End With
End Sub

Ivan

unread,
Feb 3, 2007, 9:58:11 PM2/3/07
to
hola Hector Miguel, muchas gracias

parece'trabajar perfectamente'. Voy a estudiarla un poco y a adaptarla para
hacerle un favor a un amigo.

por cierto, ADO y DAO son otras de mis muchas asignaturas pendientes, por lo
que he intentado indagar un poco (reconozco que muy, muy poco) con F1 pero
no parece devolver ayuda con los elementos de tu codigo (ADOX,
ActiveConnection, etc) ¿hay posibilidad de acceder a algun tipo de ayuda
sobre el tema desde el editor?¿quizas desde Access?. Aunque seguramente no
empiece a mirarlo hasta dentro de un tiempo, me ha picado un poco el
gusanillo.

en cualquier caso, lo dicho, gracias de nuevo y hasta pronto

un saludo
Ivan


Ivan

unread,
Feb 3, 2007, 10:21:10 PM2/3/07
to
hola Hector Miguel (igualmente de nuevo) muchas gracias otra vez

por lo que veo, creo que el 'etc' (aun no muy definido) se podria cubrir sin
problemas por esta misma via. Con esto me has resuelto dos problemas de
una(dos) tacada. Sigo aumentando mi deuda.

en cuanto a tu otra respuesta, segun te enviaba la mia he recordado una
respuesta tuya a otro consultante, similar (tu respuesta, al menos en cuanto
al uso de ADO) pero referida a trabajar con los datos del libro cerrado.¿
Implicaria esto tener que manejar/controlar ADO, o una vez realizada la
'conexion' (o no se como llamarlo) podria utilizar los datos mediante las
instrucciones comunes de excel, manipulando el archivo sin abrirlo? La
pregunta sobre todo es porque, aunque para ciertas cosas me vendria muy
bien, de momento no quiero dispersarme mas de lo que ya estoy.

Héctor Miguel

unread,
Feb 3, 2007, 10:41:23 PM2/3/07
to
hola, Ivan !
__ 1 __
> parece 'trabajar perfectamente'. Voy a estudiarla un poco y a adaptarla...

__ 2 __
> ... ADO y DAO son otras de mis... asignaturas pendientes, por lo que he intentado indagar un poco... con F1


> pero no parece devolver ayuda con los elementos de tu codigo (ADOX, ActiveConnection, etc)

> hay posibilidad de acceder a algun tipo de ayuda sobre el tema desde el editor?quizas desde Access?.


> Aunque seguramente no empiece a mirarlo hasta dentro de un tiempo, me ha picado un poco el gusanillo.

1) existe un 'detalle' que debes tener en consideracion, cuando el nombre de las hojas [p.e.]
-> contiene guiones, espacios o son solo numeros...
-> el signo '$' como parte de las tablas del catalogo NO ES 'necesariamente' el primer caracter a la derecha de la tabla
ya que el nombre completo [incluyendo el signo '$'] queda delimitado por apostrofos :-((
-> es necesario adaptar/modificar/... el codigo de la propuesta anterior +/- a lo siguiente:

Sub Nombres_hojas()
Dim Libro As ADOX.Catalog, Hoja As ADOX.Table, _
Archivo As String, Msj As String, Tmp As String


Set Libro = New ADOX.Catalog
Archivo = "Ruta y\Sub-carpetas a tu\Archivo cerrado.xls"
Libro.ActiveConnection = _
"Provider=MSDASQL.1;Data Source=Excel Files;Initial Catalog=" & Archivo
For Each Hoja In Libro.Tables

Tmp = Application.Substitute(Hoja.Name, "'", "")
If Right(Tmp, 1) = "$" Then


If Msj <> "" Then Msj = Msj & vbCr

Msj = Msj & Left(Tmp, Len(Tmp) - 1)


End If
Next
MsgBox Msj
Set Libro = Nothing
End Sub

2) con relacion a que la ayuda 'en linea' para ADOxxx en vba no siempre aparece 'disponible' [seguramente]...
se debe a que los archivos de la ayuda son archivos *.CHM [compilaciones del 'viejo' sistema de ayuda de windows] :-((
-> una forma de abrilos es ejecutando 'directamente' el archivo *.CHM correspondiente [p.e.] desde el explorador de windows
el que aplica [segun versiones instaladas] lo puedes encontrar en el directorio de archivos compartidos comunes de MS [p.e.]
[en mi caso]: -> c:\archivos de programa\archivos comunes\microsoft shared\office<x>\3082\ado210.chm
donde <x> corresponde al numero de la version instalada de office ;)

Héctor Miguel

unread,
Feb 3, 2007, 10:49:34 PM2/3/07
to
hola, Ivan !

> ... en cuanto... al uso de ADO... referida a trabajar con los datos del libro cerrado.


> Implicaria esto tener que manejar/controlar ADO, o una vez realizada la 'conexion' (o no se como llamarlo)

> podria utilizar los datos mediante las instrucciones comunes de excel, manipulando el archivo sin abrirlo? [...]

si tu intencion es 'aprovechar' los datos devueltos de consultas a libros cerrados [p.e. en variables/matrices/...]
y aplicarlos a procedimientos/propiedades/objetos/metodos/... 'comunes/normales/...' de la aplicacion [excel-vba]
[solo por si las dudas]... 'te recuerdo' que la gran mayoria de ellas [propiedades, etc.]...
-> [solo] son aplicables a objetos 'Workbook/Worksheet/Range/...'
y mientras un 'libro' esta cerrado... NO llega a convertirse en Workbook, sino que es otro archivo 'comun y corriente' del SO

Ivan

unread,
Feb 4, 2007, 7:10:14 AM2/4/07
to
hola Hector Miguel, gracias de nuevo, (y de nuevo por duplicado)

para no seguir mareandote, te comento las dos respuestas en esta:

> 1) existe un 'detalle' que debes tener en consideracion,......

lo tendre, y ya de paso lo intentare estudiar un poco

> 2) con relacion a que la ayuda 'en linea' para ADOxxx en vba no siempre

> aparece 'disponible' -> una forma de abrilos es ejecutando 'directamente'

> el archivo *.CHM correspondiente [p.e.] desde el explorador de windows

voy a probar, al menos para tener la posibilidad de ir
conociendo/consultando en que consiste

.-en cuanto al otro 'sub'hilo:->

>si tu intencion es 'aprovechar' los datos devueltos de consultas a libros
>cerrados [p.e. en variables/matrices/...]

>......


>-> [solo] son aplicables a objetos 'Workbook/Worksheet/Range/...'
> y mientras un 'libro' esta cerrado... NO llega a convertirse en
> Workbook, sino que es otro archivo 'comun y corriente' del SO

era esactamente a lo que me referia. Asi que de momento, aunque intentare ir
echandole un vistazo para ir conociendo un poco su lenguaje, lo dejo
aparcado un tiempecillo hasta que consiga ir resolviendo lo que ya tengo
entre manos


bueno, lo dicho, muchas gracias de nuevo y hasta pronto

Ivan


Ivan

unread,
Feb 4, 2007, 8:20:48 PM2/4/07
to
hola de nuevo, Hector Miguel

disculpa que vuelva a darte la barrila, pero he estado recorriendo la ayuda
de ADO y no he conseguido resolver una duda, que, aunque seguramente sea la
parte menos importante de tu código, me tiene mareada la neurona

> -> el signo '$' como parte de las tablas del catalogo NO ES

> 'necesariamente' el primer carácter a la derecha de la tabla


> ya que el nombre completo [incluyendo el signo '$'] queda
> delimitado por apostrofos :-((

> -> es necesario adaptar/modificar/... el código de la propuesta

> anterior +/- a lo siguiente:

¿cual es el sentido/motivo de buscar la existencia de '$'? ¿se trata de
algún tipo de asignación que hace ADO a las 'tablas', como para
reconocerlas/diferenciarlas?¿o es simplemente (que por tu ultimo comentario
creo que no, aparte de que no parece que tuviera sentido) una forma de
decirle al código que tiene que ser un string? Aunque (creo que) no me hace
falta de momento, se ha convertido en una duda machacona durante todo el
día.

en cuanto al resto del código, aunque disto mucho de entenderlo, al menos si
he conseguido mas o menos intuir su sentido y funcionamiento.

pero el dichoso '$' ......

si tienes un momento, te lo agradeceré una vez mas si puedes explicármelo,
sobre todo para poder aparcarlo sin tenerlo rondándome todo el tiempo. De
todas formas voy a seguir dando unas vueltas a ver si veo algo

Héctor Miguel

unread,
Feb 4, 2007, 10:47:53 PM2/4/07
to
hola, Ivan !

> ... he estado recorriendo la ayuda de ADO y no he conseguido resolver una duda...
> ... cual es el sentido/motivo de buscar la existencia de '$'?
> ... se trata de algun tipo de asignacion que hace ADO a las 'tablas', como para reconocerlas/diferenciarlas? [...]

+/- por ahi va el asunto :)) si modificas [momentaneamente] el codigo en la siguiente parte:

For Each Hoja In Libro.Tables

If Msj <> "" Then Msj = Msj & vbCr

Msj = Msj & Hoja.Name
Next
MsgBox Msj

-> te daras cuenta que el nombre de la variable utilizada [Hoja] poco/nada tiene que ver con 'hojas' [en el catalogo de las tabas]
ya que si el libro al que estas 'consultando' contiene [ademas de las hojas] nombres asignados a rangos...
los nombres que obtienes [que en realidad es el catalogo completo de las tablas del libro] NO son 'exclusivamente' hojas :))
sino que encontraras tambien los nombres de los rangos [incuso si hay nombres 'iguales' en varias hojas con su respectivo vinculo]
lo que si vas a 'notar', es que los nombres de las hojas tienen el signo '$' al final de su nombre [obviando lo de los apostrofos] ;)

Ivan

unread,
Feb 5, 2007, 11:57:46 AM2/5/07
to
hola Hector Miguel, muchas gracias por aquí también

> ya que si el libro al que estas 'consultando' contiene [ademas de las
> hojas] nombres asignados a rangos...

>............


> lo que si vas a 'notar', es que los nombres de las hojas tienen el
> signo '$' al final de su nombre [obviando lo de los apostrofos] ;)

algo así me imaginaba, pues no acababa de verle el sentido si no. Esta noche
probare la modificación para ver el resultado.

En cualquier caso, he combinado tus dos códigos (nombres hojas y
propiedades) y me ha hecho el apaño perfectamente para lo que quería.

gracias de nuevo y un saludo
Ivan


dwx...@gmail.com

unread,
Mar 8, 2007, 3:07:38 PM3/8/07
to
Tengo un problema con respecto a los nombres de las hojas, lo que yo
quiero saber es si una hoja x se encuentra dentro de un libro sin
tener que abrir este, entonces lo que necesito saber es como obtener
los nombres de las hojas y ademas el numero de estas de un libro en
excel, pero no deseo utilizar ADO ni DAO, ya que ademas de no tener
conocimientos de esto, creo que tampoco es necesario. Entonces mas que
todo quisiera que la rsepuesta fuese utilizando lso comandos del VB
con excel.

Muchas Gracias.

Ivan

unread,
Mar 8, 2007, 8:39:03 PM3/8/07
to
hola,

a la espera de lo que diga Hector Miguel, u otro experto, permiteme que te
comente mi opinion:

>pero no deseo utilizar ADO ni DAO, ya que ademas de no tener
> conocimientos de esto, creo que tampoco es necesario

> fuese utilizando lso comandos del VB con excel.

creo que si la respuesta de Hector a ido por estos derroteros (ADO), dudo
que haya una forma mas 'barata' (como seguramente diria el) de realizarlo.
En cualquier caso los conocimientos de ado son totalmente innecesarios (yo
no tengo ni la mas remota idea, y me ha venido de perlas) para aplicar el
codigo de Hector. Lo unico a tener en cuenta es activar la referencia que el
menciona (Microsoft ADO Ext. x.x for DDL and Security)

>lo que necesito saber es como obtener los nombres de las hojas

esto es exactamente lo que hace la macro de Hector

> y ademas el numero de estas de un libro

le puedes añadir un contador cada vez que se cumplan las condiciones de la
variable Tmp

> quiero saber es si una hoja x se encuentra dentro de un libro sin tener
> que abrir este

si solo quieres saber si existe determinada hoja en determinado libro (y,
claro, eliminas los reparos con ado), puedes usar una funcion parecida a
esta que es una adaptacion del codigo de Hector :(espero que con su
permiso)->

Function ExisteHoja(ByVal Archivo As String, _
ByVal hj As String) As
Boolean


Dim Libro As ADOX.Catalog, Hoja As ADOX.Table, _

Tmp As String
Set Libro = New ADOX.Catalog

Libro.ActiveConnection = _
"Provider=MSDASQL.1;Data Source=Excel Files;Initial Catalog=" & Archivo

For Each Hoja In Libro.Tables

Tmp = Application.Substitute(Hoja.Name, "'", "")
If Right(Tmp, 1) = "$" Then

If Left(Tmp, Len(Tmp) - 1) = hj Then ExisteHoja = True: Exit For
End If
Next
Set Libro = Nothing
End Function

y la puedes llamar mas o menos asi: ->

Sub testHayHoja()
Dim arch As String
arch = "Ruta y\Sub-carpetas a tu\Archivo cerrado.xls"
Debug.Print ExisteHoja(arch, "Nombre de la Hoja")
End Sub

en cualquier caso, a lo mejor estoy equivocado, pero cuando HM a tirado por
aqui dudo que haya una solucion mas sencilla.

espero te ayude

un saludo
Ivan


dwx...@gmail.com

unread,
Mar 9, 2007, 9:52:42 AM3/9/07
to
Me parece que esta bien la cosa, ahora el problema es que no se como
hacer para activar las referencias Microsoft ADO Ext. x.x for DDL and
Security.

Muchas gracias.


Ivan

unread,
Mar 9, 2007, 4:45:24 PM3/9/07
to

hola,

en el editor de Visual Basic -> menu 'Herramientas' -> 'Referencias' -
> buscala en la lista que te aparece. Supongo que la tendras, aunque
no estoy seguro de si depende de la version del office. Si no
estuviera, vuelve a preguntar y seguro que alguien mas experto te lo
aclara.

un saludo
Ivan

dwx...@gmail.com

unread,
Mar 20, 2007, 3:00:12 PM3/20/07
to
Muchas gracias, han sido de gran ayuda.

0 new messages