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
> ... 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
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
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
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.
__ 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 ;)
> ... 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
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
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
> ... 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] ;)
> 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
Muchas Gracias.
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
Muchas gracias.
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