Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1928to1932
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Überlauffehler 6

Überlauffehler 6
09.05.2023 08:57:23
bustue

Moin Moin Freunde,

bei folgendem VBA Code erhalte ich die Fehlermeldung Überlauf.
Ich muß mehr als 65536 Zeilen exportieren.
Der Code stammt von Ramses und funktioniert bisher tadellos.

Sub save5_as_CSV_Click()
    '(C) by Ramses
    'Exportiert einen ausgewählten Bereich in ein zu definierendes Textfile
          
    Dim i As Integer, n As Integer, maxExpCol As Integer, QE As Integer
    Dim StartRow As Integer, StartCol As Integer, selRow As Integer, selCol As Integer
    Dim myC As Range
    Dim expFolder As String, expFileName As String, strPfad As String
    Dim myDiv As String, tmpExpText As String, expText As String
    'Maximal zu exportierende Spalten
    'Dieser Parameter ist anzupassen, um unterschiedliche Bereiche
    'in ein einheitliches Exportformat zu bringen
     maxExpCol = 2
    'Default Pfad incl abschliessendem Backslash
     expFolder = "Z:\Preise\OTTO\"
    'Standard Name für TextExportFile inkl. aktuelles Datum
     expFileName = "BFT_Preisupdate_" & Format(Date, "dd-mm-yyyy") & ".csv"
     
    '************************************************
    'Ab hier keine Änderungen mehr vornehmen
    'Trennzeichen für das CSV-File
    myDiv = ";"
    If Selection.Columns.Count > maxExpCol Then
        MsgBox "Maximal zu exportierende Spaltenzahl überschritten"
        Exit Sub
    End If
    'Starbereich festlegen
    StartRow = 1
    lastRow = Range("A96050").End(xlUp).Row

    'Scheifenparameter initialisieren
    selRow = Selection.Rows.Count
    selCol = Selection.Columns.Count
    For i = StartRow To lastRow
 tmpExpText = ""
 'hier die zu exportierenden Spalten eintragen
 For Each Spaltenarray In Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
 StartCol = Range(Spaltenarray + "1").Column
 tmpExpText = tmpExpText & Cells(i, StartCol).Text & myDiv
 Next Spaltenarray
 expText = expText & tmpExpText & vbCrLf
 Next i
      
    'Exportfile und Speicherpfad kontrollieren
    expFileName = Application.GetSaveAsFilename(InitialFileName:=expFolder & expFileName, _
        fileFilter:="CSV Files (*.csv), *.csv)", Title:="Exportpfad definieren")
    If Dir(expFileName) > "" Then
        QE = MsgBox("Sollen die Daten an die existierende Datei angehängt werden," & vbCrLf & _
            "oder soll die Datei überschrieben werden ?" & vbCrLf & vbCrLf & _
            "JA = Anhängen" & vbCrLf & "NEIN = Datei überschreiben" & vbCrLf & "ABBRECHEN = Abbrechen", _
            vbYesNoCancel + vbCritical + vbDefaultButton1, "Exportverhalten definieren")
        If QE = vbCancel Then Exit Sub
        If QE = vbYes Then
            'Daten anhängen
            Open expFileName For Append As #1
            Print #1, expText
            Close #1
        Else
            'Daten überschreiben
            Open expFileName For Output As #1
            Print #1, expText
            Close #1
        End If
    Else
        'Daten erstmalig schreiben
        Open expFileName For Output As #1
        Print #1, expText
        Close #1
    End If
    MsgBox "Daten exportiert"
End Sub 


Woran muß was ändern, damit der Code auch für mehr als 65536 Zeilen funktioniert. Mit der Hilfe zu dem Fehlercode konnte ich leider nichts anfangen.

Mit freundlichen Grüßen
und herzlichen Dank im Voraus für Eure Hilfe,
Burghard

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Überlauffehler 6
09.05.2023 09:00:03
Daniel
Hi
streich mal den Datentyp INTEGER und verwende nur noch LONG für Ganzzahlen.
Integer ist von Zahlenraum zu begrenzt und bringt keinerlei Vorteile gegenüber LONG
(dh der etwas geringere Speicherplatzbedarf wird nur dann relevant, wenn du Arrays mit Millionen von Daten hast)

Gruß Daniel


AW: Überlauffehler 6
09.05.2023 09:13:13
bustue
Hallo Daniel,
vielen Dank für Deine schnelle Hilfe, Funktioniert jetzt
wieder wie erwartet.
Gruß Burghard


AW: Überlauffehler 6
09.05.2023 09:32:55
Der Steuerfuzzi
Hi Daniel,

obwohl Integer nur 16 Bit/2 Byte haben, belegt eine Integer-Variable bei einem 32 Bit Office im Speicher 32 Bit/4Byte. Damit kannst Du nicht mehr Integer-Variablen als Long deklarieren, die genau 32 Bit belegen (kann man ganz schnell mit einem entsprechend dimensionierten Array testen). Früher hieß es mal, dass Long-Variablen einen Geschwindigkeitsvorteil gegenüber Integer-Variablen hätten. Das gilt aber wohl nur für 32-Bit-Systeme, denn auf meinem 64-Bit Windows mit 32 Bit Office wurden die Long-Variablen ungefähr gleich schnell abgearbeitet. Habe das erst gestern wegen einer Frage in einem anderen Forum getestet.

Allerdings sind heute Long-Variablen für Ganzzahlen die bessere Wahl weil Integer keinerlei Vorteil bringen und für viele Dinge (z. B. Zeilen eines Arbeitsblatts) nicht groß genug sind.

Gruß
Michael


Anzeige
AW: Überlauffehler 6
09.05.2023 10:06:49
Daniel
das LONG schneller ist als INTEGER, habe ich noch nicht beobachtet.
die beiden sind in meinen Tests immer etwa gleich schnell gewesen.
Deutlich langsamer war BYTE

Bei Arrays jedoch scheint es einen unterschied zu machen.
Redim x(1 to 10^9) as Long ergibt "nicht genügen Speicher, mit as Interger gehts.
Gruß Daniel


sogar dann (evtl.) nicht, weil ...
10.05.2023 09:04:56
lupo1
... auch INTEGER intern den gleichen Platz von 4 Byte wie LONG belegen soll, obwohl 2 ausreichen würde.

Ich weiß nicht mehr, wo ich das mal gelesen habe.


AW: sogar dann (evtl.) nicht, weil ...
10.05.2023 11:00:55
Daniel
ich vermute mal, dass intern bei Integer schon nur 2 statt 4 Bytes Daten belegt werden.
Allerdings hat eine Variable ja nicht nur die Daten die gespeichert werden sollen, sondern auch einen Namen und das ist ist ein mehr oder weniger beliebig langer Text.
Dh Speicherplatztechnisch ist das völlig irrelevant, ob 2 oder 4 bytes, weil die vollständige Variable noch wesentlich mehr an Daten benötigt.

man merkt aber den Unterschied dort wo reine Daten gespeichtert werden, beispielsweise in einem Array.
Da kann man vom Typ INTEGER mehr daten in ein Array packen, als vom Typ LONG.
bei mir funktioniert
Redim x (10^9) as Integer noch, verwende ist aber Redim x (10^9) as Long, bekomme ich den Fehler nicht genügend Speicherplatz.

also ja, Integer belegt tatsächlich weniger Speicherplatz als Long, aber das ist heutzutage noch irrelevanter als ein Sack Reis in China.


Anzeige
AW: Überlauffehler 6
09.05.2023 09:02:40
RPP63
Moin!
Tausche alle Integer zu Long!
VBA ist ohnehin auf Long optimiert (habe ich zumindest mehrfach gelesen, aber nie verifiziert).
In der Urzeit hatte der geringe Speicherplatzvorteil von Integer durchaus Relevanz, ist heutzutage aber uninteressant.

Gruß Ralf


AW: Überlauffehler 6
09.05.2023 09:14:37
bustue
Hallo Ralf,
auch Dir herzlichen Dank für Deine schnelle Hilfe.
Alleine hätte ich das nicht lösen können.
Gruß Burghard

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige