# importar archivos .dat en excel cuando hay más de 65536filas



## suat_sanidad (Dec 4, 2007)

Hola!
Quiero importar un archivo muy grande, con más de 65536 filas a excel. El archivo es .dat por si eso sirve de algo. He leido en un thread del 22 de mayo del 2002 algo relacionado, pero no lo entiendo. Alguien puede por favor ayudarme con una explicación para dummies? Muchas gracias


----------



## Greg Truby (Dec 4, 2007)

Bienvenido a MrExcel.com.  ¿Puede usted darnos un vínculo a tal thread? ¿Usted está importando manualmente o por medio de VBA (un macro)?


----------



## suat_sanidad (Dec 4, 2007)

http://www.mrexcel.com/board2/viewtopic.php?p=42463

Importo manualmente

Gracias


----------



## Greg Truby (Dec 5, 2007)

Bueno,

Hay dos soluciones. Una es usar VBA para abrir el archivo, leer cada línea, poner la línea del archivo en una celda y al llegar a las 65,535 líneas, crear una hoja nueva y correr el bucle otra vez.

La otra manera es quebrar el archivo antemano y importarlo pieza por pieza.  Dado que usted está importando mano creo que esta segunda opción le serviría mejor.

Aquí le doy código que uno corre por fuera de Excel para quebrar el archivo en piezas de 65,535 líneas en cada archivo.

```
Const c_fsoForReading = 1
Const c_lngMaxLines = 65535

Set objDialog = CreateObject("UserAccounts.CommonDialog")

With objDialog
    .Filter = "Text Files|*.txt"
    .InitialDir = "D:\"
    intResult = .ShowOpen
End With

If intResult = 0 Then
    WScript.Quit
Else
    '// do nothing
    '// WScript.Echo objDialog.FileName
End If

strFullFileName =  objDialog.Filename
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFileInput  = objFSO.OpenTextFile(strFullFileName, c_fsoForReading)

p = InStrRev(strFullFileName,"\")
strPath = Left(strNewFileName, p)
strFileName = Right(strFullFileName, Len(strFullFileName) - p) 
d = InStrRev(strFileName,".")
strBaseFileName = Left(strFileName,d - 1)
strExt = Right(strFileName,Len(strFileName) - d + 1)


Do While objTextFileInput.AtEndOfStream <> True
    f = f + 1
    m = 10
    strNewFileName = strPath & strBaseFileName & " - " & CStr(f) & strExt
    Set objTextFileOutput = objFSO.CreateTextFile(strNewFileName, TRUE) 
    r = 1
    Do Until r > c_lngMaxLines Or objTextFileInput.AtEndOfStream
        strLine = objTextFileInput.ReadLine
        r = r + 1
        objTextFileOutput.WriteLine strLine
        '// This part not critical. 
        '// I just like seeing what's going on.
        If r Mod m = 0 Then
             WScript.echo FormatNumber( r, 0, FALSE, FALSE, TRUE) & " lines read"  '// & vbcrlf & "m = " & m
             Select Case true
                 Case r >= 250000 : m = 50000
                 Case r >=  50000 : m = 25000
                 Case r >=  20000 : m = 10000
                 Case r >=   5000 : m =  2500
                 Case r >=    500 : m =  1000
                 Case r >=     50 : m =   100
             End Select
        End If
    Loop
    objTextFileOutput.Close
Loop

objTextFileInput.Close
WScript.Echo "Done"
```

Copiando el código arriba y pegando en un programa como NOTEPAD. Luego salvando el archivo con un nombre como Quebrar65535.vbs

Usted tendrá que abrir un "command prompt".  En Windows (en inglés, por lo menos), generalmente se puede hacer "Start | All Programs | Accessories" y verá una opción para eso.  Una vez que tiene el command prompt, corre el script teclando _cscript quebrar65535.vbs_ y debe de funcionar. 

Si usted conoce suficiente VBA, aquí hay una rutinita que se puede pegar a un modulo en un cuaderno que creará un archivo para hacer pruebas
	
	
	
	
	
	



```
Sub MakeDummyFile()

    Open "d:\test65K.txt" For Output As #1
    
    For i = 1 To 250000
        Write #1, Format(i, "000,000")
    Next i
    
    Close #1
End Sub
```


----------

