Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Code reset Variablen

VBA Code reset Variablen
Stevie
Hallo Zusammen,
der nachfolgende VBA-Code soll Druckfiles für einen Thermotransferdrucker erstellen. Selektierte Datensätze im Excel Sheet werden nacheinander in eine Template Datei (Test.txt) geschrieben und als Datei (Test2.txt) neu abgelegt.
Der Code funktioniert auch ganz gut, allerdings nur beim ersten gefundenen Datensatz. Im zweiten nachfolgenden Datensatz wird jeweils der vorausgegangene Datensatz mit in die Druckfile übergeben, beim dritten die ersten zwei Datensätze.
Ich gehe davon aus das der Arr(Icounter) unten geleert werden muss, es ist nur die Frage wie? Mit
Arr(iCounter) = resetsTxt klappt es jedenfalls nicht (resetsTxt = leere vorher definierte Variable)
Sub Suchen_X2()
Dim Zeile As Long, wks As Worksheet, iZaehler As Long, Nummer As String, Name As Variant,  _
Ort As Variant, Von As Long, TMS As Variant
Dim arr() As String
Dim iCounter As Integer
Dim sSource As String, sTarget As String, sTxtA As String, resetsTxt As String
Dim sTxtB As String, sTxt As String, sPath As String, sTxtC As String, sTxtD As String
Dim sTxtE As String, sTxtF As String, sTxtG As String, sTxtI As String, sTxtJ As String
Dim sTxtK As String, sTxtL As String
sPath = ThisWorkbook.Path & "\"
sSource = sPath & "test.txt"
sTarget = sPath & "test2.txt"
Set wks = Sheets("Daten")
With wks
.Select
'Spalte G (7) abarbeiten
For Zeile = 2 To .Cells(.Rows.Count, 7).End(xlUp).Row
If LCase(.Cells(Zeile, 7)) = "x" Then
'Anzahl Schleifen machen gemäß Wert in spalte E (5)
For iZaehler = 1 To .Cells(Zeile, 5)
.Cells(Zeile, 6) = iZaehler 'Zähler in Spalte F eintragen
Nummer = Cells(Zeile, 2).Value
Name = Cells(Zeile, 3).Value
Ort = Cells(Zeile, 4).Value
Von = Cells(Zeile, 5).Value
TMS = Cells(Zeile, 1).Value
'MsgBox ("Zeile: " & Zeile & "Paket: " & iZaehler & "von" & Von & "Auftrag: " &  _
Nummer & "Name: " & Name & "Ort: " & Ort)
sTxtA = "nnnnnnnn" 'Platzhalter Nummer
sTxtB = Nummer 'Nummer
sTxtC = "mmmmmmmm" 'Platzhalter Name
sTxtD = Name 'Name
sTxtE = "oooooooo" 'Platzhalter Ort
sTxtF = Ort 'Ort
sTxtG = "xxxxxxxx" ' Platzhalter IZaehler
sTxtH = iZaehler 'IZaehler
sTxtI = "vvvvvvvv" 'Platzhalter von
sTxtJ = Von 'von
sTxtK = "tttttttt" 'Platzhalter TMS
sTxtL = TMS 'TMS
Close
Open sSource For Input As #1
Do Until EOF(1)
Line Input #1, sTxt
If InStr(sTxt, sTxtA) Then
sTxt = Replace(sTxt, sTxtA, sTxtB)
End If
If InStr(sTxt, sTxtC) Then
sTxt = Replace(sTxt, sTxtC, sTxtD)
End If
If InStr(sTxt, sTxtE) Then
sTxt = Replace(sTxt, sTxtE, sTxtF)
End If
If InStr(sTxt, sTxtG) Then
sTxt = Replace(sTxt, sTxtG, sTxtH)
End If
If InStr(sTxt, sTxtI) Then
sTxt = Replace(sTxt, sTxtI, sTxtJ)
End If
If InStr(sTxt, sTxtK) Then
sTxt = Replace(sTxt, sTxtK, sTxtL)
End If
iCounter = iCounter + 1
ReDim Preserve arr(1 To iCounter)
arr(iCounter) = sTxt
Loop
Close
Open sTarget For Output As #1
For iCounter = 1 To UBound(arr)
Print #1, arr(iCounter)
Next iCounter
Close
'TaskID = Shell("c:\111.bat")
Shell "notepad " & sTarget, vbMaximizedFocus
'sTxt = resetsTxt
'arr(iCounter) = resetsTxt
'Makro Aktion Ende
Next
End If
Next
End With
MsgBox ("Alle ""X"" abgearbeitet")
End Sub

Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Erase Arr owT
04.05.2010 10:59:24
Rudi
AW: Erase Arr owT
04.05.2010 11:08:16
Stevie
Goldschatz :)
Ein kleines Manko habe ich nun noch und zwar rutscht in der Textfile mit zunehmenden Datensätzen der
ganze Textblock nach unten Im Prinzip gleich wie vorher, nur ohne vorherige Datensätze aber dafür mit Leerzeichen.
AW: Erase Arr owT
04.05.2010 11:10:05
xr8k2
Hallo Stevie,
Zusätzlich musst du auch noch deine Variable "icounter" auf den Startwert zurücksetzen.
Gruß,
xr8k2
Anzeige
AW: Erase Arr owT
04.05.2010 11:22:47
Stevie
Auch Du bekommst das Prädikat "Goldschatz".
Manchmal sieht man den Wald von lauter Bäumen nicht....
Vielen Dank.
;
Anzeige
Anzeige

