Microsoft Excel

Herbers Excel/VBA-Archiv

Zeilen werden nicht gelöscht. Warum?

Betrifft: Zeilen werden nicht gelöscht. Warum? von: Ryu_Hoshi
Geschrieben am: 30.08.2004 09:52:23

Guten Morgen! :)

Ich habe einen Macro der u.a. z.B. alle Zeilen in einem workshett löschen soll wo das Jahr von "created date" nicht dieses Jahr ist. Ich habe schon einiges versucht aber es wird einfach nichts gelöscht. Weiss einer woran es liegt? Danke!

P.S. In Kommentaren stehen andere misglückte Versuche

Private Sub But_dieser_Jahr_Click()

Dim i As Long
Dim dtDatum As Date
Dim dtMonat As Integer
Dim dtJahr As Integer
Dim wksE As Excel.Worksheet
Dim xLastRow As Long

Set wksE = ThisWorkbook.Worksheets("excel")
xLastRow = wksE.UsedRange.SpecialCells(xlCellTypeLastCell).Row
dtJahr = 2004
'dtJahr = "2004"


'For i = wksE.Cells(xLastRow, 9) To 2 Step -1
'For i = wksE.Cells("I2") To wksE.Cells("I300")
For i = [I65536].End(xlUp).Row To 2 Step -1
'For i = 2 To 178

'dtDatum = Cells(i, 9)
dtDatum = wksE.Cells(i, 9)


'If Year(dtDatum) <> dtJahr Then
If Format(Year(dtDatum), "yyyy") <> dtJahr Then
'Rows(i, 9).Delete
Rows(i).Delete
End If
Next i


End Sub

  


Betrifft: AW: Zeilen werden nicht gelöscht. Warum? von: Basti
Geschrieben am: 30.08.2004 10:10:03

right(datum, 4) = 2004

so kann man das wohl probieren.
Steht das Datum immer in der gleich Zeile oder immer verschieden?
Wie viel Spalten/Zeilen hat die Tabelle?

Dann kann man dir leichter helfen


  


Betrifft: AW @ Bastis Beitrag von: Ryu_hoshi
Geschrieben am: 30.08.2004 10:21:28

Hallo Basti. Das Datum was entscheident ist steht immer in der gleichen Spalte - der Spalte "I" im Format Date z.B. 17.08.04. DIe Tabelle hat 12 Spalten (A-L) und unterschiedlich viele Zeilen (Die Tabelle wird ständig aktualisiert) deswegen will ich das möglichst so machen das das für jede Tabellengrösse eignet, deswegen auch die Variable xLastRow. Was meintest du mit "right(datum, 4) = 2004" wo sollte ich das einfügen?


  


Betrifft: AW: Zeilen werden nicht gelöscht. Warum? von: Boris
Geschrieben am: 30.08.2004 10:17:06

Hi,

der Hase liegt hier im Pfeffer:
Format(Year(dtDatum), "yyyy") <> dtJahr

Die Format-Funktion liefert dir einen String zurück - und den vergleichst du mit einem Integer-Wert (dtJahr). Das Ergebnis wird immer FALSCH sein.

Lass einfach Format weg:

If Year(dtDatum) <> dtJahr Then...

Grüße Boris


  


Betrifft: AW: Zeilen werden nicht gelöscht. Warum? von: IngoG
Geschrieben am: 30.08.2004 10:33:01

Hallo,

ich nehme mal an, dass Du alle kombinationen deiner auskommentierten Varianten ausprobiert hast...
hast Du im Debugger mal den Wert von YEAR(dtDatum) ausgeben lassen? wenn nämlich stdatum ein String ist wirst Du an dieser stelle gegen die wand laufen.

ansonsten versuchs mal mit:

if Format(dtDatum, "yyyy") <> dtJahr then mit dtjahr="2004"

wenn das nicht zieht stellst Du am besten mal eine kleine Beipieldatei ins netzt...

Gruß Ingo


  


Betrifft: AW: Hier ist die Datei von: Ryu_Hoshi
Geschrieben am: 30.08.2004 10:54:03

So hier ist die Datei. Ich hoffe das hilft weiter.

https://www.herber.de/bbs/user/10284.zip


  


Betrifft: AW: Hier ist die Datei von: Basti
Geschrieben am: 30.08.2004 11:12:32

oki L is Spalte 12

dim i as integer
dim a as integer
i = 1

do while cells(i,12) <> "" 'es müssen alle zeilen gefüllt sein, auch oben am anfang, ansonsten i mit der start zeile.
if righ(cells(i,12),2) <> 04 then
for a = 1 to 12
cells(i,a) = ""
next a
i = i+1
loop

