VBA Problem bei Kopie eines gesamten versteckten Arbeitsblatts (incl. Code)

21/06/2010 - 21:35 von Andreas Eibach | Report spam
Hi,

da es leider nicht so ohne weiteres möglich ist, mit Sheets.Add code-seitig
ein neues Arbeitsblatt zu erzeugen, dass z. B. schon
DoubleClick-Handling-Code drin hat, bleibt mir hier nur der Weg über ein
vorgefertigtes Template, dessen Kopie dann das neue Sheet darstellt.

TMPL ist versteckt. Allerdings nur Hidden, nicht VeryHidden, weil ich sonst
oft einen Error 400 bekomme...,muss ich aber nicht verstehen, dann muss es
eben das simple "Hidden" tun.

Hier ist mein noch recht hakeliger Code (aber na schön, so làuft's erstmal)

Sheets("TMPL").Copy Before:=Sheets("Xyz")

' jetzt hat das temporàre kopierte Sheet den internen Namen "TMPL (2)"

Sheets("TMPL (2)").Visible = True ' sichtbar machen, denn sonst kann ich
nicht aktivieren
Sheets("TMPL (2)").Name = "Neu"
Sheets("Neu").Activate

Das geht doch sicher auch eleganter, oder??

Meine Probleme hier sind/waren:

- die Namensgebung des erzeugten Sheets gestaltet sich schwierig, da ich
beim Kopieren leider nicht sagen kann, wie das neue Sheet heißen soll
(für die ganz Schlauen, die meinen, man könne da einfach
Destination:="GanzNeuesSheet" machen, noch der Hinweis, dass das so _nicht_
geht! Das ist kein PHP! =D Excel meldet hier gnadenlos "Index out of range",
also will das Sheet vorher explizit erzeugt wissen; Copy() kann kein
"On-The-Fly-Create")

- ActiveSheet.* funktioniert für unsichtbare Sheets NICHT; bei
ActiveSheet.Name = "Neu" hat mir Excel gnadenlos mein vorher erzeugtes "Xyz"
umbenannt.
Auch ein vorheriges Activate oder Select macht meine erzeugte
"Template-Kopie" nicht zum ActiveSheet.

Wie geh ich da am besten ran? (v. a. so dass ich kein Rename auf interne
Namen machen muss)

-Andreas
 

Lesen sie die antworten

#1 Thomas Ramel
22/06/2010 - 06:32 | Warnen spam
Grüezi Andreas

Andreas Eibach schrieb am 21.06.2010

da es leider nicht so ohne weiteres möglich ist, mit Sheets.Add code-seitig
ein neues Arbeitsblatt zu erzeugen, dass z. B. schon
DoubleClick-Handling-Code drin hat, bleibt mir hier nur der Weg über ein
vorgefertigtes Template, dessen Kopie dann das neue Sheet darstellt.



Wenn Du dein Tabellenblatt als einziges in einer Vorlage (.XLT) speicherst,
kannst Du bei Sheets.Add diese Vorlage dann als Template angeben.
Dafür musst Du dann aber den Pfad wissen, wo dieses Templat liegt

Daher ist der Weg dieses Blatt einfach versteckt in der Mappe mitzuführen
eine gute Alternative.

TMPL ist versteckt. Allerdings nur Hidden, nicht VeryHidden, weil ich sonst
oft einen Error 400 bekomme...,muss ich aber nicht verstehen, dann muss es
eben das simple "Hidden" tun.



Wann genau ist 'oft'?
Bei welchen Manipulationen erhàltst Du denn diesen Fehler?


Hier ist mein noch recht hakeliger Code (aber na schön, so làuft's erstmal)

Sheets("TMPL").Copy Before:=Sheets("Xyz")

' jetzt hat das temporàre kopierte Sheet den internen Namen "TMPL (2)"

Sheets("TMPL (2)").Visible = True ' sichtbar machen, denn sonst kann ich
nicht aktivieren
Sheets("TMPL (2)").Name = "Neu"
Sheets("Neu").Activate

Das geht doch sicher auch eleganter, oder??



'Elegant' ist immer recht subjektiv anzusehen

Wenn Du mit Objekten arbeitest kannst Du das Ganze etwas anders gestalten,
allerdings hat Excel etwas Mühe ausgeblendete Objekte zu kopieren, daher
muss das Template eingangs sichtbar gemacht werden.


Public Sub tr()
Dim wsNew As Worksheet

With Worksheets("TMPL")
.Visible = xlSheetVisible
Worksheets("TMPL").Copy Before:=Sheets("Xyz")
.Visible = xlSheetHidden
End With

Set wsNew = ActiveSheet
With wsNew
.Name = "Neu"
'.Activate

'Weiterer Code für dieses neue Tabellenblatt

End With
End Sub


- die Namensgebung des erzeugten Sheets gestaltet sich schwierig, da ich
beim Kopieren leider nicht sagen kann, wie das neue Sheet heißen soll
(für die ganz Schlauen, die meinen, man könne da einfach
Destination:="GanzNeuesSheet" machen, noch der Hinweis, dass das so _nicht_
geht! Das ist kein PHP! =D Excel meldet hier gnadenlos "Index out of range",
also will das Sheet vorher explizit erzeugt wissen; Copy() kann kein
"On-The-Fly-Create")



Ja, das ist korrekt - das klappt nur dann, wenn das einzufügende
Tabellenblatt als Template auf der Festplatte liegt und mit .Add
hinzugefügt wird.

- ActiveSheet.* funktioniert für unsichtbare Sheets NICHT; bei
ActiveSheet.Name = "Neu" hat mir Excel gnadenlos mein vorher erzeugtes "Xyz"
umbenannt.
Auch ein vorheriges Activate oder Select macht meine erzeugte
"Template-Kopie" nicht zum ActiveSheet.



Daher muss das ausgeblendete Template zuvor sichtbar gemacht werden, dann
ist es nach dem Kopieren automatisch das aktive Tabellenblatt.



Mit freundlichen Grüssen
Thomas Ramel

- MVP für Microsoft-Excel -

WICHTG - Diese NG ist von MS geschlossen worden; weitere Infos unter:
http://groups.google.com/group/micr...f28e477c07
http://groups.google.com/group/micr...&pli=1

Ähnliche fragen