¿Alguna vez os habéis parado a pensar que en una hoja de cálculo es posible indicar la primera fila desde la que importar datos de un fichero externo, pero no la última?
Esta característica está pensada para importar ficheros que incluyen algún tipo de cabecera, como es el caso de los formatos SINLI.
Lo único que tendremos que hacer es indicar la primera línea que queremos importar a Microsoft Excel desde el fichero de texto plano.
Este es un comportamiento estándar de todas las hojas de cálculo.
Apoyándonos en esta característica, podremos cargar directamente las líneas de detalle a nuestra hoja de cálculo.
Los ficheros SINLI, a diferencia de los ficheros en formato CSV, los cuales tienen la misma estructura en todas sus líneas, se componen de una sección de encabezado y otra de líneas de detalle.
El encabezado tiene la siguiente estructura, pero a la hora de importar a Microsoft Excel, la vamos a ignorar.
En cuanto a las líneas de detalle tienen todas la misma estructura, tratándose de datos de ancho fijo, llagando cada línea a poder alcanzar más de 3000 caracteres
A la hora de importar estos datos a Excel, lo haremos desde la opción Datos o directamente al abrir el fichero.
Indicaremos para ello la posición indicada en la columna Acumulado del documento que define el estándar.
Este es un trabajo árduo por lo que recomiendo crear un fichero al que podamos importar nuestros datos y luego reutilizarlo, evitando tener que definir las posiciones cada vez que deseemos importar datos.
A diferencia de las formulas de Microsoft Excel en las cuales si insertamos una columna las referencias de las celdas se actualizan automáticamente, en Visual Basic no sucede eso.
Si en visual Basic, una vez que ya tenemos el código programado, introducimos en el Excel una columna, el programa no se entera del cambio de dirección de la celda y sigue usando la referencia original, provocando de esta manera que se acceda a celdas incorrectas.
Una posible solución a esto, es usar celdas con nombre ya que al cambiar la ubicación de la celda el nombre acompañada a la celda.
Para ello usaremos el método Range con el nombre de la celda en lugar de la referencia.
Este es el código que usamos en el ejemplo de hoy:
Option Explicit
Sub condicional()
'Declaramos una variable numerica
Dim dia As Integer
Dim dato As String
dato = Range("celdaAmarilla").Value
If (Not IsNumeric(dato)) Then
MsgBox ("Error, has introducido un valor no numérico")
Else
dia = CInt(dato)
If (dia = 1) Then MsgBox ("lunes")
If (dia = 2) Then MsgBox ("martes")
If (dia = 3) Then MsgBox ("miercoles")
If (dia = 4) Then MsgBox ("jueves")
If (dia = 5) Then MsgBox ("viernes")
If (dia = 6) Then MsgBox ("sabado")
If (dia = 7) Then MsgBox ("domingo")
If (dia < 1) Then MsgBox ("Error, has introducido un error demasiado pequeño")
If (dia > 7) Then MsgBox ("Error, has introducido un error demasiado grande")
End If
End Sub
En concreto la instrucción que nos va a permitir no depender de la ubicación de la celda es la que se muestra a continuación resaltada.
dato = Range("celdaAmarilla").Value
Una vez asignado el nombre a una celda o rango, este va a acompañar a la celda aunque se inserten o eliminen filas o columnas.
Originalmente la columna con el número del día estaba en la celda "B2".
En esta posición le asignamos el nombre "celdaAmarilla".
Posteriormente, insertamos una columna, pasando a estar la celda en la ubicación "C2".
Pero como vemos, la celda sigue manteniendo el nombre asignado.
Mediante el objeto Cells es posible acceder a los valores almacenados en las celdas de Microsoft Excel.
Para ello a Cells debemos de pasarle como parámetro, el número de fila y el número de columna en la que se encuentra la celda objetivo.
La ventaja con respecto al uso del método Range, es que podremos utilizar bucles para incrementar el valor de la fila y la columna, permitiendo recorrer un conjunto de celdas de forma sencilla.
Este es el código del ejemplo de hoy.
Option Explicit
Sub condicional()
'Declaramos una variable numerica
Dim dia As Integer
Dim dato As String
dato = Cells(2, 2).Value
If (Not IsNumeric(dato)) Then
MsgBox ("Error, has introducido un valor no numérico")
Else
dia = CInt(dato)
If (dia = 1) Then MsgBox ("lunes")
If (dia = 2) Then MsgBox ("martes")
If (dia = 3) Then MsgBox ("miercoles")
If (dia = 4) Then MsgBox ("jueves")
If (dia = 5) Then MsgBox ("viernes")
If (dia = 6) Then MsgBox ("sabado")
If (dia = 7) Then MsgBox ("domingo")
If (dia < 1) Then MsgBox ("Error, has introducido un error demasiado pequeño")
If (dia > 7) Then MsgBox ("Error, has introducido un error demasiado grande")
End If
End Sub
La única instrucción que hemos modificado es la que se resalta en la siguiente imagen:
La ventaja de usar el objeto Cells en lugar del objeto Range está en que podemos usar dos variables para indicar la fila y la columna de la celda y estás variables pueden ser modificadas mediante bucles ya sean For o while a través del código de la macro.
Esto nos permitirá hacer modificaciones en una gran cantidad de celdas.