AW: ich bekomms nicht hin
05.09.2006 17:23:22
ingUR
Hallo, Stefan,
aus Deiner neusten Arbeitsmappe ersehe ich, dass Du dasLayout verändert hast. Dies hat natürlich Einfluß auf die im Programm verwedneten Bezugsadressen. Jedoch die variable Zeilenzahl innerhalb der Jahresblöcke, war auch schon vorher berücksichtigt.
Hier der Programmcode mit Äderungen, die infolge der abgewandelten Eingabemaske entstehen und vielen Kommentarzeilen, die Dir vielleicht das Programmgeschehen an den einzelnen Stellen erklären können.
Sub EingabeBereichNachAusgabeBereichKopieren()
Dim wsI As Worksheet, wsA As Worksheet
Dim sJahr As Integer, eJahr As Integer
Dim r0 As Long, r1 As Long
'Hier wird den Objekten Tabellenblättern
'"Eingabe" und "Ausgabe" ein Referenznamne zugewiesen
'danach kann im Gültigkeitsbereich
'für Worksheets(""Eingabe") gleichbedeutend wsI
'als auch Worksheet("Ausgabe") gleichbedeutend wsA verwendet werden.
Set wsI = Worksheets("Eingabe")
Set wsA = Worksheets("Ausgabe")
'Hier wird aus der Zelle B1 der Tabelle "Ausgabe"
'das Startjahr der Variablien "sJahr" zugeweisen
sJahr = wsA.Range("B1")
'Hier wird untersucht, ob das gewählte Startjahr
'nicht vor 2002 liegt (sJahr < 2002)
'oder
'nicht in der Zukunft über dem heutigen Jahr liegt (sJahr>Year(Now))
'Year(Now) liefert die Jahreszahl im heutigen (now) Datum
'*** für Testzwecke kann es ja auch auf das letzte verfügbare Jahr
'in wsI gesetzt werde ****
If sJahr < 2002 Or sJahr > Year(Now) Then
MsgBox "Keine Jahresangabe für die Daten erfaßt sind"
Exit Sub
End If
With wsI
'Es wird die Zeilennummer (Row) in der Spalte wsI.A gesucht,
'in deren Zelle die Zahl steht, die mit der Eingabe sJahr übereinstimmt
r0 = .Columns(1).Find(sJahr, LookIn:=xlValues).Row
'Es wird die Zeilenummer (Row) in der Spalte wsI.A gesucht,
'in deren Zelle die Zahl steht, die um drei größer ist,
'als der Wert der sJahr-Variablen
r1 = .Columns(1).Find(sJahr + 3, LookIn:=xlValues).Row - 1
If r0 > r1 Then
'wurde die Zahl sJahr+3 nicht in Spalte A nicht gefunden,
'dann ist r0 > als r1!
'In diesem Fall ist dei letzte beschriebene Zelle in Spalte A zu suchen
'Durch die Änderung der Ausgangstabelle suchts Du nun jedoch
'in Spalte B (Ordnungsnummer 2 statt 1!)nach der letzten beschriebenen Zelle
r1 = .Cells(.Rows.Count, 2).End(xlUp).Row
Else
'Hier wird nun, nach Layoutänderung, die Zeile in Spalte B,
'siehe Bemerkung zuvor, in der "gesamt" steht, wobei von r1 (Zeile mit Jahreszahl sJahr+3)
'aufwärts fortgeschritten wird, bis der Suchbegriff gefunden ist.
While Not .Cells(r1, 2).Text = "gesamt"
r1 = r1 - 1
Wend
End If
'Hier wird der Bereich, bestehend aus den Zeilen r0 bis r1
'(egal wieviele Zeilen innerhalb eines Jahres beschreiben wurden,
'da ja nach der Zeile in Spalte A gesucht wurde, die dem Bereich des letzen,
'darzustellenden Jahres folgt (sJahr+3!) und von dort die Zeile nach oben ermittelt wurde
'mit dem letzten Eintrag "gesamt")
' und Spalten 1 bis 13 (:= "A" bis "M")
'Eingesetzt wird die Kopie mit Startadresse A8, die Du nun anpassen mußt.
.Range(.Cells(r0, 1), .Cells(r1, 13)).Copy Destination:=wsA.Range("A8")
End With
End Sub
Wenn Du die beiden Tabellen jedoch unterschiedlich formatiert haben möchtest, dann ergeben sich noch weitere Anweisungen, die Dir nicht helfen, dass Programm besser zu verstehen.
Daher empfehle ich, Ein- und Ausgabetabelle vorerst gleich zu formatieren und erst in späteren Arbeitsschritten, wenn die grundlegenden Programmzeilen von ihrer Bedeutung klar sind, dass Formtieren zu versuchen.
Zudem würde die Ausgabetabelle dann eh immer aufs neue zu Formatieren sein - wenn nicht bereits in der Eingabetabelle vorgegeben -, da ja nach Deiner Aufgabenstelleung nicht mit einer fest vorgegeben Zeilenjah je Jahr zu rechnen ist.
Gruß,
Uwe