PDA

Vollständige Version anzeigen : aus Tabellenblatt in neues Tabellenblatt kopieren


eneg79
28.08.2017, 14:37
Hallo liebes Forum,

ich benötige einmal wieder die geballte Kompetenz hier.

Problem:
ich habe ein Tabellenblatt "Gas_2017" und möchte dies über einen Command-Button kopieren und in "Gas_2018" umbenennen. Dann soll im neuen Tabellenblatt "Gas_2018" der Bereich B10-B22 gelöscht werden.
Das bekomme ich dank Hilfe hier im Forum hin.

Code:
Private Sub Neu_Click()
ActiveSheet.Select
ActiveSheet.Copy Before:=Sheets(65)
ActiveSheet.Name = "Gas " & Year(Date) + 1
ActiveSheet.Range("B10:B22").Select
Selection.ClearContents
End Sub

Nun soll aber aus dem Original Blatt "Gas_2017" noch der Bereich B18-B22 kopiert werden und im neuen Blatt "Gas_2018" im Beriech B31-B35 eingefügt werden.
Selbst dass würde ich hinbekommen, in dem ich starr die Blätter anspreche.
Ich hätte es aber gern so:
Im Moment bearbeite ich das Blatt "Gas_2017", anfang nächsten Jahres möchte ich dann mein Blatt für 2018 erzeugen und das gleiche wieder in den folgenden Jahren, ohne den Code ständig umschreiben zu müssen um das Vorjahresblatt zum kopieren zu erreichen.

Ich hoffe ich habe mein Problem halbwegs verständlich geschildert.

hary
29.08.2017, 08:47
Moin
Teste mal so.
Dim wksAlt As Worksheet
Set wksAlt = Worksheets("Gas " & Year(Date) - 1)
wksAlt.Copy Before:=Sheets(65)
With ActiveSheet
.Name = "Gas " & Year(Date)
.Range("B18:B22").Copy .Range("B31")
.Range("B10:B22").ClearContents
End With
Set wksAlt = Nothing
Evtl. Pruefung einbauen ob Blatt *Vorjahr* bzw. Batt *neues Jahr* vorhanden ist.
gruss hary

eneg79
29.08.2017, 16:00
Danke für die Antwort Hary.

Dein Code hat bei mir zwar nicht funkioniert,
er hängt sich bei der Zeile
Set wksAlt = Worksheets("Gas " & Year(Date) - 1)
auf.
Trotzdem habe ich mein Problem durch deinen Code lösen können.
Er ist zwar größer geworden aber funktioniert.

Private Sub Neu_Click()
ActiveSheet.Select
ActiveSheet.Copy Before:=Sheets(65) kopiert die alte Jahrestabelle
ActiveSheet.Name = "Gas_" & Year(Date) + 1 benennt sie um in Gas_2018
ActiveSheet.Range("B31:B43").Select
Selection.ClearContents löscht alte Daten
ActiveSheet.Range("B18:B22").Select
Selection.Copy kopiert wichtige Daten
ActiveSheet.Range("B31").Select
ActiveSheet.Paste fügt diese ein
ActiveSheet.Range("B10:B22").Select
Selection.ClearContents löscht alte Daten
End Sub

Dein Ansatz die Daten zum kopieren nicht aus dem alten Blatt, sondern aus dem neu erzeugten, was ja anfangs eine 1:1Kopie ist, zu nehmen, war der entscheidene Tipp.
Könnte man auch selber drauf kommen.

Vielleicht hast du ja eine Idee wie man meinen nun funktionierenden Code vereinfachen kann.
Das mit dem Dim...as... usw. habe ich noch nicht verstanden.
Kannst du mir das vielleicht in normal Deutsch erklären?
Oder jemand anders, ich bin für jedes Wissen offen und bereit.
Vielen Dank.