hab das nich ausprobiert, aber ich glaub, aber das mit der for schleife löschen geht net, da muss man ne andere funktion benutztn, aber ka welche, bin net so der excel experte


  


Betrifft: bei mir funzt es so: von: IngoG
Geschrieben am: 30.08.2004 11:47:13

Hallo ???,

hatte ein bischen probleme mit irgendwelchen objekten, die mein rechner nicht kennt, deshalb:

habe mal dein Blatt "excel" und das macro in ein neues Blatt kopiert und die unten angeführten änderungen vorgenommen.

Damit läufts bei mir einwandfrei

Gruß Ingo



Private Sub But_dieser_Jahr_Monat_Click()

Dim i As Long
Dim dtDatum As Date
Dim dtMonat As Integer
Dim dtJahr As Integer
Dim wksE As Excel.Worksheet
Dim xLastRow As Long

Set wksE = ThisWorkbook.Worksheets("excel")
xLastRow = wksE.UsedRange.SpecialCells(xlCellTypeLastCell).Row
dtJahr = 2004


For i = wksE.[I65536].End(xlUp).Row To 2 Step -1

dtDatum = wksE.Cells(i, 9)


If Format(dtDatum, "yyyy") <> dtJahr Then 
' hier year() rausnehmen, da ansonsten das Jahr von 2004 also dem 26.6.1905 
' berechnet wird, und das ist 1905 ;-) 
wksE.Rows(i).Delete   ' hier wksE vorsetzen, damit er im richtigen Blatt löscht
End If
Next i


End Sub



  


Betrifft: AW: @Ingo 'Klappt! von: Ryu_Hoshi
Geschrieben am: 30.08.2004 12:13:22

Hi. Danke es klappt super!


  


Betrifft: Danke für die Rückmeldung oT von: IngoG
Geschrieben am: 30.08.2004 13:05:21

.


  


Betrifft: @ingo gern geschehen! Wofür steht "oT"? von: Ryu_Hoshi
Geschrieben am: 30.08.2004 13:16:06

WOfüR?


  


Betrifft: oT=ohne Text oT ;-) von: IngoG
Geschrieben am: 30.08.2004 13:22:43

.


  


Betrifft: AW: Hier ist die Datei von: Boris
Geschrieben am: 30.08.2004 11:16:10

Hi,

m.E. 2 Fehler.
Den ersten hab ich dir schon beschrieben. Der 2.:

Der Code steht im Klassenmodul der Tabelle "Analyse".
In dem Moment beziehen sich alle Zell-und Bereichsangaben auf das Blatt "Analyse" - es sei denn, es wird explizit ein anderes Blatt referenziert.

Ergo:

For i = [I65536].End(xlUp).Row To 2 Step -1

läuft ohne weitere Angabe durch Spalte I des Blattes "Analyse".

Gleiches gilt für
Rows(i).Delete


Somit setze überall "wksE" davor oder schreibe den Code in ein allgemeines Modul.

Grüße Boris


  


Betrifft: Nachtrag: von: Boris
Geschrieben am: 30.08.2004 11:22:27

oder schreibe den Code in ein allgemeines Modul.

Natürlich muss auch dort zunächst mal das richtige Blatt referenziert werden - am Besten in einem With-Rahmen.

Grüße Boris


  


Betrifft: AW: Hier ist die Datei von: WernerB.
Geschrieben am: 30.08.2004 11:56:04

Hallo RyuHoshi,

wie gefällt Dir das?
Private Sub But_dieser_Jahr_Monat_Click()
Dim wksE As Excel.Worksheet
Dim i As Long
Dim dtJahr As Integer
    Application.ScreenUpdating = False
    Set wksE = ThisWorkbook.Worksheets("excel")
    dtJahr = 2004
    With wksE
      For i = .Cells(Rows.Count, 9).End(xlUp).Row To 2 Step -1
        If Year(wksE.Cells(i, 9)) <> dtJahr Then
          .Rows(i).Delete
        End If
      Next i
    End With
    Set wksE = Nothing
    Application.ScreenUpdating = True
End Sub

Viel Erfolg wünscht
WernerB.

P.S.: Dieses Forum lebt auch von den Rückmeldungen der Fragesteller an die Antworter !


  


Betrifft: AW: Hier ist die Datei von: Boris
Geschrieben am: 30.08.2004 12:09:17

Hi Werner,

wie gefällt Dir das?

Wahrscheinlich gefällt es ihm ausgezeichnet - denn du hast ihm ja die Arbeit abgenommen, die bereits erwähnten Fehler selbst in den Code einbauen zu müssen...

Dieses Forum lebt auch von den Rückmeldungen der Antworter an die Antworter ! ;-)

In diesem Sinne

