Jump to content

Contar el número de filas del contenido un archivo txt importado o abierto a través de macros


Recommended Posts

Hola Buenas Noches.

Ante todo un cordial saludo a los foristas de ayudaexcel.

En un libro con macros que estoy desarrollando, me he visto en la necesidad de importar archivos con texto plano y desplegarlo en una hoja de excel bajo el siguiente criterio:

- debe estar formateado en codificación UTF-8

- el contenido se irá guardando en filas sucesivas.

- se deberá conocer el número de filas que se generarán una vez vaciado el contenido del txt en la hoja.

de lo señalado llevo bastante adelantado, pero mi problema es que al usar uno que otro método, entonces se dejan de cumplir uno de los criterios señalados.

utilizando por ejemplo, la importación con el objeto QueryTables mediante el siguiente código

 

    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & sRutaArchivo1, Destination:=Range("$G$6"))
        .Name = sCadenaSoloNombreArchivo
        .FieldNames = True
        .RowNumbers = True
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 65001
        .TextFileStartRow = 1
        .TextFileParseType = xlFixedWidth
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        'Debug.Print .SourceDataFile
        '.Refresh
    End With

me encuentro con que no puedo saber el número de filas que se generan, desconozco si mediante ese objeto hay alguna propiedad que me devuelva el numero de filas generadas.

ahora bien, utilizando la instrucción Open en combinación con las instrucciones Line Input, si puedo determinar el número de lineas, pero me encuentro con que el texto no se guarda en la codificación UTF-8 y además se generan otros inconvenientes como que el contenido del texto no se va guardando en las filas conforme vaya detectando el caracter vbCrLf, lo cual requiere realizar una reforma al código, que puedo hacer, pero sería de inutilidad si no logro primero hacer que el texto se guarde con la codificación UTF-8.

 

ahora a las preguntas en concreto.

 

usando el objeto QueryTables  ¿existirá alguna forma de saber el número de lineas o filas que se crean dependiendo de la longitud del texto a importar?

o

usando la instrucción Open en combinación con las instrucciones Line Input, ¿habrá alguna forma de codificar el texto en utf-8?

 

Gracias por leer.

 

 

Link to post
Share on other sites
Hace 3 horas, Luis Caballero dijo:

Hola,

Puedes contar las líneas del fichero txt, de manera independiente.



 

Dim lineas() As String = File.ReadAllLinessRutaArchivo1 )

numerolineas= CStr(lineas.Length)

 

pero ¿a cual objeto a referenciar pertenece File.ReadAllLines?

Link to post
Share on other sites

Hola, 

al final lo resolví de la siguiente manera:

referenciando a Microsoft ActiveX DataObjects library y usando el objeto ADOB.Stream el cual tiene la propiedad de formatear la cadena a utf-8

el código quedó así:

Sub LeerTextoEnUTF8()
 Dim lConta As Long
 
 Dim adoStream As ADODB.Stream
 Dim var_String As Variant
 Application.ScreenUpdating = False
 Set adoStream = New ADODB.Stream
 adoStream.Charset = "UTF-8"
 adoStream.Open
 adoStream.LoadFromFile "C:\elTexto.txt"
 
 var_String = Split(adoStream.ReadText, vbLf) 'divide el contenido del archivo en un arreglo, separado por el caracter vbLf
 
 Range("G8").Select
'Para todos los elementos del vector...
lConta = UBound(var_String)
For i = 0 To lConta  'UBound(var_String)
    'Vamos escribiendo línea a línea
    ActiveCell = var_String(i)
    Worksheets(1).Range("F" & (Format(i) + 8)) = i + 1  'va enumerando cada fila generada
    'Pasamos a la siguiente línea
    ActiveCell.Offset(1, 0).Select
Next 'seguimos con el bucle
Application.ScreenUpdating = True
End Sub

éste código es una adaptación del código original posteado por Ger Plante en el siguiente link https://www.ozgrid.com/forum/index.php?thread/107893-read-load-utf-8-text-file-with-vba/

la condición para ejecutar éste código es que hay que decirle al editor de vba que referencie a la librería  Microsoft ActiveX DataObjects library (MDAO) en su versión mas reciente.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×
×
  • Create New...

Important Information

Privacy Policy