Cargar txt a access desde vba

Hace un par de meses empecé a usar access para manejar una BD y de a poco fui aprendiendo SQL y algo de VBA.
Mi problema es el siguiente quiero automatizar la carga de datos (la BD es de un sistema de cobranzas) el banco realiza los cobros de los socios por nosotros y nos envía un .txt con los números de los códigos de barra con la forma xxxyyyzzz donde por y o z tienen que ir cada uno a un campo distinto. Por otro lado en el nombre del archivo esta la fecha de cobro de todos los pagos que registra el txt, esa fecha debería ir en cada uno de los registros que se crean.
Hasta ahora he hecho esto para cargar los datos:
Sub Carga()
Dim strlinea As String
Dim strcamp1 As String
Dim strcamp2 As String
Dim strcamp3 As String
Open "c:\lalala.txt" For Input As #1
While Not EOF(1)
Line Input #1, strlinea
strcamp1 = Mid(strlinea, 1, 3)
strcamp2 = Mid(strlinea, 4, 3)
strcamp3 = Mid(strlinea, 7, 3)
CurrentDb.Execute ("INSERT INTO [Tabla1](camp1,camp2,camp3) VALUES ('" & strcamp1 & "','" & strcamp2 & "','" & strcamp3 & "')")
Wend
Close #1
End Sub
Ese programa me anda perfecto pero me faltan 2 cosas:
1: Cargar la fecha que trae el nombre
2: Para hacer la carga más simple quisiera (si es que se puede) que cada vez que corra el módulo lea todos los txt de una carpeta especificada y los mande a otra carpeta (así no los carga dos veces)

1 respuesta

Respuesta
-1
El código que suelo usar yo para cargar ficheros de texto es algo parecido al que sigue:
Option Compare Database
Option Explicit
Sub cargarFicheroEnTabla1(ByVal nomFich As String)
    Const nomTabla = "nombreTabla1"
    Dim nf As Integer
    Dim linea As String ' Para leer el fichero línea a línea
    Dim auxI As Long  ' Para números enteros (largos o cortos)
    Dim auxD As Double  ' Para números dobles
    Dim auxF As Variant ' Para fechas
    Dim rs As Recordset ' Para utilizar la tabla
    Dim longTotal As Double ' Longitud total del fichero
    Dim longLeida As Double ' Longitud de texto leido
    ' Abrimos el fichero a leer
    nf = FreeFile
    On Error Resume Next
    Open nomFich For Input As nf
    If Err <> 0 Then
        MsgBox "Error al abrir el fichero. Mensaje del sistema: " & vbCrLf & Error$ & _
               vbCrLf & vbCrLf & "Proceso cancelado"
        On Error GoTo 0
        Exit Sub
    End If
    On Error GoTo 0
    ' El fichero está abierto sin problemas
longTotal = LOF(nf)
    ' Borramos el contenido anterior de la tabla
    DoCmd. RunSQL "delete from " & nomTabla
    ' Abrimos la tabla
    Set rs = CurrentDb().OpenRecordset(nomTabla)
    SysCmd acSysCmdInitMeter, "Cargando fichero en tabla " & nomTabla, longTotal
    longLeida = 0
    Do While Not EOF(nf)
        Line Input #nf, linea
        longLeida = longLeida + Len(linea) + 2 ' 2 caracteres más por el final de línea
        SysCmd acSysCmdUpdateMeter, longLeida
        DoEvents
        rs.AddNew
        ' Vamos cortando la línea con la instrucción mid$ y asignando los valores a los campos de la tabla
        rs!campoTexto1 = Trim$(Mid$(linea, 1, 10)) ' Los 10 primeros caracteres quitando los blancos
        rs!campoNum2 = miraValorEntero(Mid$(linea, 11, 5)) ' A partir del caracter 11, 5 posiciones (del 11 al 15)
        rs!campoFecha3 = miraValorFechaAAAAMMDD(Mid$(linea, 16, 8)) ' 8 caracteres a partir del 16
        ' .....................
        ' .....................
        ' .....................
        rs.Update
    Loop
    Close nf
    rs.Close
    SysCmd acSysCmdClearStatus
End Sub
Function miraValorEntero(ByVal txt As String) As Variant
    txt = Trim$(txt) ' Quitamos los blancos
    miraValorEntero = Null ' Hasta que se demuestre que contiene un valor correcto
    If txt <> "" Then ' Contiene algún texto
        If IsNumeric(txt) Then  ' Es un texto númerico
            If Val(txt) = CDbl(txt) Then    ' Es un numérico entero
                miraValorEntero = Val(txt)
            End If
        End If
    End If
End Function
Function miraValorFechaAAAAMMDD(ByVal txt As String) As Variant
    Dim dd As Integer
    Dim mm As Integer
    Dim aa As Integer
    Dim aux As String
    txt = Trim$(txt)
    miraValorFechaAAAAMMDD = Null ' Hasta que se demuestre que contiene un valor correcto
    If Len(txt) = 8 Then ' Tiene 8 caracteres...
        If IsNumeric(txt) Then ' Y son números...
            ' Los separamos en aa, mm y dd
            aa = Val(Mid$(txt, 1, 4))
            mm = Val(Mid$(txt, 5, 2))
            dd = Val(Mid$(txt, 7, 2))
            ' Ahora comprobamos que sea una fecha correcta. ¿Cómo?
            ' Pasando los campos a formato fecha, de ese formato a AAAAMMDD
            aux = Format$(DateSerial(aa, mm, dd), "yyyymmdd")
            ' Y el valor tiene que ser el mismo que TXT
            If aux = txt Then
                ' La fecha es correcta. Devolvemos ese valor
                miraValorFechaAAAAMMDD = DateSerial(aa, mm, dd)
            End If
        End If
    End If
End Function
Ahora bien, para leer los ficheros de una carpeta y moverlos a otra después de haber cargado su contenido podrías usar algo como esto:
Sub procesarTodosLosFicheros()
    Const carpetaOrigen = "c:\datos"
    Const carpetaDestino = "c:\datosCargados"
    ReDim matFich(1 To 1000) As String
    Dim nFich As Integer
    Dim i As Integer
    Dim aux As String
    ' Nos aseguramos que exista la carpeta destino
    On Error Resume Next
    MkDir carpetaDestino
    On Error GoTo 0
    aux = Dir$(carpetaDestino & "\.", vbDirectory)
    If aux = "" Then
        MsgBox "Error: No se puede encontrar la carpeta destino de las copias. Proceso cancelado"
        Exit Sub
    End If
    ' Leemos todos los ficheros de la carpeta de origen
leerFicherosCarpeta carpetaOrigen, "*.txt", matFich(), nFich
    For i = 1 To nFich
        ' cargamos los datos del fichero
        cargarFicheroEnTabla1 matFich(i)
        ' Y movemos el fichero a la carpeta de datos cargados
        Name matFich(i) As carpetaDestino & "\" & sinPath(matFich(i))
    Next i
    MsgBox "Todos los ficheros han sido procesados"
End Sub
Sub leerFicherosCarpeta(ByVal nomCarpeta As String, ByVal nombreComo As String, ByRef matFich() As String, ByRef nFich As Integer)
    Dim d As String
    nFich = 0
    d = Dir$(nomCarpeta & "\" & nombreComo, vbArchive + vbNormal)
    Do While d <> ""
        nFich = nFich + 1
        matFich(nFich) = nomCarpeta & "\" & d
        d = Dir$
    Loop
End Sub
Function sinPath(ByVal nomFich As String) As String
    Do While InStr(nomFich, "\") > 0
        nomFich = Right$(nomFich, Len(nomFich) - InStr(nomFich, "\"))
    Loop
    sinPath = nomFich
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas