PDA

Vollständige Version anzeigen : .Cells(Rows.Count, 1).End(xlUp).Row zählt nicht rauf in for next Schleife


Silvan80
09.07.2015, 17:17
Hallo Leute

Mein Kopf raucht gerade und ich komme nicht weiter.
Entweder bin ich zu dumm oder ja, ich bin zu dumm :upps:


Dim Ticker As String
Dim ws As Worksheet
Dim blatt As String
Dim t_Dividende As String
Dim blatt2 As Variant
Dim blatt3 As Variant


Dim rngCells As Range
Dim rngCell As Range
Dim Buchstabe As String
Dim intDay As Integer
Dim intMonth As Integer
Dim intYear As Integer
Dim DateValue As Date
Dim lZeile As Variant

Dim lSpalte As Integer
Dim x As Variant
Dim y As Variant
Dim z As Variant
Dim lDatum As Date
Dim Diff As Long
Dim lZeile2 As Variant
Dim Rating1 As Date
Dim Rating2 As Date
Dim Column As Variant
Dim Column1 As Variant
Dim lZeile3 As Integer


Public Sub Update5()

'Dividendentabelle löschen
Application.DisplayAlerts = False
blatt3 = "Div"
For Each ws In ActiveWorkbook.Worksheets
If ws.Name = blatt3 Then
Sheets(blatt3).Delete
End If
Next
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Div"
'Alle Blätter durchforsten
blatt = ActiveWorkbook.Worksheets.Count

For blatt2 = 1 To blatt

'letzte gebrauchte Kolonne blatt
lZeile = Sheets(blatt2).Cells(10, Columns.Count).End(xlToLeft).Column

'Alle Kolonnen durchforsten
For x = lZeile To 1 Step -1
'Prüfen welche Zeile das Datum enthält
If Sheets(blatt2).Cells(10, x).Value = "Date" And Sheets(blatt2).Cells(11, x + 2).Value <> "" Then
'Prüfen ob Datum älter als heute
If Sheets(blatt2).Cells(11, x).Value < Date Then
'Dividenden Blatt befüllen
lZeile2 = Sheets("Div").Cells(Rows.Count, 1).End(xlUp).Row
Sheets("Div").Cells(lZeile2, 1).Value = Sheets(blatt2).Cells(1, x)
End If
End If
Next x
Next blatt2

End Sub


Eigentlich ganz simpel.
Ich geh durch alle offenen arbeitsmappen (in welchen Aktienkurse enthalten sind) durch und überall wo datum kleiner ist als heute möchte ich die Dividende ins Sheet Div kopieren. Soweit alles klar und eigenltich nicht schwer.
Das Proble ist bei lZeile2 = Sheets("Div").Cells(Rows.Count, 1).End(xlUp).Row, wo er immer weider auf 1 kommt und das obwohl das Blatt Div nach dem ersten Durchlauf etwas in Zelle A1 hat. Also müsste es doch 2 gehen?!?

Sieht per Zufall jmd den Fehler auf die Schnelle?

Danke und Gruss

Silvan

losgehts
09.07.2015, 17:42
Hallo,

das Problem ist folgendes. Mit der CodezeilelZeile2 = Sheets("Div").Cells(Rows.Count, 1).End(xlUp).Row
wird der Variablen Zeile2 1 zugeordnet, wenn in Spalte A keine Eintragungen sind
1 zugeordnet, wenn in Spalte A ausschließlich in der ersten Zeile eine Eintragung ist
1 zugeordnet, wenn Spalte A komplett gefüllt ist (kommt quasi nicht vor)
in allen anderen Fällen die letzte gefüllte Zeile zugeordnet.Das hast du also eigentlich richtig erkannt.

Du kannst das Verhalten auch "mit Hand nachprüfen": es entspricht dem Drücken von [STRG] + [Pfeiltaste nach oben] nachdem man die letzte Zelle der Spalte A selektiert hat.



Lösung könnte sein:lZeile2 = Sheets("Div").Cells(Rows.Count, 1).End(xlUp).Row + 1


Oder um den Fall der komplett leeren Spalte A mit abzudecken:If IsEmpty(Sheets("Div").Cells(1, 1)) Then
lZeile2 = 1
Else
lZeile2 = Sheets("Div").Cells(Rows.Count, 1).End(xlUp).Row + 1
End If


Grüße, Ulrich

PS: ich habe beim Schreiben des Beitrags ausversehen auf "Antworten" statt auf "Vorschau" geklickt. Daher habe ich ihn durch Editieren vervollständigt.

Silvan80
09.07.2015, 18:31
Hallo Ulrich

Vielen Dank für deine prompte Antwort.
Meinst du das im ernst mit: ausschliesslich in der ersten zeile ein eintrag ist?

Was macht den das für einen sinn? Werds nacher ausprobieren, bin grad nicht am pc. Unglaublich dass mir das noch nie aufgefallen ist.

Gruss
Silvan

losgehts
09.07.2015, 18:55
Hallo,

klar meine ich das ernst :cool: :
Mit cells(rows.count,1).end(xlup) findest du die letzte gefüllte Zelle der Spalte A (Ausnahmen siehe oben).
Ist in Spalte A nur die erste gefüllt, ist das auch gleichzeitig die letzte gefüllte Zelle.

Du bist ja auch analog vorgegangen um die letzte benutzte Spalte zu ermitteln:
Sheets(blatt2).Cells(10, Columns.Count).End(xlToLeft).Column


Wenn du es dir mit Abstand noch mal anschaust, dann wird's dir sicherlich wie Schuppen von den Augen fallen. Ansonsten antworte ich auch auf gezielte Verständnisfragen ;) .

Grüße, Ulrich

RPP63neu
09.07.2015, 20:46
Wow!
Wahnsinn!!
26 Variablen!!!
Ich zitiere mal ein Codefragment und übersetze in Alltagssprache:
'Dividendentabelle löschen
Application.DisplayAlerts = False
blatt3 = "Div"
For Each ws In ActiveWorkbook.Worksheets
If ws.Name = blatt3 Then
Sheets(blatt3).Delete
End If
Next
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Div"
1. Application.DisplayAlerts = False
heißt: Schnauze! Ich weiß zwar nicht warum aber ich habe das Sagen!
2. blatt3 = "Div"
Peter, mir ist klar, dass Du Peter heißt, aber ich nenne Dich einfach mal Kurt!
3. For Each ws In ActiveWorkbook.Worksheets
If ws.Name = blatt3 Then
Sheets(blatt3).Delete
End If
Next
Alle in der Klasse werden jetzt nacheinander aufgerufen!
Ich will zwar nur einen sprechen, aber ich finde es toll, wenn ich euch alle mal wieder anquatschen kann.
Macht euch nichts draus, dass ich einen Namen nenne, den ihr eigentlich nicht kennt.
Aber: Peter, Du musst aufpassen wenn Kurt kommt, dann bist Du dran!
Ach ja, Peter ähh Kurt: wenn Du dran bist dann lösche Dich!
Aber sei nicht traurig, denn:
4. Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Div"
Du wirst wiedergeboren!
Du darfst sogar Deinen alten Namen Peter oder Kurt oder ... annehmen!

Ich als Mundfauler hätte jetzt gesagt:
Peter, mach mal neu!
Heißt:
Worksheets("Div").Cells.Delete

Mir ist klar, dass dies Sarkasmus ist, aber - mit Verlaub - so etwas ungelenkes habe ich noch nie gesehen (und das will wahrlich was heißen).

Gruß Ralf

Silvan80
09.07.2015, 22:19
Hallo Ralf

Haha musste lachen, aber du hast recht, deine variante ist schneller ☺️
Der code stammte auch aus einem älteren makro, hab mir dazu gar nicht viel gedanken gemacht! Nur der untere teil ist neu. Aber morgen werde ich gleich deine variante übernehmen.
Wegen den variablen... Da brauch ich tatsächlich einige, weil das nur ein teil ist. Gut vielleicht fallen am ende einge weg, da ich einige überschreiben kann. Vielfach bin ich einfach zu faul die dims und as immer wieder zu schreiben, das kennst du sicher. Ctrl c und v geht schnelker 😆

Grüsse
Silvan