Discussion:
Cómo obtener las hojas que tiene un libro de excel
(demasiado antiguo para responder)
MS
2007-04-23 22:51:12 UTC
Permalink
Hola a todos, mi duda es la siguiente:
No se cómo obtener los nombres de las hojas que contiene cualquier archivo
de excel que quiera abrir desde VB.net, hasta ahora puedo abrir el archivo
de excel, dandole el nombre de la hoja o que la hoja sea la de default que
crea excel, pero ahora quiero tener la opción de obtener los nombres de cada
hoja de excel y de ahí elegir cual quiero abrir algun norte al respecto de
cómo hacer esto. Gracias.
SoftJaén
2007-04-24 16:24:53 UTC
Permalink
Post by MS
No se cómo obtener los nombres de las hojas que contiene cualquier archivo
de excel que quiera abrir desde VB.net, ...
Hola:

Si en tu proyecto estás utilizando la biblioteca de Excel, simplemente
tienes que recorrer la colección «Worksheets» de un objeto «Workbook»
previamente abierto:

Dim xlApp As New Excel.Application ' Aplicación Excel
Dim wb As Excel.Workbook ' Libro de trabajo

' Abrimos el libro de trabajo.
'
wb = xlApp.Workbooks.Open(Filename:="C:\Mis documentos\Libro1.xls")

' Recorrermos la colección de hojas de cálculo
'
For Each sheet As Excel.Worksheet In wb.Worksheets
MessageBox.Show(sheet.Name)
Next

' Cerramos el libro de trabajo.
'
wb.Close()
wb = Nothing

' Cerramos Excel.
'
xlApp.Quit()
xlApp = Nothing

Se entiende que debes de importar el espacio de nombres
«Microsoft.Office.Interop».


Un saludo
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
MS
2007-04-24 19:29:48 UTC
Permalink
Mil gracias, me ayudaste mucho thanks.
Post by SoftJaén
Post by MS
No se cómo obtener los nombres de las hojas que contiene cualquier
archivo de excel que quiera abrir desde VB.net, ...
Si en tu proyecto estás utilizando la biblioteca de Excel, simplemente
tienes que recorrer la colección «Worksheets» de un objeto «Workbook»
Dim xlApp As New Excel.Application ' Aplicación Excel
Dim wb As Excel.Workbook ' Libro de trabajo
' Abrimos el libro de trabajo.
'
wb = xlApp.Workbooks.Open(Filename:="C:\Mis documentos\Libro1.xls")
' Recorrermos la colección de hojas de cálculo
'
For Each sheet As Excel.Worksheet In wb.Worksheets
MessageBox.Show(sheet.Name)
Next
' Cerramos el libro de trabajo.
'
wb.Close()
wb = Nothing
' Cerramos Excel.
'
xlApp.Quit()
xlApp = Nothing
Se entiende que debes de importar el espacio de nombres
«Microsoft.Office.Interop».
Un saludo
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.
MS
2007-04-24 23:51:15 UTC
Permalink
El Código que me pasaste quedo a pedir de boca sólo en el for tuvo que
cambiar In wb.Application.Worksheets

en lugar de In wb.Worksheets

