Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1628to1632
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

Code funktioniert nur im Einzelschritt korrekt

Code funktioniert nur im Einzelschritt korrekt
19.06.2018 22:31:03
EasyD
Hallo Leute
wer kann mir mit meinem Problem mal wieder die Augen öffnen?
Ich importiere csv-Daten auf ein Blatt (Roh_DB) und möchte diese importierten Daten dann auf ein anderes Blatt kopieren. Genauer gesagt geht es hier um Bankumsätze aus dem Online-Banking. Das Ganze für 2 unterschiedliche Konten, ich muss daher entscheiden welche Daten ich gerade importiert habe und abhängig davon auf welches Blatt ich dann kopiere (DB_00 oder DB_05).
Das Kopieren soll unter der Voraussetzung laufen, dass ich NICHT ALLE importierten Daten kopiere, sondern nur ab der Zeile die das nächst höhere Datum als aus dem letzten Kopiervorgang aufweist (ich mache das importieren und kopieren immer wieder und ergänze so sukzessive die Daten).
Damit ich weiß ab welchem Datum ich kopieren muss, errechne ich in den Zellen V1 bzw V2 aus den zuvor importierten csv-Datum das entsprechende Datum (variable datum_DB), die andere Variable ist das letzte Datum aus dem letzten Import (datum_maxDB).
Der Import läuft in einem anderen Code, der Code unten betrifft nur das Kopieren.
Sub copy_DB()
Dim zelles As Range
Dim bereichs As Range
Dim datum_DB As Date
Dim datum_maxDB As Date
If Sheets("Roh_DB").Range("T2").Value = "DB05 ausgewählt" Then
datum_DB = Sheets("Roh_DB").Range("V1").Value 'Startdatum_DB für das kopieren der DB05
datum_maxDB = Sheets("Roh_DB").Range("X1").Value 'MaxDatum für die MsgBox
Else
datum_DB = Sheets("Roh_DB").Range("V2").Value 'Startdatum_DB für das kopieren der DB00
datum_maxDB = Sheets("Roh_DB").Range("X2").Value 'MaxDatum für die MsgBox
End If
Set bereichs = Sheets("Roh_DB").Range("A:A")
Set zelles = bereichs.Find(what:=datum_DB, lookat:=xlWhole, LookIn:=xlValues)
Sheets("Roh_DB").Activate
'zuerst nach datum_DB sortieren
With ActiveWorkbook.Worksheets("Roh_DB").Sort
.SetRange Range("A1:R10000")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Wenn das letzte importierte datum_DB in den Rohdaten nicht gefunden wird:
If zelles Is Nothing Then
MsgBox "Fehler! Die csv-Daten aus dem Online-Banking müssen die Umsätze ab dem " & datum_DB & "  _
enthalten!", vbOKOnly, "csv-Daten prüfen!"
Exit Sub
Else
If zelles >= datum_DB Then '= Zelle in Spalte A auf dem Blatt Roh_DB mit dem nächst höhren  _
Datum
'ab dort kopieren
Range(Cells(zelles.Row, 1), Cells(zelles.Row, 18)).Select
Range(Selection, Selection.End(xlDown)).Copy
If Sheets("Roh_DB").Range("T2").Value = "DB05 ausgewählt" Then
'und auf dem jeweiligen Blatt einfügen
Sheets("DB_05").Range("A1048576").End(xlUp).Offset(1, 0).PasteSpecial Paste:= _
xlValues
Else
Sheets("DB_00").Range("A1048576").End(xlUp).Offset(1, 0).PasteSpecial Paste:= _
xlValues
End If
Application.CutCopyMode = False 'Zwischenspeicher löschen
Else
MsgBox "Fehler! In den csv-Daten aus dem Online-Banking ist kein Umsatz nach dem " &  _
datum_maxDB & " enthalten!", vbOKOnly, "csv-Daten prüfen!" 'xxxxxxxxxxxx hier hakt es xxxxxxxxxxxx
End If
End If
Sheets("Roh_DB").Range("A2:R1048576").ClearContents
End Sub
Das Problem - ich werde immer in diese MsgBox geleitet, obwohl die Daten genau die Voraussetzungen erfüllen wie ich Sie brauche. Ich erwarte also, dass die If Bedingung erfüllt ist, dass entsprechend der Kopiervorgang los geht und ich eben nicht in das "Else" rein komme.
Und um es noch merkwürdiger zu machen - im Einzelschritt läuft der Code prima und wie gewollt durch, nur die gesamte Prozedur hängt an der MsgBox.
Wer kann das Brett vor meinem Kopf entfernen?
Ist "zelles >= datum_DB" das Problem? Wenn ja, warum geht es im Einzelschritt?
Ich bin verwirrt......
Ich würde die Mappe auch hochladen, aber meinen Kontostand möchte ich ungern ins Netz laden ;)
Achja... PowerQuery ist leider keine Option....
Dank euch!

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code funktioniert nur im Einzelschritt korrekt
20.06.2018 07:07:44
fcs
Hallo EasyD,
ich hab mal versucht das Makro im Blindflug umzuschreiben, so dass der zu kopierende Bereich nicht mit Select und Selection festgelegt wird.
Außerdem
- ist die Sortierfunktion unvollständig definiert (kann Probleme machen)
- Die Suche nach dem Datum datum_DB muss nach dem Sortieren erfolgen.
Ohne Testdaten ist hier aber die Fehlersuche schwierig.
Da es für die Funktion des Makros nur auf die Datumswerte in Spalte A ankommt kannst du in einer Kopie deiner Datei alle persönlichen Daten in den Spalten B bis R durch Dummy-Daten ersetzen.
Gruß
Franz
Sub copy_DB()
Dim zelles As Range
Dim bereichs As Range
Dim datum_DB As Date
Dim datum_maxDB As Date
Dim wksRoh As Worksheet, wks00 As Worksheet, wks05 As Worksheet
Set wksRoh = ActiveWorkbook.Sheets("Roh_DB")
Set wks00 = ActiveWorkbook.Sheets("DB_00")
Set wks05 = ActiveWorkbook.Sheets("DB_05")
With wksRoh
If .Range("T2").Value = "DB05 ausgewählt" Then
datum_DB = .Range("V1").Value 'Startdatum_DB für das kopieren der DB05
datum_maxDB = .Range("X1").Value 'MaxDatum für die MsgBox
Else
datum_DB = .Range("V2").Value 'Startdatum_DB für das kopieren der DB00
datum_maxDB = .Range("X2").Value 'MaxDatum für die MsgBox
End If
.Activate
'zuerst nach datum_DB sortieren
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range("A1"), SortOn:=xlSortOnValues, _
Order:=xlAscending
With .Sort
.SetRange wksRoh.Range("A1:R10000")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Set bereichs = .Range("A:A")
Set zelles = bereichs.Find(what:=datum_DB, lookat:=xlWhole, LookIn:=xlValues)
'Wenn das letzte importierte datum_DB in den Rohdaten nicht gefunden wird:
If zelles Is Nothing Then
MsgBox "Fehler! Die csv-Daten aus dem Online-Banking müssen die " _
& "Umsätze ab dem " & datum_DB & " enthalten!", _
vbOKOnly, "csv-Daten prüfen!"
Exit Sub
Else
If zelles >= datum_DB Then '= Zelle in Spalte A auf dem Blatt Roh_DB mit _
dem nächst höhren  Datum
'ab dort kopieren
.Range(.Cells(zelles.Row, 1), _
.Cells(.Rows.Count, 1).End(xlUp).Offset(0, 17)).Copy
If .Range("T2").Value = "DB05 ausgewählt" Then
'und auf dem jeweiligen Blatt einfügen
wks05.Range("A1048576").End(xlUp).Offset(1, 0).PasteSpecial _
Paste:=xlValues
Else
wks00.Range("A1048576").End(xlUp).Offset(1, 0).PasteSpecial _
Paste:=xlValues
End If
Application.CutCopyMode = False 'Zwischenspeicher löschen
Else
MsgBox "Fehler! In den csv-Daten aus dem Online-Banking ist kein Umsatz " _
& "nach dem " & datum_maxDB & " enthalten!", _
vbOKOnly, "csv-Daten prüfen!" 'xxxxxxxxxxxx hier hakt es xxxxxxxxxxxx
End If
End If
.Range("A2:R1048576").ClearContents
End With
End Sub

Anzeige
AW: Code funktioniert nur im Einzelschritt korrekt
20.06.2018 10:53:23
EasyD
Hey Franz
"Blindflug" - hast du schön gesagt ;)
Das einzig und allein Spalte A von Relevanz ist, war mir natürlich klar. Ich bin aber nicht auf die Idee gekommen die anderen Spalten einfach mal durch Müll zu erstzen damit ich Dir die Mappe hochladen kann.
Ich werde mal ausprobieren was du da bewerkstelligt hast und melde mich wieder. Im Moment geht nicht, bin auf Arbeit.
Vorab zum Verständnis die Fragen:
1.
"so dass der zu kopierende Bereich nicht mit Select und Selection festgelegt wird."
Das Select den Code bremst, ist klar. Aber einen anderen Unterschied in Sachen Ursache/Wirkung erkenne ich nicht wenn ich deine Lösung anwende. Ich werd's evtl heute abend erkennen...
2.
"ist die Sortierfunktion unvollständig definiert (kann Probleme machen)"
bzw.
"Die Suche nach dem Datum datum_DB muss nach dem Sortieren erfolgen."
Sehe ich das richtig, dass Du die Sortierfunktion erstmal aufräumst ("Clear") und dann neu festlegst ("Spalte A")? Könnte das Probleme machen, wenn ich vorher evtl schon was anderes sortiert habe? Wenn das so ist, dann wittere ich genau da den Fehler! Ich habe nämlich noch nicht ernsthaft kontrolliert ob das Sortieren ordnungsgemäß funktioniert hat. Könnte deshalb auch die Ursache dafür sein, dass er das gesuchte Datum nicht findet...
Und noch eine ganz allgemeine Frage:
Was ist der Vorteil daran, die Arbeitsblätter mit wsRoh,... fest zu legen? Ich finde es immer etwas übersichtlicher wenn ich direkt im Code sehe auf welchem Blatt ich gerade rum fuhrwerke (auch wenn die Codezeilen dadurch natürlich länger werden).
Ich dank Dir erstmal ganz dolle, Rückmeldung später!
Gruß
Anzeige
AW: Code funktioniert nur im Einzelschritt korrekt
20.06.2018 12:50:12
EasyD
Hey Franz
da fiel mir gerade ein dass ich die Datei in meiner Dropbox hatte. Ich konnte es also doch gleich ausprobieren und wollte nicht abwarten.
Läuft wie Bolle!
Mir ist halt nur noch nicht ganz klar was jetzt tatsächlich mein Fehler war. Offensichtlich das grundsätzliche Problem - erst sortieren, dann suchen.
Beste Grüße und Vielen Dank!

286 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige