Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Dateien laden, Dateigröße | Herbers Excel-Forum


Betrifft: Dateien laden, Dateigröße von: carsten
Geschrieben am: 17.10.2008 13:06:48

hi,
ich hab ein programm geschrieben, welches eine textdatei mit messwerten lädt, und dann sowohl zeilen als auch spalten zählt(anhand der zeichen ascii 9 u 10).

funktioniert bei ner normalen textgröße auch wunderbar

nun habe ich jedoch textdateien mit einer größe von 100 MB. da versagt das programm.

meine frage: gibt es eine grenze bei der größe von dateien, die man laden kann?
oder hat jemand vielleicht ne andere idee, wo das problem liegen könnte?
ist die anweisung zum laden der datei falsch gewählt?

hier mein code:

'variablen für das reine spalten und zeilenzählen
Public ReadFile As String
Public zeichen 'zeichen im string beim zählen der zeilen und spalten
Public Länge 'ist die Länge des Gesamtstrings
Public Anzahl 'ist die Anzahl der Zeilen
Public Spalten 'ist die Anzahl der Spalten
Public Ascii 'ist der Ascii-Wert eines Zeichens
Public merkez 'ist die Stelle, an der die erste überzählige Zeile erreicht wird
Public kopfzeile As String 'ist der Kopfzeilenstring
Public daten As String


Sub Zeichenzählen()



Dim frage 'ist der Wert der Ja/Nein Frage


Anzahl = 0
Spalten = 1

ReadFile = Application.GetOpenFilename("Dateityp (*.txt; *.log; *.dat; *.asc; *.doc; *.rtf),")
If ReadFile = "Falsch" Then Exit Sub

'Die Zeilen und Spalten des Strings werden erfasst, gezählt
'und für weitere Operationen wichtige Stellen werden gespeichert

Open ReadFile For Random As #1

Do While Not EOF(1)


 
 Länge = Len(daten)

  For x = 1 To Länge
  zeichen = Mid(daten, x, 1)  'der ascii wert eines jeden zeichen wird ausgewerten
  Ascii = Asc(zeichen)
   
   If Ascii = 10 Then         'wenn der ascii=10, dann newLine/ende einer zeile
   Anzahl = Anzahl + 1
   End If
   
   If Ascii = 9 And Anzahl = 0 Then  'wenn ascii=9, dann tab/neue spalte ->spalten werden nur   _
_
anhand der ersten zeile gezählt
   Spalten = Spalten + 1
   End If
    
   If Anzahl = 65536 Then     'stelle im datenstring, an der mehr als excelzeilen erreicht  _
werden
   merkez = x
   End If
   
   If Anzahl = 0 Then            'kopfzeilenstring für die verarbeitung hinsichtlich der zeilen  _
 _
wird gespeichert
   kopfzeile = Mid(daten, 1, x)
   End If
     
  Next x

Loop



MsgBox "Zeilenzahl ist " & Anzahl & " Spaltenzahl ist " & Spalten


UserForm1.Show 'der user entscheidet, ob er die spaltenformatierungsfkt. oder die Zeilen  _
formatierungsfkt. nutzen möchte


End Sub


  

Betrifft: AW: Dateien laden, Dateigröße von: Tino
Geschrieben am: 17.10.2008 13:26:58

Hallo Rudi,
ob dies bei so großen Textdateien funktioniert kann ich nicht sagen.

Test einfach mal

Sub Text_Info()
  Dim sFilename As String
  Dim F As Integer
  Dim sInhalt As String
  Dim AnzahlZeilen As Long, AnzahlSpalten As Long
  sFilename = Application.GetOpenFilename("Dateityp (*.txt; *.log; *.dat; *.asc; *.doc; *.rtf),")
  If sFilename = "Falsch" Then Exit Sub
  
  If Dir$(sFilename, vbNormal) <> "" Then
    F = FreeFile
    Open sFilename For Binary As #F
    sInhalt = Space$(LOF(F))
    Get #F, , sInhalt
    Close #F
  End If
  
AnzahlZeilen = CountChar(sInhalt, vbCrLf) 'eventuell Zeilenumbruchzeichen anpassen 
AnzahlSpalten = IIf(AnzahlZeilen > Rows.Count, AnzahlZeilen / Rows.Count, 1)
MsgBox "Zeilenzahl ist " & AnzahlZeilen & " Spaltenzahl ist " & AnzahlSpalten
End Sub
Function CountChar(ByVal SourceString As String, ByVal strChar As String) As Long
   CountChar = Len(SourceString) - Len(Replace(SourceString, strChar, ""))
End Function




Gruß Tino


  

Betrifft: AW: Dateien laden, Dateigröße von: carsten
Geschrieben am: 20.10.2008 13:13:01

zeilenumbruchzeichen wäre ein newline (chr 10)..problem ist, ich muss diese abzählen, da ich den string an einer bestimmten stelle dann abschneiden und in eine andere datei speichern möchte..


  

Betrifft: AW: Dateien laden, Dateigröße von: Tino
Geschrieben am: 20.10.2008 13:43:19

Hallo,
dafür ist doch die Funktion eingebaut.

Function CountChar(ByVal SourceString As String, ByVal strChar As String) As Long
   CountChar = Len(SourceString) - Len(Replace(SourceString, strChar, ""))
End Function



Gruß Tino


  

Betrifft: AW: Dateien laden, Dateigröße von: carsten
Geschrieben am: 20.10.2008 13:23:21

bei so großen dateien funktioniert deine version leider nicht.

als fehler spuckt er aus: nicht genügend zeichenfolgenspeicher


  

Betrifft: AW: Dateien laden, Dateigröße von: Tino
Geschrieben am: 20.10.2008 13:51:00

Hallo,
dann musst Du die Zeilen in der Textdatei Zählen.

Dim Text1 As String
Dim txtLines As Long
Dim ReadFile As String 'Pfad und Datei 

Open ReadFile For Input As #1
txtLines = 0
    Do While Not EOF(1)
        Line Input #1, Text1
        txtLines = txtLines + 1 'Zähler 
    Loop

Close #1



Gruß Tino


  

Betrifft: AW: Dateien laden, Dateigröße von: carsten
Geschrieben am: 20.10.2008 13:55:04

so mach ich dass ja auch eigentlich mit meinem code(wenn du vorher schaust müsste das da stehen)

das line input in meinem gepostetem code is leider verloren gegangen..
aber genauso wie du sagst hab ichs gemacht..und bei ner dateigröße von 100mb bzw. etwa 150mio zeichen kackt excel einfach ab..ohne jegliche rückmeldung..
hast du ne idee?


  

Betrifft: AW: Dateien laden, Dateigröße von: carsten
Geschrieben am: 20.10.2008 14:02:52

außerdem ließt er die ganze datei dann als eine zeile ein u erkennt nicht die zeilenumbrüche.
das is mir alles ein rätsel.


  

Betrifft: AW: Dateien laden, Dateigröße von: carsten
Geschrieben am: 20.10.2008 14:12:21

ok..nach der fehlersuche ist mir aufgefallen, dass er bei der großen datei schon bei dem line input nicht mehr weitermacht?!


  

Betrifft: AW: Dateien laden, Dateigröße von: Tino
Geschrieben am: 20.10.2008 14:59:51

Hallo,
also ich sage jetzt einfach mal, Du müsstest die Datei vorher aufsplittern.
Eventuell mit WindowsCommander oder auch mansche Zip-Programme können dies auch.


Gruß Tino


  

Betrifft: AW: Dateien laden, Dateigröße von: carsten
Geschrieben am: 20.10.2008 16:16:27

wills jetzt mit der .readline methode probieren..ich glaub, dann liest er jede zeile einzeln aus.
prob is nur folgendes..ich muss aus meinem pfad ja n textstream machen.
nu schreib ich so:

Sub Zeichenzählen()
Dim Object1
Dim objFileSys
Dim ReadFile As String


ReadFile = Application.GetOpenFilename("Dateityp (*.txt; *.log; *.dat; *.asc; *.doc; *.rtf),")
If ReadFile = "Falsch" Then Exit Sub

Set objFileSys = CreateObject("Scripting.FileSystemObject")
Set Object1 = objFileSys.OpenTextFile(ReadFile, ForReading)

usw...

und jetz: für die letzte zeile sagt er mir ungültiger prozeduraufruf oder ungültiges argument.
kann mir das jemand erklären?


  

Betrifft: AW: Dateien laden, Dateigröße von: Tino
Geschrieben am: 20.10.2008 16:32:05

Hallo,
warum nicht einfach so?

Modul Modul1

Option Explicit 
 
 
Sub Zeichenzählen() 
Dim ReadFile As String, sLine As String 
Dim F As Integer 
Dim lRow As Long 
 
ReadFile = Application.GetOpenFilename("Dateityp (*.txt; *.log; *.dat; *.asc; *.doc; *.rtf),") 
If ReadFile = "Falsch" Then Exit Sub 
 
 
  lRow = 0 
  If Dir$(sFilename) <> "" Then 
    F = FreeFile 
    Open ReadFile For Input As #F 
        While Not EOF(F) 
            Line Input #F, sLine 
            lRow = lRow + 1 
        Wend 
    Close #F 
 
End Sub 



Gruß Tino


  

Betrifft: AW: Dateien laden, Dateigröße von: carsten
Geschrieben am: 20.10.2008 17:43:44

weil vba über die Line Input methode komischerweise meine zeilenumbrüche nicht erkennt, und somit die gesamte tabellenstring als eine line einliest quasie 150mio zeichen. leider macht excel da faxen..macht einfach nich weiter..ka warum.
habs jetz mit der .readline methode gemacht..das funktioniert ähnlich

'variablen für das reine spalten und zeilenzählen
Public ReadFile As String
Public Object1
Public objFileSys
Public zeichen 'zeichen im string beim zählen der zeilen und spalten
Public Länge 'ist die Länge des Gesamtstrings
Public Anzahl 'ist die Anzahl der Zeilen
Public Spalten 'ist die Anzahl der Spalten
Public Ascii 'ist der Ascii-Wert eines Zeichens
Public merkez 'ist die Stelle, an der die erste überzählige Zeile erreicht wird
Public kopfzeile As String 'ist der Kopfzeilenstring
Public daten As String

Public Sub Zeichenzählen()





Dim frage 'ist der Wert der Ja/Nein Frage


Anzahl = 0
Spalten = 1

ReadFile = Application.GetOpenFilename("Dateityp (*.txt; *.log; *.dat; *.asc; *.doc; *.rtf),")
If ReadFile = "Falsch" Then Exit Sub

Set objFileSys = CreateObject("Scripting.FileSystemObject")
Set Object1 = objFileSys.OpenTextFile(ReadFile, 1)

'Die Zeilen und Spalten des Strings werden erfasst, gezählt
'und für weitere Operationen wichtige Stellen werden gespeichert



Do Until Object1.AtEndOfLine
daten = Object1.readLine


 
 If Anzahl = 0 Then
 Länge = Len(daten)
  
  
  For x = 1 To Länge
  
  zeichen = Mid(daten, x, 1)  'der ascii wert eines jeden zeichen wird ausgewerten
  Ascii = Asc(zeichen)
    
   If Ascii = 9 Then 'wenn ascii=9, dann tab/neue spalte ->spalten werden nur anhand der ersten  _
zeile gezählt
   Spalten = Spalten + 1
   End If
   
  Next x
           
   kopfzeile = Mid(daten, 1, x) 'kopfzeilenstring für die verarbeitung hinsichtlich der zeilen  _
wird gespeichert
 End If
 
  If Anzahl = 65536 Then     'stelle im datenstring, an der mehr als excelzeilen erreicht  _
werden
   merkez = x
   End If
   
  Anzahl = Anzahl + 1

Loop





MsgBox "Zeilenzahl ist " & Anzahl & " Spaltenzahl ist " & Spalten


UserForm1.Show 'der user entscheidet, ob er die spaltenformatierungsfkt. oder die Zeilen  _
formatierungsfkt. nutzen möchte


End Sub



Danke dir


  

Betrifft: AW: Dateien laden, Dateigröße von: carsten
Geschrieben am: 24.10.2008 15:07:36

mit der readfile methode funzt es
kann den code nur irgendwie nich senden
danke für deine hilfe


  

Betrifft: AW: Dateien laden, Dateigröße von: carsten
Geschrieben am: 20.10.2008 13:42:49

funktioniert bei der großen datei nicht

fehler: zeichenfolgenspeicher zu klein..was kann man da machen?


Beiträge aus den Excel-Beispielen zum Thema "Dateien laden, Dateigröße"