Infobox / Tutorial

VBA Code: Variablen zurücksetzen und Textdateien erstellen


Schritt-für-Schritt-Anleitung

Um den VBA-Code so zu optimieren, dass die Variablen korrekt zurückgesetzt werden und keine vorherigen Datensätze in die neuen Dateien übernommen werden, folge diesen Schritten:

  1. Initialisiere die Variablen: Setze die iCounter-Variable zu Beginn jeder Schleife auf 0 zurück.

    iCounter = 0
  2. Leere das Array: Um sicherzustellen, dass das Array arr bei jedem neuen Durchlauf neu gefüllt wird, kannst du die Dimensionierung des Arrays anpassen. Eine Möglichkeit ist, das Array vor dem Start der Schleife neu zu dimensionieren:

    ReDim arr(1 To 1) ' Leeres Array für neue Datensätze
  3. Führe den Code aus: Teste den angepassten Code, um sicherzustellen, dass die Variablen korrekt zurückgesetzt werden und die Textdatei nur die aktuellen Datensätze enthält.


Häufige Fehler und Lösungen

  • Problem: Vorherige Datensätze werden mit übernommen.

    • Lösung: Stelle sicher, dass iCounter am Anfang jeder Schleife auf 0 zurückgesetzt wird. Dies verhindert, dass bereits gefüllte Werte in die nächste Ausgabe übernommen werden.
  • Problem: Leerzeilen in der Textdatei.

    • Lösung: Überprüfe, ob die Schleifen und Bedingungen korrekt gesetzt sind, um sicherzustellen, dass keine unnötigen Leerzeilen generiert werden.

Alternative Methoden

Wenn du mit den Standardmethoden nicht weiterkommst, kannst du folgende alternative Ansätze ausprobieren:

  • Erstelle eine Funktion: Kapsle die Logik in eine Funktion, die die Werte zurücksetzt und die Datei erstellt. Dies sorgt für eine bessere Wiederverwendbarkeit des Codes.

  • Nutze Collections: Statt eines Arrays kannst du auch eine Collection verwenden, um die Datensätze zu speichern. Collections bieten den Vorteil, dass sie dynamisch wachsen können und du dir keine Gedanken über die Dimensionierung machen musst.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie du den iCounter zurücksetzen kannst:

Sub BeispielReset()
    Dim iCounter As Integer
    Dim arr() As String
    Dim Zeile As Long

    For Zeile = 1 To 10
        iCounter = 0 ' Reset iCounter

        ' Beispiel-Daten hinzugefügt
        ReDim arr(1 To 1) ' Neues Array für jede Zeile
        arr(1) = "Daten für Zeile " & Zeile

        ' Hier wird das Array verarbeitet
        Debug.Print arr(1)
    Next Zeile
End Sub

Tipps für Profis

  • Verwende die Erase-Anweisung: Um ein Array zu löschen, kannst du Erase arr verwenden. Dies setzt alle Elemente auf ihre Standardwerte zurück und hilft, Speicher zu sparen.

  • Implementiere Fehlerbehandlung: Nutze On Error Resume Next und On Error GoTo 0, um Fehler im Code abzufangen und zu behandeln, ohne den gesamten Ablauf zu unterbrechen.


FAQ: Häufige Fragen

1. Wie kann ich ein Array in VBA resetten?
Verwende die Erase-Anweisung, um das Array zu löschen. Alternativ kannst du das Array neu dimensionieren.

2. Was bedeutet ReDim Preserve?
ReDim Preserve ermöglicht es dir, die Größe eines Arrays zu ändern, ohne die vorhandenen Werte zu verlieren. Beachte jedoch, dass du nur die letzte Dimension des Arrays ändern kannst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige