Blatt im Hintergrund kopieren

Hallo ihr lieben,

ich habe ein Problem unter Excel 2002.
Ich habe zwei Dateien (Datei1 und Datei2). In Datei1 wird nur eine UserForm laufen über die die Nutzer Daten aus Datei2 auslesen können bzw. einspeichern können. Datei2 kommt also nur im Hintergrund zum Einsatz und wird von den Nutzern nie direkt gesehen oder geändert.

Die Daten werden immer jahresweise bearbeitet. D.h. ich habe in Datei2 für jedes Jahr ein eigenes Tabellenblatt (immer derselbe Aufbau) und je nach dem welches Jahr der Nutzer in der UserForm ausgewählt hat werden die Daten auf das entsprechende Blatt eingetragen / ausgelesen.
Da ich die Datei nicht für alle Zeit schon vorbereiten kann heißt dies, dass für die letzten drei Jahre und die nächsten 2 Jahre immer entsprechende Blätter vorhanden sein müssen. Sobald ein neues Jahr hinzukommen soll (oder die Dateien erstmalig benutzt werden) soll ein Verantwortlicher (über eine weitere UserForm) neue Jahre (Tabellenblätter) hinzufügen (erzeugen) können.
Dazu braucht er nur das Jahr auswählen, welches er jetzt neu haben möchte, eine Schaltfläche klicken und über diese Schaltfläche soll per Code dann in Datei2 ein neues Tabellenblatt erstellt werden.
Da die Tabellenblätter vom Aufbau alle genauso aussehen habe ich mir überlegt dass es eigentlich einfach wäre wenn ein Muster-Tabellenblatt vorhanden ist und dieses Blatt nur kopiert wird, hinten angefügt (oder wie auch immer; das ist nicht wichtig) und als Namen das entsprechende Jahr erhalten soll.
Soweit zur Theorie. In der Praxis bringt das Programm jedoch nicht die besten Ergebnisse :wink:

txtJahr.Text enthält das hinzufügende Jahr.

Sub Schaltfläche\_Click()
Dim wb As Workbook, vorhanden As Boolean

Pfad = "G:\Arbeit\"
Datei = "Anschreibeliste.xlsx"

Set wb = GetObject(Pfad & Datei)

'überprüft, ob Tabellenblatt schon vorhanden ist
For Each ws In wb.Worksheets
 If ws.Name = txtJahr.Text Then
 vorhanden = True
 End If
Next

If vorhanden = False Then
 wb.Sheets("Original").Copy After:=Worksheets(1)
 wb.Sheets(wb.Sheets.Count).Name = txtJahr.Text
End If

wb.Close SaveChanges:=True
End Sub