Muchas gracias!!!
Post by MS
Mil gracias, me ayudaste mucho thanks.
Post by SoftJaén
Post by MS
No se cómo obtener los nombres de las hojas que contiene cualquier
archivo de excel que quiera abrir desde VB.net, ...
Si en tu proyecto estás utilizando la biblioteca de Excel, simplemente
tienes que recorrer la colección «Worksheets» de un objeto «Workbook»
Dim xlApp As New Excel.Application ' Aplicación Excel
Dim wb As Excel.Workbook ' Libro de trabajo
' Abrimos el libro de trabajo.
'
wb = xlApp.Workbooks.Open(Filename:="C:\Mis documentos\Libro1.xls")
' Recorrermos la colección de hojas de cálculo
'
For Each sheet As Excel.Worksheet In wb.Worksheets
MessageBox.Show(sheet.Name)
Next
' Cerramos el libro de trabajo.
'
wb.Close()
wb = Nothing
' Cerramos Excel.
'
xlApp.Quit()
xlApp = Nothing
Se entiende que debes de importar el espacio de nombres
«Microsoft.Office.Interop».
Un saludo
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.
SoftJaén
2007-04-25 14:58:42 UTC
Permalink
Post by MS
El Código que me pasaste quedo a pedir de boca sólo en el for tuvo que
cambiar In wb.Application.Worksheets
en lugar de In wb.Worksheets
Si el ejemplo lo has ejecutado tal cual yo lo escribí, no es necesario hacer
ese cambio, porque en definitiva, ambos códigos recorren la colección
«Worksheets» de un objeto «Workbook».

Ya que utilizas el objeto «Application», también puedes obtener el nombre de
las hojas de cálculo de la siguiente manera:

Dim xlApp As New Excel.Application ' Aplicación Excel

' Abrimos el libro de trabajo.
'
xlApp.Workbooks.Open "C:\Mis documentos\Libro1.xls"

' Recorrermos la colección de hojas de cálculo
'
For Each sheet As Excel.Worksheet In Application.Worksheets
MsgBox sheet.Name
Next

' Cerramos Excel.
'
xlApp.Quit
Set xlApp = Nothing

De esta forma nos ahorramos tener que declarar expresamente un objeto
«Workbook».

Como podrás observar, hay varias formas de hacerlo, por lo que ignoro por
qué dices que has tenido que cambiar la manera de referenciar la colección
«Worksheets».
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.
MS
2007-04-26 16:49:32 UTC
Permalink
Perfect!!!!, Muchas gracias :-) , las dos me sirvieron perfecto, Dios te
bendiga .
Post by SoftJaén
Post by MS
El Código que me pasaste quedo a pedir de boca sólo en el for tuvo que
cambiar In wb.Application.Worksheets
en lugar de In wb.Worksheets
Si el ejemplo lo has ejecutado tal cual yo lo escribí, no es necesario hacer
ese cambio, porque en definitiva, ambos códigos recorren la colección
«Worksheets» de un objeto «Workbook».
Ya que utilizas el objeto «Application», también puedes obtener el nombre de
Dim xlApp As New Excel.Application ' Aplicación Excel
' Abrimos el libro de trabajo.
'
xlApp.Workbooks.Open "C:\Mis documentos\Libro1.xls"
' Recorrermos la colección de hojas de cálculo
'
For Each sheet As Excel.Worksheet In Application.Worksheets
MsgBox sheet.Name
Next
' Cerramos Excel.
'
xlApp.Quit
Set xlApp = Nothing
De esta forma nos ahorramos tener que declarar expresamente un objeto
«Workbook».
Como podrás observar, hay varias formas de hacerlo, por lo que ignoro por
qué dices que has tenido que cambiar la manera de referenciar la colección
«Worksheets».
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.
IsakMtz
2007-07-17 21:10:01 UTC
Permalink
La manera de crear los objetos como:

Dim oExcelApp As Excel.Application
se hacia desde VB6, pero tiene la desventaja que se crea una instancia de
Excel, consumiendo recursos en la compu, y si se realiza en un servidor con
varios usuarios, puede generar problemas.

¿Hay alguna manera de utilizar OleDbConnection u OleDbCommand para conocer
el nombre de las hojas de un archivo de Excel?
J. Ramon A.
2007-07-18 11:31:33 UTC
Permalink
oldb me parece que tenia driver, pero no se como es. puedes utilizar un odbc
al archivo y abrirlo con system.data.odbc, tiene connection y dataadapter
Post by IsakMtz
Dim oExcelApp As Excel.Application
se hacia desde VB6, pero tiene la desventaja que se crea una instancia de
Excel, consumiendo recursos en la compu, y si se realiza en un servidor con
varios usuarios, puede generar problemas.
¿Hay alguna manera de utilizar OleDbConnection u OleDbCommand para conocer
el nombre de las hojas de un archivo de Excel?
SoftJaén
2007-07-18 12:37:48 UTC
Permalink
Post by IsakMtz
¿Hay alguna manera de utilizar OleDbConnection u OleDbCommand para
conocer el nombre de las hojas de un archivo de Excel?
¡Pues claro que la hay! Mediante la utilización del método
«GetOleDbSchemaTable» de un objeto «OleDbConnection», el cual nos devolverá
un objeto DataTable con la información de esquema del origen de datos OleDb
especificado.

El siguiente ejemplo establece una conexión con el libro de trabajo de
Excel, para conocer tanto el nombre de las hojas de cálculo, como los
nombres de los rangos de celdas existentes:

Try

' Construimos la cadena de conexión OleDb para conectarnos
' con el libro de trabajo de Excel.
'
Dim connString As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Mis Documentos\Libro1.xls;" & _
"Extended Properties='Excel 8.0;'"

Using cnn As New OleDbConnection(connString)

' Abrimos la conexión.
'
cnn.Open()

' Obtenemos las tablas del origen de datos especificado.
'
Dim tables As DataTable = _
cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
New Object() {Nothing, Nothing, Nothing, "TABLE"})

' Añadimos el nombre de las tablas a un control ListBox.
'
For Each row As DataRow In tables.Rows
ListBox1.Items.Add(row.Item("Table_Name").ToString)
Next

End Using

Catch ex As Exception
MessageBox.Show(ex.Message)

End Try

Te hago saber que los nombres de las hojas de cálculo terminan con el
carácter $ (Hoja1$, Hoja23$), no así el nombre de los rangos de celdas
existentes (RangoClientes, RangoAlumnos).

Un saludo
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
J. Ramon A.
2007-07-18 14:50:38 UTC
Permalink
esto era lo que no sabia en provedor oldb
"Provider=Microsoft.Jet.OLEDB.4.0", este sirve tanto para access como
excell?, yo utilice odbc y obtuve el mismo resultado, de todas formas
sabiendolo lo cambiare y asi ahorro de crear dsn.

sludos
Post by SoftJaén
Post by IsakMtz
¿Hay alguna manera de utilizar OleDbConnection u OleDbCommand para
conocer el nombre de las hojas de un archivo de Excel?
¡Pues claro que la hay! Mediante la utilización del método
«GetOleDbSchemaTable» de un objeto «OleDbConnection», el cual nos devolverá
un objeto DataTable con la información de esquema del origen de datos OleDb
especificado.
El siguiente ejemplo establece una conexión con el libro de trabajo de
Excel, para conocer tanto el nombre de las hojas de cálculo, como los
Try
' Construimos la cadena de conexión OleDb para conectarnos
' con el libro de trabajo de Excel.
'
Dim connString As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Mis Documentos\Libro1.xls;" & _
"Extended Properties='Excel 8.0;'"
Using cnn As New OleDbConnection(connString)
' Abrimos la conexión.
'
cnn.Open()
' Obtenemos las tablas del origen de datos especificado.
'
Dim tables As DataTable = _
cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
New Object() {Nothing, Nothing, Nothing, "TABLE"})
' Añadimos el nombre de las tablas a un control ListBox.
'
For Each row As DataRow In tables.Rows
ListBox1.Items.Add(row.Item("Table_Name").ToString)
Next
End Using
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Te hago saber que los nombres de las hojas de cálculo terminan con el
carácter $ (Hoja1$, Hoja23$), no así el nombre de los rangos de celdas
existentes (RangoClientes, RangoAlumnos).
Un saludo
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
SoftJaén
2007-07-18 16:22:18 UTC
Permalink
Post by J. Ramon A.
esto era lo que no sabia en provedor oldb
"Provider=Microsoft.Jet.OLEDB.4.0", este sirve tanto para access como
excell?, yo utilice odbc y obtuve el mismo resultado, de todas formas
sabiendolo lo cambiare y asi ahorro de crear dsn.
Hola, J. Ramón:

Efectivamente, el proveedor OleDb de Jet sirve para conectarse tanto a una
base de datos de Access como a un libro de trabajo de Excel.

El motor Microsoft Jet dispone de una serie de drivers, llamados
genéricamente ISAM instalables (Método de Acceso Secuencial Indexado), que
se utilizan para conectarse a otros orígenes de datos distintos a Microsoft
Access, como por ejemplo archivos de Excel, dBASE, Paradox, HTML o un simple
archivo de texto delimitado, sin necesidad de utilizar el driver ODBC
correspondiente.

Si deseas información sobre los ISAM de Excel y Texto, échale un vistazo a
los artículos que tengo escritos sobre los mismos:

Trabajar con ADO, DAO y Excel
http://mvp-access.com/softjaen/articulos/excel/ado_dao_excel.htm

Trabajar con los datos de un archivo de texto
http://mvp-access.com/softjaen/articulos/texto/jet_text_isam.htm

Los ejemplos que aparecen en los artículos fueron escritos en su día para
ejecutarlos con Visual Basic clásico, aunque son fácilmente adaptables a
Visual Basic .net. Eso sí, la teoría que aparece es la misma para ambas
versiones de Visual Basic. :-)

Un saludo
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.
Miguel
2007-10-16 15:26:04 UTC
Permalink
He estado haciendo pruebas con el codigo que han puesto no me da ningun
problema de error de sintasis ni de librerias de referencias pero cuando lo
ejecuto me envia este error.

Error al crear una instancia del componente COM con CLSID
{00024500-0000-0000-C000-000000000046} desde IClassFactory debido al
siguiente error: 80070005.

Que creen que sea??
Post by SoftJaén
Post by J. Ramon A.
esto era lo que no sabia en provedor oldb
"Provider=Microsoft.Jet.OLEDB.4.0", este sirve tanto para access como
excell?, yo utilice odbc y obtuve el mismo resultado, de todas formas
sabiendolo lo cambiare y asi ahorro de crear dsn.
Efectivamente, el proveedor OleDb de Jet sirve para conectarse tanto a una
base de datos de Access como a un libro de trabajo de Excel.
El motor Microsoft Jet dispone de una serie de drivers, llamados
genéricamente ISAM instalables (Método de Acceso Secuencial Indexado), que
se utilizan para conectarse a otros orígenes de datos distintos a Microsoft
Access, como por ejemplo archivos de Excel, dBASE, Paradox, HTML o un simple
archivo de texto delimitado, sin necesidad de utilizar el driver ODBC
correspondiente.
Si deseas información sobre los ISAM de Excel y Texto, échale un vistazo a
Trabajar con ADO, DAO y Excel
http://mvp-access.com/softjaen/articulos/excel/ado_dao_excel.htm
Trabajar con los datos de un archivo de texto
http://mvp-access.com/softjaen/articulos/texto/jet_text_isam.htm
Los ejemplos que aparecen en los artículos fueron escritos en su día para
ejecutarlos con Visual Basic clásico, aunque son fácilmente adaptables a
Visual Basic .net. Eso sí, la teoría que aparece es la misma para ambas
versiones de Visual Basic. :-)
Un saludo
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.
SoftJaén
2007-10-16 15:52:59 UTC
Permalink
Post by Miguel
He estado haciendo pruebas con el codigo que han puesto no me da ningun
problema de error de sintasis ni de librerias de referencias pero cuando lo
ejecuto me envia este error.
Error al crear una instancia del componente COM con CLSID
{00024500-0000-0000-C000-000000000046} desde IClassFactory debido al
siguiente error: 80070005.
Que creen que sea??
¿Con el ISAM de Excel obtienes ese error? ¿Qué código estás ejecutando para
que obtengas un error con el CLSID de la biblioteca de Microsoft Excel?

El ISAM de Excel no utiliza para nada la biblioteca de Microsoft Excel.

Un saludo

--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.
Miguel
2007-10-16 16:19:22 UTC
Permalink
Te envio el codigo que estoy usando:

Dim OExcel As New Microsoft.Office.Interop.Excel.ApplicationClass
Dim oBooks As Microsoft.Office.Interop.Excel.Workbooks
Dim OBook As Microsoft.Office.Interop.Excel.Workbook
Dim OSheet As Microsoft.Office.Interop.Excel.Worksheet

Dim i As Integer = 2

' Inicia Excel y abre el workbook
OExcel = CreateObject("Excel.Application", "")
OExcel.Visible = True
oBooks = OExcel.Workbooks
OBook = CType(OExcel.Workbooks.Add,
Microsoft.Office.Interop.Excel.WorkbookClass)
OSheet = CType(OBook.Sheets(1),
Microsoft.Office.Interop.Excel.Worksheet)

'_________________
'NOMBRE DE LA HOJA
OSheet.Name = "ROCS del DIA-" & dtpReportes.Value.Date
'________________
'TITULO DE CELDAS
OSheet.Cells(1, 1) = "ROC"
OSheet.Cells(1, 2) = "Recibido"
OSheet.Cells(1, 3) = "Concepto"
OSheet.Cells(1, 4) = "Cordobas"
OSheet.Cells(1, 5) = "Dolares"
'___________________
'VALOR DE LAS CELDAS

OSheet.Range("A" & i.ToString).Value = "Hola"
OSheet.Range("B" & i.ToString).Value = "Como"
OSheet.Range("C" & i.ToString).Value = "Estas?"
OSheet.Range("D" & i.ToString).Value = "Prueba De"
OSheet.Range("E" & i.ToString).Value = "Excell"


OSheet.Application.Visible = True

OSheet = Nothing
OBook = Nothing
OExcel = Nothing
Post by SoftJaén
Post by Miguel
He estado haciendo pruebas con el codigo que han puesto no me da ningun
problema de error de sintasis ni de librerias de referencias pero cuando
lo
Post by Miguel
ejecuto me envia este error.
Error al crear una instancia del componente COM con CLSID
{00024500-0000-0000-C000-000000000046} desde IClassFactory debido al
siguiente error: 80070005.
Que creen que sea??
¿Con el ISAM de Excel obtienes ese error? ¿Qué código estás ejecutando para
que obtengas un error con el CLSID de la biblioteca de Microsoft Excel?
El ISAM de Excel no utiliza para nada la biblioteca de Microsoft Excel.
Un saludo
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.
SoftJaén
2007-10-16 17:30:32 UTC
Permalink
Post by Miguel
Dim OExcel As New Microsoft.Office.Interop.Excel.ApplicationClass
Ya me extrañaba a mí que obtuvieras el error que me has comentado
anteriormente con el ISAM de Excel.

Si deseas trabajar con la biblioteca de Excel, tendrás que declarar un
objeto Excel.Application:

Dim OExcel As New Microsoft.Office.Interop.Excel.Application
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.
SoftJaén
2007-10-16 18:36:47 UTC
Permalink
Ahora que estoy observando el código más detenidamente, la verdad es que no
encuentro un motivo aparente para que obtengas la excepción comentada,
siempre y cuando se encuentra instalada y debidamente registrada en el
equipo la biblioteca de Microsoft Excel.

Ignoro el motivo para que obtengas la excepción, porque el código lo he
probado tal cual lo has expuesto, y funciona bien.

No obstante, procura que en el equipo cliente esté instalada la misma
versión de Microsoft Excel que has utilizado para generar el proyecto, es
decir, que si en el proyecto has referenciado la biblioteca «Microsoft Excel
11.0 Object Library», en el equipo cliente deberá estar instalado Microsoft
Excel 2003.
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Continúe leyendo en narkive:
Loading...