Antworten auf Deine Fragen und Code-Update
28.07.2010 12:42:46
NoNet
Hallo Maik,
schön, dass das Makro wunschgemäß funktioniert :-) - das war auch beabsichtigt ;-))
Zu Deinen Fragen :
1.) Application.CountIf(...) entspricht der Tabellenblatt-Funktion ZÄHLENWENN(...) und prüft, ob der Artikel aus dem AKTUELLEN Jahr (2010) im VORJAHR (2009) bereits in der Liste enthalten war. falls ja, wird der Preis aktualisiert, falls nicht, wird die Zeile im Vorjahr unten angehängt.
2.) Mit wsVorjahr.Columns(1).Find(..., lookat:=xlWhole).Row wird die entsprechende Zeilennr. ermittelt, aus der der Preis übertragen werden soll. Der Zusatz lookAt:=xlWhole bewirkt, dass der komplette Zellinhalt verglichen wird und verhindert, dass z.B. bei Artikelnr. 0815 in der anderen Liste 0815xy als "passend" gefunden wird, da dieser ja auch mit 0815 beginnt. Es muss also immer der GESAMTE (engl.: Whole) Inhalt übereinstimmen !
3.) Bei mehrfach vorkommenden Inhalten im Vorjahr funktioniert das Makro so nicht, hier muss man zusätzlich noch genau anders herum suchen : Alle Artikel aus 2009 müssen mit 2010 verglichen werden. hier der ergänzte Code :
Sub PreiseUpdaten()
Dim wsAktuell As Worksheet, wsVorjahr As Worksheet
Dim lngZ As Long, lngZ2 As Long
Set wsAktuell = Sheets("2010") 'Name des Blattes mit AKTUELLEN Preisen
Set wsVorjahr = Sheets("2009") 'Name des Blattes in das hinein kopiert wird
'Alle Zeilen ab Zeile 2, da Zeile 1 Überschrift ist
For lngZ = 2 To wsAktuell.Cells(Rows.Count, 1).End(xlUp).Row
lngZ2 = wsVorjahr.Cells(Rows.Count, 1).End(xlUp).Row
'Prüfen, ob Artikel aus AKTUELLEM Jahr bereits in Vorjahresliste enthalten war :
If Application.CountIf(wsVorjahr.Columns(1), wsAktuell.Cells(lngZ, 1)) > 0 Then
lngZ2 = wsVorjahr.Columns(1).Find(wsAktuell.Cells(lngZ, 1), lookat:=xlWhole).Row
'Falls Artikel bereits im Vorjahr enthalten war :
wsVorjahr.Cells(lngZ2, 2) = wsAktuell.Cells(lngZ, 2) 'Preis ersetzen
Else
'Falls Artikel im Vorjahr noch NICHT enthalten war :
wsAktuell.Rows(lngZ).Copy wsVorjahr.Cells(lngZ2 + 1, 1) 'Zeile unten anfügen
End If
Next
'Ergänzung : Suche alle Artikel aus 2009 in 2010,
'um mehrfach enthaltene Artikel zu aktualisieren
'Alle Zeilen ab Zeile 2, da Zeile 1 Überschrift ist
For lngZ = 2 To wsVorjahr.Cells(Rows.Count, 1).End(xlUp).Row
lngZ2 = wsAktuell.Cells(Rows.Count, 1).End(xlUp).Row
'Alle Artikel aus Vorjahresliste in AKTUELLER Liste suchen :
If Application.CountIf(wsAktuell.Columns(1), wsVorjahr.Cells(lngZ, 1)) > 0 Then
lngZ2 = wsAktuell.Columns(1).Find(wsVorjahr.Cells(lngZ, 1), lookat:=xlWhole).Row
'Falls Artikel bereits im Vorjahr enthalten war :
wsVorjahr.Cells(lngZ, 2) = wsAktuell.Cells(lngZ2, 2) 'Preis ersetzen
End If
Next
End Sub
Gruß, NoNet