Nun passiert folgendes: bis zum „if vorhanden = False“ funktioniert erst einmal alles. Mit der Copy-Zeile kopiert er zwar das Tabellenblatt, fügt es aber in Datei 1 ein und nicht in Datei2 (wo es hin soll).
Jetzt dachte ich mir: halt, bei „After:=“ fehlt noch das „wb“ für Datei2. Wenn ich jetzt den Code laufen lasse kommt bereits hier eine Fehlermeldung (Laufzeitfehler 1004: Die Copy-Methode des Worksheets-Objekts konnte nicht ausgeführt werden").

Wo habe ich hier einen (Denk-)Fehler?

LG Tobi@s

Moin Tobi@s,

du hast XL 2002 und dieses Kompitabilitätspaket?

Wäre anstatt
wb.Sheets(„Original“).Copy After:=Worksheets(1)
nicht
wb.Sheets(„Original“).Copy After:=Worksheets(Worksheets.count)
sinnvoller?

Und zum wb, ich würde eine With wb -Schleife um alles einbauen.
Dann lautet das so:
.Sheets(„Original“).Copy After:=.Worksheets(.Worksheets.count)

Wenn dann dein Code auf den Fehler läuft den du beschreibst so
sieht mn ja Anschreibeliste.xlsx im Projekt-Explorer des VB_editors.
Frage: Kannst du dir sie in Excel ansehen?

Bei meiner Test-xls geht das nicht.
Selbst nach Rechnerneustart, dann Excelstart ist sie nicht mehr zu
öffnen aus Excel heraus obwohl sie in der Liste der zuletzt
geöffneten Dateien steht. Nach einam Klick auf ihren namen tut sich
einfach nix. K.A. ob die datei einen Schuß weg hat.
Alle anderen dateien der Liste gehen problemlos zu öffnen.

So oder so, Getobject() habe ich in deiner Form noch nie benutzt.
Wenn öffne ich damit Office-Instanzen von Excel, Word usw.
Wirf das mal raus und öffne klassisch.
Also erst eine Schleife über alle workbooks ob die datei schon offen
ist, wenn nicht mit .open öffnen.

PS: benutze bitte immer Option Explicit

Gruß
Reinhard

Moin Tobi@s,

du hast XL 2002 und dieses Kompitabilitätspaket?

keine Ahnung. Ist auf Arbeit und etwas angepasst :smile:

Wäre anstatt
wb.Sheets(„Original“).Copy After:=Worksheets(1)
nicht
wb.Sheets(„Original“).Copy After:=Worksheets(Worksheets.count)
sinnvoller?

Und zum wb, ich würde eine With wb -Schleife um alles
einbauen.
Dann lautet das so:
.Sheets(„Original“).Copy After:=.Worksheets(.Worksheets.count)

Habe alle Möglichkeiten probiert. Leider funktioniert nix davon, egal ob mit Schleife, ohne Schleife, „After“ bzw. „Before“ :frowning:
Kurios ist: wenn ich das „After“ weglasse dann kopiert er mir die Tabelle (in eine neue Datei) problemlos.

Wenn dann dein Code auf den Fehler läuft den du beschreibst so
sieht mn ja Anschreibeliste.xlsx im Projekt-Explorer des
VB_editors.
Frage: Kannst du dir sie in Excel ansehen?

Bei meiner Test-xls geht das nicht.
Selbst nach Rechnerneustart, dann Excelstart ist sie nicht
mehr zu
öffnen aus Excel heraus obwohl sie in der Liste der zuletzt
geöffneten Dateien steht. Nach einam Klick auf ihren namen tut
sich
einfach nix. K.A. ob die datei einen Schuß weg hat.
Alle anderen dateien der Liste gehen problemlos zu öffnen.

Das Problem habe ich hier auch *g*. Woran es liegt? keine Ahnung. Wenn ich die Datei zu Haus öffne (Excel 2010) kann ich die Datei (bzw. beide) über den Reiter „Ansicht“ und dort „Einblenden“ wieder sichtbar machen. Hier klappt es jedoch leider nicht :frowning:
Aber man würde ja, wenn er das Blatt korrekt kopiert hat das an der fehlenden Fehlermeldung und an den in VBA vorhandenen Excel-Objekten erkennen :smile:

So oder so, Getobject() habe ich in deiner Form noch nie
benutzt.
Wenn öffne ich damit Office-Instanzen von Excel, Word usw.
Wirf das mal raus und öffne klassisch.
Also erst eine Schleife über alle workbooks ob die datei schon
offen
ist, wenn nicht mit .open öffnen.

hab ich geändert. Öffnet und schließt sich auch ohne Probleme :wink:
Aber das kopieren wird dadurch leider nicht beeinflusst :frowning:

PS: benutze bitte immer Option Explicit

ich geb mir Mühe :wink:

LG Tobi@s

Hallo Tobi@s,

du hast XL 2002 und dieses Kompitabilitätspaket?

keine Ahnung. Ist auf Arbeit und etwas angepasst :smile:

muß wohl so sein, im Code taucht xlsm auf, das kennt XL 2002 normal
nicht.

Kurios ist: wenn ich das „After“ weglasse dann kopiert er mir
die Tabelle (in eine neue Datei) problemlos.

das ist nicht kurios. Wenn nach .Cpoy nix steht geschieht das so.

Wenn ich die Datei zu Haus öffne (Excel 2010) kann ich
die Datei (bzw. beide) über den Reiter „Ansicht“ und dort
„Einblenden“ wieder sichtbar machen. Hier klappt es jedoch
leider nicht :frowning:

Okay, in XL 2007 habe ich es noch nicht getestet. Ist mir aber auch
wurscht :smile:
Ich für mich möchte erst mal für mich wissen warum eine vorher
garantiert intakte xls nach "deiner " Art der Benutzung von
Getobject() jetzt die Macke hat in Excel nicht mehr sichtbar zu
werden.

Die eine Seele in mir sagt, es MUß daran liegen, die andere sagt,
Kwark, ist absurd, war/ist absurd, Zufall.

Aber man würde ja, wenn er das Blatt korrekt kopiert hat das
an der fehlenden Fehlermeldung und an den in VBA vorhandenen
Excel-Objekten erkennen :smile:

? dann hättest du ja nicht angefragt :smile: Es wurde hja grad nicht
kopiert und es kam eine Fehlermeldung.
Und Fehler 1004 kann ich mir auch so deuten, Excel/Vba will etwas
tun aber es schaffst das nicht weil irgendwas nicht stimmt.

Auf diesen Punkt will ich ja die ganze Zeit schon hinweisen,
diese datei da die mit GetObject() im Projectexplorer des Editors
erscheint ist evtl. nur da „sichtbar“.
Aber beim Kopierversuch ist sie für Excel/Vba genauso unsichtbar
wie für uns beide wenn wir sie ansehen wollen.

Im Taskmanager läuft zu dem Zeitpunkt auch keine zweite Excelinstanz.
Bin noch ratlos.

Wirf das mal raus und öffne klassisch.
Also erst eine Schleife über alle workbooks ob die datei schon
offen ist, wenn nicht mit .open öffnen.

hab ich geändert. Öffnet und schließt sich auch ohne Probleme
:wink: Aber das kopieren wird dadurch leider nicht beeinflusst :frowning:

Wo ist der Code?

PS: benutze bitte immer Option Explicit

ich geb mir Mühe :wink:

Mannomann bist du stur *gg*
Du erinnerst mich an mich als mir auch Andere Option Expicit ans
Herz legten.
Ich sah auch lange Zeit nicht ein warum ich da den Aufwand mit Dim
betreiben sollte.

Du bist frei, mach was de willst, vllt. denkst du irgendwann mal um
wie ich, zugegeben erst durch ein Ereignis.
Ewig lange erfolglose Fehlersuche in einem 30-Zeilen Code von mir.
Mein fehler war daß ich eine Variable Letzte eingesetzt hatte und
mich weiter unten im Code auf eine variable Letze bezog.

Ich schöre dir, das siehst du nicht. Ich habe alles andere überprüft u.v.m.

PS: da ich nachtragender Skorpion bin ist dieser Variablenname
seitdem für mich eh tabu :smile:

Also zeig bitte mal den Code wo du klassisch öffnest.
Achja, teste ihn mal vorher an einer beliebigen anderen Mappe,
nicht an der wo dein alter Code schon mal zugriff um da bestimmtn
Einfluß auszuschließen.

Gruß
Reinhard

Hallo Reinhard,

muß wohl so sein, im Code taucht xlsm auf, das kennt XL 2002
normal nicht.

Test bestanden; hast den Fehler gefunden :wink: Ne, vergessen: die haben vor einiger Zeit „2007“ installiert …

Kurios ist: wenn ich das „After“ weglasse dann kopiert er mir
die Tabelle (in eine neue Datei) problemlos.

das ist nicht kurios. Wenn nach .Copy nix steht geschieht das
so.

mir ging es darum dass der Fehler nicht am „.Copy“ liegen kann, denn dass funktioniert ja. Aber soll es am „After/Before“ liegen?

Ich für mich möchte erst mal für mich wissen warum eine vorher
garantiert intakte xls nach "deiner " Art der Benutzung von
Getobject() jetzt die Macke hat in Excel nicht mehr sichtbar
zu werden.

Auf diesen Punkt will ich ja die ganze Zeit schon hinweisen,
diese datei da die mit GetObject() im Projectexplorer des
Editors erscheint ist evtl. nur da „sichtbar“.
Aber beim Kopierversuch ist sie für Excel/Vba genauso
unsichtbar wie für uns beide wenn wir sie ansehen wollen.

Im Taskmanager läuft zu dem Zeitpunkt auch keine zweite
Excelinstanz.
Bin noch ratlos.

Wirf das mal raus und öffne klassisch.
Also erst eine Schleife über alle workbooks ob die datei schon
offen ist, wenn nicht mit .open öffnen.

werde diese Woche mal eine neue Datei anlegen und alles über „.Open“ erledigen. Sobald ich neues weiß gebe ich hier Bescheid oder melde weiter den Fehler :smile:

Mannomann bist du stur *gg*
Du erinnerst mich an mich als mir auch Andere Option Expicit
ans Herz legten.
Ich sah auch lange Zeit nicht ein warum ich da den Aufwand mit
Dim betreiben sollte.

Mein fehler war daß ich eine Variable Letzte eingesetzt hatte
und mich weiter unten im Code auf eine variable Letze bezog.

Ich schöre dir, das siehst du nicht. Ich habe alles andere
überprüft u.v.m.

keine Sorge. Ich kenne das Problem mit dem Schreibfehler :smile: Aber oft (wenn ich mal was programmiere; ist selten geworden) will ich erst mal die Gedanken „aufzeichnen“ und dann kommt der Feinschliff.

LG Tobi@s

Hallo Reinhard,

Wenn öffne ich damit Office-Instanzen von Excel, Word usw.
Wirf das mal raus und öffne klassisch.
Also erst eine Schleife über alle workbooks ob die datei schon
offen

jawoll. Das Problem lag beim „GetObject“. Mit „Open“ lässt sich alles zu meiner Zufriedenheit lösen.

Danke
Tobi@s