Silentwolf
29.08.2017, 20:22
Hallo Eneg79,
hary hat Dir ja oben schon den Code in vereinfachter Form gezeigt.
Dim wksAlt as worksheet 'Hier wird eine Objektvariable erstellt vom Typ Worksheet... diese Objektvariable muß mann setten also
Set wksAlt = Worksheet("Gas " & Year(Date)-1

wenn Du hier nur Set wksAlt =.... schreibst ohne Dim wksAlt as worksheet kommt ein Fehler weil eben keine Objektvariable deklariert wurde.

Select brauchst Du auch nicht also nicht das ist überflüssig.
Und mit der With ActiveSheet Konstruktion vereinfachst Du Deinen Code nochmal da Du nur einmal diese schreiben mußt und nicht wie Du in Deinem Code jede Zeile mit ActiveSheet....beginnen mußt.

HOffe es halbwegs erklärt zu haben .. Aber das ist ja eh alles schon im Code von hary enthalten brauchst ja nur nochmal genau ansehen.

mfg
Silentwolf

hary
30.08.2017, 06:33
Moin
Zusaetzlich zur Erklaerung von Silentwolf
Set wksAlt = Worksheets("Gas " & Year(Date) - 1)
Year(Date) - 1 heisst, das jetzige Jahr minus 1 also 2016
Evtl hast du kein Blatt mit dem Namen "Gas 2016"
Deine Vorgabe war ja:
anfang nächsten Jahres möchte ich
Zum testen ging ich davon aus das du ein Blatt "Gas 2016" in der Mappe hast bzw. du hast zum testen das Systemdatum auf 2018 gestellt.

Wenn du erst jetzt(2017) mit der Mappe anfaengst laeuft der Code in den Fehler. Ohne Datumsumstellung funzt der Code erst 2018.
Solltest du jetzt nur Blatt "Gas 2017" haben, benenn es mal um in "Gas 2016"
gruss hary

eneg79
30.08.2017, 15:45
Danke Hary und Silentwolf,

ich habe den Code von Hary jetzt noch mal probiert und mein Arbeitsblatt auf "Gas 2016" umbenannt.
Tatsächlich läuft der Code jetzt weiter, aber nur bis zur nächsten Zeile.
Jetzt hängt er sich bei: wksAlt.Copy Before:=Sheets(65) auf.

Auch mit der Vereinfarung von Harys Code habe ich mich befasst und glaube das fast verstanden zu haben.
Ich übersetze das mal so:

Dim wksAlt As Worksheet --> dimensioniere wksAlt als Arbeitsblatt (wobei man wksAlt wilkürlich nehmen kann, man könnte es auch wks16 nennen
Set wksAlt = Worksheets("Gas " & Year(Date) - 1) --> leg fest wksAlt trägt den Namen Gas (aktuelles Jahr -1)
wksAlt.Copy Before:=Sheets(65) --> kopiere wksAlt ("Before:=Sheets(65)" wofur steht das?)
With ActiveSheet --> with-Schleife beginnt, das aktive Blatt ist die erzeugte Kopie
.Name = "Gas " & Year(Date) --> gibt der Kopie den Namen Gas (aktuelles Jahr)
.Range("B18:B22").Copy .Range("B31")
.Range("B10:B22").ClearContents
End With --> Ende der Schleife
Set wksAlt = Nothing --> ??? keine Ahnung

Vielen Dank euch beiden. Ich finde diese VB/VBA Welt echt interessant, aber es ist schwer sich da reinzufuxen. Ohne ein solches Forum hätte ich keine Chance und ohne Leute wie euch hätte das Forum keine Chance.

Ein dickes Dankeschön.

Gruß eneg

PS: ein neues Problem in meinem Programm tut sich schon auf, aber dazu später, ich versuche es erstmal selber. Auch hier werdet ihr eine Lösung parat haben.

aloys78
30.08.2017, 16:16
Hallo eneg,
Jetzt hängt er sich bei: wksAlt.Copy Before:=Sheets(65) auf.
Wie lautet denn die Fehlermeldung ?
Meinst Du denn das Worksheet mit dem Namen 65 oder das 65. Sheet ?

Gruß
Aloys

hary
30.08.2017, 17:04
wksAlt.Copy Before:=Sheets(65)*-oin
Schreibe vom Handy.
Das hier kam aus deinem ersten Beitrag.
Sheets(65)
So wie es aussieht hast du keine 65 Blaetter.
Mach es mal so, so kommt das neue Blatt an das Ende.
wksAlt.Copy After:=Sheets(Worksheets.count)
Gruss hary