Leer Excel con visual basic (vb6)
Bienvenidos a VerTutoriales.com en esta ocasión vamos a ver como abrir un Excel y leer su contenido al completo. Recordad que hay que añadir la librería de Excel tal y como se muestra en el vídeo. Si tenéis alguna duda también podéis ver como añadir una librería en visual basic 6 aquí
En un proyecto que tenía que realizar y no tenía más que hacerle un tratamiento a un libro de Excel, como no conozco bien la programación desde las macros y prefiero programar en visual basic en Excel, me puse manos a la obra utilizando vb6 que es lo que conozco, así que lo primero era abrir el fichero y buscar la manera de leerlo, el código que encontré es el siguiente, ya está solucionado un error 1004 que me daba, así que os dejo el código funcional y sin errores.
Private Sub LeerExcel()
‘dimensiones
Dim xlApp As Excel.Application
Dim xlLibro As Excel.Workbook
Dim xlHoja As Excel.Worksheet
Dim varMatriz As Variant
Dim lngUltimaFila As Long‘abrir programa Excel
Set xlApp = New Excel.Application
‘xl.Visible = True‘abrir el archivo Excel
‘(archivo en la misma carpeta)
Set xlLibro = xlApp.Workbooks.Open(App.Path & “\prueba.xls”, True, True, , “”)
Set xlHoja = xlApp.Worksheets(“Hoja1”)‘1. Si conoces el rango a leer
‘varMatriz = xlHoja.Range(“A1:C10”).Value‘2. Si no conoces el rango
lngUltimaFila = _
Columns(“A:A”).Range(“A65536”).End(xlUp).RowvarMatriz = xlHoja.Range(xlHoja.Cells(1, 1), xlHoja.Cells(lngUltimaFila, 10))
‘utilizamos los datos…
txtLlamadas.Text = varMatriz(10, 3)‘cerramos el archivo Excel
xlLibro.Close SaveChanges:=False
xlApp.Quit‘reset variables de los objetos
Set xlHoja = Nothing
Set xlLibro = Nothing
Set xlApp = NothingEnd Sub
Solo tendreis que llamar a la función “leerexcel” desde donde querais, recordar que en varMatriz se está declarando la dimensión de esta, es decir, varMatriz = xlHoja.Range(xlHoja.Cells(1, 1), xlHoja.Cells(lngUltimaFila, 10)), le estamos diciendo que la dimensión va desde la celda 1,1 hasta la [ultima], 10.
Luego para tomar valores simplemente utilizar el acceso a tablas como se muestra txtLlamadas.Text = varMatriz(10, 3), este ejemplo devuelve la fila 10, columna 3.
Si teneis alguna duda, solo comentadlo 🙂
Comments
hola
tengo el mismo codigo pero apartir de de aqui:
el 1°: me dice que no se ha delcarado el nombre “columns” y xIUp
2°: lo mismo me pasa con cells, text1.text asi lo tengo yo aunque ya lo puse como esta en tu codigo me dice lo mismo, son esos los que me dicen que no estan declarados en que estoy mal
lngUltimaFila = _ Columns(“A:A”).Range(“A65536″).End(xlUp).Row
varMatriz = xlHoja.Range(xlHoja.Cells(1, 1), xlHoja.Cells(lngUltimaFila, 10))
‘utilizamos los datos…
txtLlamadas.Text = varMatriz(10, 3)
‘cerramos el archivo Excel
xlLibro.Close SaveChanges:=False
xlApp.Quit
‘reset variables de los objetos
Set xlHoja = Nothing
Set xlLibro = Nothing
Set xlApp = Nothing
End Sub
Si no está declarado, es que no los tienes declarados 🙂
Esta parta es necesaria, es donde se crean los objetos:
Dim xlApp As Excel.Application
Dim xlLibro As Excel.Workbook
Dim xlHoja As Excel.Worksheet
Dim varMatriz As Variant
Dim lngUltimaFila As Long
‘abrir programa Excel
Set xlApp = New Excel.Application
‘xl.Visible = True
‘abrir el archivo Excel
‘(archivo en la misma carpeta)
Set xlLibro = xlApp.Workbooks.Open(App.Path & “\prueba.xls”, True, True, , “”)
Set xlHoja = xlApp.Worksheets(“Hoja1″)
Prueba.xls es el libro de excel que quieres leer y Hoja1 es el nombre de la hoja que vayas a leer. Sino recuerdo mal, puedes omitir el nombre y poner directamente el número del array, es decir Worksheets(1) siendo 1 el número de hoja a leer del documento excel.
Espero que te resuelva el problema con tu lectura de un file excel 🙂
al principio me podría funcionar el codigo de apertura del archivo excel. pero necesito desarrollar un programa en visual basic para que tome los valores de varias celdas y los traslade a cuadros de texto en un formulario. las celdas no son contiguas, debo referenciarlas una por una y llevarlas a cuadros de textos. necesito que el formulario esté siempre activo y actualice los valores cada cierto tiempo. debo colocarle condicionales a los valores recogidos y hacer sonar una alarma en caso de ser necesario y colocar los cuadros de textos en color rojo. tengo problemas para colocar la información en los cuadros de textos y en hacer el ciclo para actualizar los datos. gracias de antemano.
¿Y no sería mejor montarlo en VBA? En principio si se está trabajando con ese fichero, realizar una segunda apertura y demás, supongo que no debiera de dar problema, pero sino han guardado los valores posiblemente no se te actualice a tiempo real.
El ejemplo que se propone en el artículo es para leer el fichero, da igual que sea de principio a fin o una celda en concreto, de hecho se toma como un array de dos dimensiones (x,y) columna, fila. Las que con coordenadas podrás fijar la celda concreta.
Como decía, sino tienes problema en realizarlo en VBA mejor que en VB externo mucho mejor. Luego simplemente será montar el formulario en la propia grilla de Excel. Para actualizar cada X tiempo, necesitas el control timer que cada X segundos lance la función que necesitas de comprobación para cambiar colores, hacer sonar la alarma, etc…
Empezaría por aquí:
http://vertutoriales.com/vba-programacion-en-excel-migrar-de-vb6-a-vba/
Continuaría por aquí:
http://vertutoriales.com/vba-iniciacion-de-ejemplo-para-programar-en-vb6-en-excel/
Faltaría un tercero que es como leer las celdas y lo del timer, si tienes dudas coméntamelo y te monto el par de videotutoriales. Si te pediría que fueras lo más concreto posible para explicarte lo que necesitas para que puedas desarrollarlo.
Un saludo!
bueno les comento que ya lo hice en VBA con excel. está trabajando 98% bien. Sólo que a veces me un error de excepción que me lleva loco. ya le he puesto la captura de errores por todos lados e igual me sigue dando ese error. He de decir que la macro no es propia, es el producto de largas horas de investigación por la red. he utilizado el on error resume next pero igual me sigue dando error. de pronto si les mando el código me dan una mano. el problema es que la hoja de excel recupera datos de un servidor mediante formulas y no les va a abrir correctamente. pero con la macro se debería entender más o menos lo que quise hacer. se puede pegar el codigo por aquí?
así está la macro actualmente. hay algunas líneas comentadas por el asunto que les comenté de la captura de errores.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
‘On Error GoTo hand
Application.OnTime EarliestTime:=TimeValue(“00:05:00″), _
Procedure:=”MyMacro”, Schedule:=False
Application.OnTime EarliestTime:=TimeValue(“09:50:00″), _
Procedure:=”contador”, Schedule:=False
‘hand:
‘On Error GoTo 0
‘Exit Sub
End Sub
Private Sub Workbook_Open()
‘On Error GoTo hand1
Application.OnTime Now + TimeValue(“00:05:00”), “MyMacro”
Application.OnTime TimeValue(“09:50:00”), “contador”
‘hand1:
‘On Error GoTo 0
‘Exit Sub
End Sub
Private Declare Function PlaySound Lib “winmm.dll” Alias “PlaySoundA” _
(ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Private Declare Function ShowWindow Lib “user32.dll ” (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function FindWindow Lib “user32.dll ” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function EnableWindow Lib “user32.dll ” (ByVal hWnd As Long, ByVal fEnable As Long) As Long
Public Const SW_HIDE = 0
Public Const SW_SHOW = 5
Public Sub Desktop(Visible As Boolean)
Dim hWnd As Long
hWnd = FindWindow(“Progman”, “Program Manager”)
If Visible Then
ShowWindow hWnd, SW_SHOW
Else
ShowWindow hWnd, SW_HIDE
End If
EnableWindow hWnd, Visible
End Sub
Public Sub Desktop2(Visible As Boolean)
Dim hWnd As Long
hWnd = FindWindow(“Progman”, “Program Manager”)
If Visible Then
ShowWindow hWnd, SW_SHOW
Else
ShowWindow hWnd, SW_HIDE
End If
EnableWindow hWnd, Visible
End Sub
Sub MyMacro()
On Error GoTo errores3
‘definimos dos constantes para localizar la ruta y el nombre del archivo
Const RutaSonido As String = “D:\CALCULOS Y TENDENCIAS\”
Const ArchivoSonido As String = “XP.wav”
Dim Sonido As String
‘construimos la ruta completa del archivo de sonido
Sonido = RutaSonido & ArchivoSonido
‘ SE ACTIVA EL LIBRO Y LA HOJA DE EXCEL Y SE ACTUALIZAN LOS VALORES DE LA PAGINA
‘Application.OnTime Now + TimeValue(“00:02:00”), “REFRESCAR”
Workbooks(“CALCULO DE PRODUCCION RV-4.1.xls”).Activate
Workbooks(“CALCULO DE PRODUCCION RV-4.1.xls”).RefreshAll
Application.Calculate
‘Worksheets(“INSTANTANEO”).Calculate
‘Application.OnTime Now + TimeValue(“00:05:00”), “MyMacro”
‘DEFINICION DE VARIABLES
n = Range(“d37”).Value ‘agua y sedimento
x = Range(“d38”).Value ‘presión
y = Range(“d39”).Value ‘nivel de interface
z = Range(“d41”).Value ‘caudal
m = Range(“d42”).Value ‘amperaje
t = Range(“d40”).Value ‘temperatura
d = Range(“d25”).Value ‘diferencia de producción
n1 = Range(“O37”).Value
x1 = Range(“O38”).Value
x2 = Range(“P38”).Value
y1 = Range(“O39”).Value
y2 = Range(“P39”).Value
t1 = Range(“O40”).Value
t2 = Range(“P40”).Value
z1 = Range(“O41”).Value
z2 = Range(“P41”).Value
m1 = Range(“O42”).Value
d1 = Range(“O43”).Value
‘ AQUI SE COLOCAN LOS COLORES EN ROJO DE LAS CAJAS DE TEXTOS EN EL FORMULARIO. SI SE CUMPLE LA VALIDACION.
If x > x1 Or x n1 Then
UserForm1.TextBox2.BackColor = &HFF&
Else
UserForm1.TextBox2.BackColor = &HFFFF80
End If
If y > y1 Or y t1 Or t < t2 Then
UserForm1.TextBox4.BackColor = &HFF&
Else
UserForm1.TextBox4.BackColor = &HFFFF80
End If
If z m1 Then
UserForm1.TextBox7.BackColor = &HFF&
Else
UserForm1.TextBox7.BackColor = &HFFFF80
End If
If d x1 Or x y1 Or y m1 Or z n1 Then
Desktop:
‘Application.ScreenUpdating = False
‘Application.DisplayAlerts = False
Call PlaySound(Sonido, &H1, &H1 Or &H20000)
simularMensaje “”
End If
Desktop2:
‘Dim wb As Workbook
‘For Each wb In Workbooks
‘wb.Save
‘Next
Workbooks(“CALCULO DE PRODUCCION RV-4.1.xls”).Save
Application.ScreenUpdating = True
Application.DisplayAlerts = True
‘Windows(1).WindowState = xlMinimized
Exit Sub
errores3:
MsgBox Err & “: ” & Error(Err)
‘Err.Clear
‘On Error GoTo 0
End Sub
Sub simularMensaje(ByVal textoMensaje As String)
On Error GoTo errores:
‘On Error Resume Next
Const segundos = 10
Dim t1 As Double
Dim t2 As Double
UserForm1.Show False
UserForm1.Label1.Caption = textoMensaje
‘DoEvents
t1 = Timer
Do
t2 = Timer
If t2 segundos
Unload UserForm1
Exit Sub
errores:
MsgBox Err & “: ” & Error(Err)
‘Err.Clear
‘On Error GoTo 0
End Sub
Sub contador()
On Error GoTo errores2:
Application.OnTime TimeValue(“09:50:00”), “contador”
Const RutaSonido As String = “D:\CALCULOS Y TENDENCIAS\”
Const ArchivoSonido As String = “XP.wav”
Dim Sonido As String
‘construimos la ruta completa del archivo de sonido
Sonido = RutaSonido & ArchivoSonido
Call PlaySound(Sonido, &H1, &H1 Or &H20000)
UserForm2.Show
Exit Sub
errores2:
MsgBox Err & “: ” & Error(Err)
‘Err.Clear
‘On Error GoTo 0
End Sub
como pueden ver estoy usando MsgBox Err & “: ” & Error(Err) para saber donde está el error. cabe destacar que el error se presentaba solo de vez en cuando, aun usando el on resume next. es una macro que cada 5 minutos actualiza el libro excel y mediante if verifica si alguna de las variables está fuera de rango y si alguna de ellas está fuera de rango me presenta el formulario con la variable en rojo emitiendio un sonido y desaparece en diez segundos. gracias de antemano.
he notado que en la web faltan algunos simbolos, pero en la macro aparecen bien. disculpen la broma.
Entonces el problema no es en sí el realizar la tarea que preguntabas, sino el solucionar la excepción.
Comentas que aparece muy de vez en cuando, pero ¿exactamente qué error te devuelve?
Las opciones que se me vienen a la cabeza es que el problema venga por una lectura/escritura sin permisos.
Si lo tienes ya montado, lo más fácil sería crear un nuevo fichero Excel y desde ahí realizar la lectura del fichero del servidor y copiarlo en este para poder trabajar con él.
Recuerda que es muy importante tras leer el fichero volverlo a cerrar. Si la información puede tener tiempos de espera entre una petición y otra al fichero mejor, es decir, lanzar la lectura del fichero cada 30 segundos o cada minuto. (Tendrás que valorar el tiempo necesario de muestreo). Cuanto más tiempo mejor.
Si lo haces desde vb6, otra opción sería descargar el fichero en local y ya trabajarlo de tal manera. Yo apostaría a que el problema que te devuelve “algunas veces” ha de ser debido a esa lectura. Por que no creo que sea por los valores que recibe, aunque tampoco veo ninguna validación de esos datos recogidos y no sé tipo de declaración 😉
Espero arrojar algo de luz.
Un saludo!
Como vinculas el Excel archivo guardado en la computadora ? osea como lo direccionas para que tome los datos
Hay varios puntos aquí Juan:
La relación con el archivo en el disco se declara aquí:
Set xlLibro = xlApp.Workbooks.Open(App.Path & “\prueba.xls”, True, True, , “”)
App.Path va a dar la misma ruta desde la cual se ejecuta el programa.
Y ya dependiendo del tipo de lectura está comentada la manera, lo interesante es una vez declarado tomo la información asignando a txtLlamadas.text así:
txtLlamadas.Text = varMatriz(10, 3)
Espero que te sirva.
Salud!