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).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

 

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 :)

Te puede interesar:

12 comentarios

  • yeni commented on 17 abril, 2013 Reply

    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

    • VideoTutoriales commented on 18 abril, 2013 Reply

      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 :)

  • betulio caldera commented on 5 diciembre, 2014 Reply

    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.

    • videotutoriales commented on 5 diciembre, 2014 Reply

      ¿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!

  • betulio caldera commented on 5 diciembre, 2014 Reply

    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í?

  • betulio caldera commented on 5 diciembre, 2014 Reply

    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

  • betulio caldera commented on 6 diciembre, 2014 Reply

    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.

  • betulio caldera commented on 6 diciembre, 2014 Reply

    he notado que en la web faltan algunos simbolos, pero en la macro aparecen bien. disculpen la broma.

  • videotutoriales commented on 7 diciembre, 2014 Reply

    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!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>