Grüße Boris


  


Betrifft: @Boris von: Ryu_Hoshi
Geschrieben am: 30.08.2004 12:12:34

Ja da hast du recht. Es gefällt mir prima. Ich weiss noch nicht ob ich den code von ingo oder von werner mitnehmen ich´muss sie erst beide vergleichen. mach ich mal nach der mittagspause. Danke schön an alle und Sorry falls ich was falsch gemacht habe. Ich lerne erst... Bin für Kritik immer offen


  


Betrifft: AW: @Ryu_Hoshi von: Boris
Geschrieben am: 30.08.2004 12:15:59

Hi,

du hast doch gar nix falsch gemacht - insofern brauchst du dich nicht zu entschuldigen.
Stellt sich nur die Frage nach dem Lerneffekt.

Grüße Boris


  


Betrifft: : @Boris von: Ryu_Hoshi
Geschrieben am: 30.08.2004 13:14:18

Ich habe schon häufiger hier geschrieben und und dachte ich nerve die Leute vielleicht.
Ich hatte auch mal kommenatere "crossposting". Ich hatte da in mehreren vba foren dieselbe frage gestellt =Grössere chance das mir geholfen wird. Ist so etwas verboten oder was hatte man (nighty) damit gemeint? Seitdem stelle ich die fragen nur noch in 2 foren. Was daraus lernen werde ich sicherlich. Da ich den code verstehe und so sehe wo der Fehler ist, lerne ich daraus. Dies muss ich dann umsetzten, da ich nicht nur den Zeitraum dieses Jahr untersuche, sondern letztes jahr, letzten monat, quartal usw. Es könnte bei quartal schwierig werden, mal schauen. Wenn ich mit dieser Aufgabe endlich fertig bin, juhu nach über 3 Wochen, dann möchte ich mal auch versuchen den anderen zu helfen, als kleines danke schön :)OK davor hatte ich nie was mit vba an Hut. Ich hab mal in der Schule delphi und java ein Jahr gemacht. Das hatte mir bei vba gut geholfen. Das ist dann wie einere andere SParache lernen. Man merkt die ähnlichkeiten, es ist einfacher da man eine vorstellung hat wie sowas laufen könnte und aknn durch ausprobieren einiges erreichen. Wenn man so sieht dann ahbe ich in diesen 3 Wochen sehr viel gelernt. Bin aber trotzdem noch ein Anfänger :)


  


Betrifft: AW: : @Boris von: Boris
Geschrieben am: 30.08.2004 13:28:33

Hi Ryu_Hoshi,

nochmals: Das war keine Kritik an deiner Person.
Nur fehlt mir das Verständnis dafür, dass Lösungshinweise von anderen Antwortern mustergültig in einen Code gepackt werden, zumal du ja zu diesem Zeitpunkt auf die 2 Hinweise noch gar nicht reagiert hattest nach dem Motto: "Ich hab´s versucht - aber ich krieg´s nicht hin".

Und du schreibst es ja selbst:
...und kann durch ausprobieren einiges erreichen.

So - jetzt aber genug der Worte. ;-)

Grüße Boris


  


Betrifft: AW: @Werner von: Ryu_Hoshi
Geschrieben am: 30.08.2004 12:09:49

Hi!
Danke es klappt prima, genau wie mit dem Code von Ingo, jetzt muss ich die eigentliche Analyse nach diesem Code hinzufügen. Ich war langsam schon am verzweifeln. Aber das war der leichtere Teil, mal schauen ob ich mit dem quartalsweise untersuchen hinkriege. Falls was melde ich mich schon wieder. Ihr Armen habt soviel zu tun in letzter Zeit wegen mir.

"P.S.: Dieses Forum lebt auch von den Rückmeldungen der Fragesteller an die Antworter"<-------Ich bin davon ausgegangen dass es ersichtlich ist dass besher ausser deinem code und von ingo nichts ersichtlich ist. ich sage schon bescheid wenn problem gelöst ist ;) Sorry an alle! Ich gelobe Besserung :)


  


Betrifft: @Werner Wozu diese Zeile? von: Ryu_Hoshi
Geschrieben am: 30.08.2004 13:28:03

Set wksE = Nothing


  


Betrifft: AW: @Werner Wozu diese Zeile? von: WernerB.
Geschrieben am: 30.08.2004 13:39:32

Hallo Ryu_Hoshi,

wenn man eine Set-Anweisung erstellt, so sollte man diese auch wieder aufheben.
Genau dies geschieht mit der Anweisung "Set wksE = Nothing".


Gruß
WernerB.


 

Beiträge aus den Excel-Beispielen zum Thema "Zeilen werden nicht gelöscht. Warum?"