Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA: Tabellenblatt kopieren, Objekt umbenennen

2,338 views
Skip to first unread message

Timo Rumland

unread,
Jul 23, 2003, 11:53:42 AM7/23/03
to
Hallo,

ich möchte ein Tabellenblat kopieren. Bisher habe ich es wie folgt in VBA
gemacht :

Sheets(Sheets.Count).Copy After:=Sheets(DieseArbeitsmappe.Sheets.Count)

Es kopiert das letzte Tabellenblatt nach "ganz hinten". Jedes Tabellenblatt
stellt ja ein Objekt dar - dementsprechend benennt VBA das Objekt
automatisch, z.B. "Tabelle2", "Tabelle3" usw... ich möchte nun dem Objekt
einen Namen geben, und ich vermute, daß ich das VOR dem Kopieren machen
muss.

Jetzt die Frage, wie kopiere ich ein Tabellenblatt so, daß ich dem
Blatt/dem Objekt einen Namen geben kann?


Vielen Dank


--
Mit freundlichen Grüssen,
Timo Rumland

Melanie Breden

unread,
Jul 23, 2003, 12:48:23 PM7/23/03
to
Hallo Timo,

"Timo Rumland" schrieb:

nachdem du ein Blatt kopiert hast, ist dieses das aktive Blatt.
Darauf lässt sich gleich im Anschluss leicht zugreifen:

Sheets(Sheets.Count).Copy After:=Sheets(DieseArbeitsmappe.Sheets.Count)
ActiveSheet.Name = "NeuesBlatt"

--
Mit freundlichen Grüßen
Melanie Breden

_____________________
[Microsoft MVP für Excel]

Timo Rumland

unread,
Jul 23, 2003, 1:30:21 PM7/23/03
to
Hallo,

Am Wed, 23 Jul 2003 18:48:23 +0200 hat Melanie Breden
<Melanie...@mvps.org> geschrieben:

> nachdem du ein Blatt kopiert hast, ist dieses das aktive Blatt.
> Darauf lässt sich gleich im Anschluss leicht zugreifen:
>
> Sheets(Sheets.Count).Copy After:=Sheets(DieseArbeitsmappe.Sheets.Count)
> ActiveSheet.Name = "NeuesBlatt"

danke für die Antwort, aber das war nicht das, was ich gemeint habe. Ich
möchte nicht die Eigenschaft "Name" ändern, sondern ich will den Namen des
*Objektes* im Programmiertechnischen Sinne ändern (ändern im weitesten
Sinne, es reich mir auch, den Namen vor dem Erstellen des Objekte
anzugeben).

Tabellen sind Objekte, und diese Objekte haben einen Namen. Ändere ich die
.Namen Eigenschaft der Tabelle, so sieht man die Tabelle in VBA als Objekt,
z.B. "Tabelle3 (Tabellenname)". Mit der Eigenschaft .Name kann ich den
"Sichtbaren" Namen ändern, also der Teil in Klammern. Ich möchte aber das
Eigentliche Objekt benennen.

Ich bin mir sicher, daß dies möglich ist (vermutlich muss ich vorher ein
Tabellen - Objekt instanzieren [mit set?] und einen Namen geben... ich bin
leider kein VBler und weiß nicht, wie ich das anstellen soll).


Ich hoffe das Problem nun besser beschrieben zu haben


Gruß, Timo

Julia Leuz

unread,
Jul 24, 2003, 5:19:34 AM7/24/03
to

>-----Originalnachricht-----

>Hallo,
>
>Am Wed, 23 Jul 2003 18:48:23 +0200 hat Melanie Breden
><Melanie...@mvps.org> geschrieben:
>
>> nachdem du ein Blatt kopiert hast, ist dieses das
aktive Blatt.
>> Darauf lässt sich gleich im Anschluss leicht zugreifen:

>>
>> Sheets(Sheets.Count).Copy After:=Sheets
(DieseArbeitsmappe.Sheets.Count)
>> ActiveSheet.Name = "NeuesBlatt"
>
>danke für die Antwort, aber das war nicht das, was ich
gemeint habe. Ich
>möchte nicht die Eigenschaft "Name" ändern, sondern ich
will den Namen des
>*Objektes* im Programmiertechnischen Sinne ändern
(ändern im weitesten
>Sinne, es reich mir auch, den Namen vor dem Erstellen des
Objekte
>anzugeben).
>
>Tabellen sind Objekte, und diese Objekte haben einen
Namen. Ã"ndere ich die
>..Namen Eigenschaft der Tabelle, so sieht man die Tabelle
in VBA als Objekt,
>z.B. "Tabelle3 (Tabellenname)". Mit der Eigenschaft .Name
kann ich den
>"Sichtbaren" Namen ändern, also der Teil in Klammern.
Ich möchte aber das
>Eigentliche Objekt benennen.
>
>Ich bin mir sicher, daÃY dies möglich ist (vermutlich
muss ich vorher ein
>Tabellen - Objekt instanzieren [mit set?] und einen Namen
geben... ich bin
>leider kein VBler und weiÃY nicht, wie ich das anstellen
soll).
>
>
>Ich hoffe das Problem nun besser beschrieben zu haben
>
>
>GruÃY, Timo
>.
Hi Timo,

ich hoffe ich habe Dich richtig verstanden. Mir fällt nur
eine Lösung mit einen dynamischen Array ein. Jetzt heisst
es nicht mehr Tabelle1.Name, sondern arrSheet(0).Name

Public Sub test()

Dim arrSheet() As Variant

ReDim arrSheet(Sheets.Count - 1)
For i = 0 To Sheets.Count - 1
Set arrSheet(i) = Sheets(i + 1)
Next i

End Sub

Heiko

unread,
Jul 24, 2003, 6:20:56 AM7/24/03
to
Hallo Timo,

Public Sub tabelleMitName()
Dim cmpVB As Object
Sheets(Sheets.Count).Copy
After:=Sheets(DieseArbeitsmappe.Sheets.Count)
Set cmpVB = Application.VBE.ActiveVBProject.VBComponents(2 +
Sheets.Count)
cmpVB.Name = "Arbeitsblatt"
End Sub

dann sollte dat Dingen <Arbeitsblatt> heißen.

Heiko
:-)

Timo Rumland

unread,
Jul 24, 2003, 7:33:20 AM7/24/03
to
Am Thu, 24 Jul 2003 02:19:34 -0700 hat Julia Leuz <Julia...@gmx.de>
geschrieben:

> ich hoffe ich habe Dich richtig verstanden. Mir fällt nur eine Lösung mit
> einen dynamischen Array ein. Jetzt heisst es nicht mehr Tabelle1.Name,
> sondern arrSheet(0).Name
>
> Public Sub test()
>
> Dim arrSheet() As Variant
> ReDim arrSheet(Sheets.Count - 1)
> For i = 0 To Sheets.Count - 1
> Set arrSheet(i) = Sheets(i + 1)
> Next i
> End Sub


Wo wird in Deinem Beispiel denn der Name des Objektes gesetzt? Nehmen wir
mal an, ich will ein Tabellenblatt kopieren, es ans Ende setzen, dessen
Name auf "Rechnung" stellen und den OBJEKTNAMEN auf "Tab01" setzen. Ich
verstehe nicht ganz, warum Du als Lösungsansatz ein Array verwenden willst?

Langsam beginne ich zu glauben, daß man mit VBA gar nicht in der Lage ist,
sein "eigenes Obejekt" zu erstellen :-/


Timo

Melanie Breden

unread,
Jul 24, 2003, 7:35:39 AM7/24/03
to
Hallo Timo,

"Timo Rumland" schrieb:


> > nachdem du ein Blatt kopiert hast, ist dieses das aktive Blatt.
> > Darauf lässt sich gleich im Anschluss leicht zugreifen:
> >
> > Sheets(Sheets.Count).Copy After:=Sheets(DieseArbeitsmappe.Sheets.Count)
> > ActiveSheet.Name = "NeuesBlatt"
>
> danke für die Antwort, aber das war nicht das, was ich gemeint habe. Ich
> möchte nicht die Eigenschaft "Name" ändern, sondern ich will den Namen des
> *Objektes* im Programmiertechnischen Sinne ändern (ändern im weitesten
> Sinne, es reich mir auch, den Namen vor dem Erstellen des Objekte
> anzugeben).

> Ich hoffe das Problem nun besser beschrieben zu haben

du meintest den Codenamen, jetzt hab ich's auch verstanden :-)

Probier mal folgende Prozedur:

Sub Codename()
Sheets(Sheets.Count).Copy After:=Sheets(DieseArbeitsmappe.Sheets.Count)

ThisWorkbook.VBProject.VBComponents(ActiveSheet.Codename) _
.Properties("_CodeName").Value = "NeuerCodename" & Sheets.Count
End Sub

Die fortlaufende Zahl dient hier nur zur Fehlervermeidung,
falls es den Codenamen schon gibt.

Melanie Breden

unread,
Jul 24, 2003, 7:38:17 AM7/24/03
to
Hallo Heiko,

"Heiko" schrieb:

> Public Sub tabelleMitName()
> Dim cmpVB As Object
> Sheets(Sheets.Count).Copy
> After:=Sheets(DieseArbeitsmappe.Sheets.Count)
> Set cmpVB = Application.VBE.ActiveVBProject.VBComponents(2 +
> Sheets.Count)
> cmpVB.Name = "Arbeitsblatt"
> End Sub
>
> dann sollte dat Dingen <Arbeitsblatt> heißen.


was zählst du da? Die VBE Komponenten?
Bei mir wird das zweite Standardmodul umbenannt :-(

Heiko

unread,
Jul 24, 2003, 7:48:48 AM7/24/03
to
Hallo Melanie,

wer im Glashaus sitzt...
Heiko
:-)

Melanie Breden

unread,
Jul 24, 2003, 8:23:45 AM7/24/03
to
Hallo Heiko,


"Heiko" schrieb:

> wer im Glashaus sitzt...
> Heiko
> :-)

?
hat der Code bei dir funktioniert?

Heiko

unread,
Jul 24, 2003, 8:51:16 AM7/24/03
to
Hallo
hat er. 1 ist in Norm DieseArbeitsmappe
dann 1...n Arbeitsblatt (=>2+).
trotzdem ist deine Auflistung mit (CodeName) die korrekte Variante.
War aber nicht willens die veeXX.hlp auf CD zu suchen.

Man sollte aber erwähnen dass die Objekte in Excel sich in der
Registry widerspiegeln und das Umbenennen schöne Nebeneffekte haben
kann. Außerdem sehe ich bspw. wenig Sinn die Tabelle1 Hinz
Arbeitsblatt Kunz zu nennen, Hauptsache ich vermag sie zu manipulieren
.

Heiko
:-)
"Melanie Breden" <Melanie...@mvps.org> wrote:

Melanie Breden

unread,
Jul 24, 2003, 9:08:34 AM7/24/03
to
Hallo Heiko,

"Heiko" schrieb:


> hat er. 1 ist in Norm DieseArbeitsmappe
> dann 1...n Arbeitsblatt (=>2+).
> trotzdem ist deine Auflistung mit (CodeName) die korrekte Variante.
> War aber nicht willens die veeXX.hlp auf CD zu suchen.

die VBE-Hilfe wird eigentlich automatisch mit installiert.
Arbeitest du noch mit Excel97 (veenob3.hlp )?
Ansonsten schau dir mal die neue Version an: VBOB6.CHM .
Einfach über die Windows-Suche suchen.

Oder setzte einen Verweis auf die Extensibilitys, dann wird die Datei in der OH integriert.

> Man sollte aber erwähnen dass die Objekte in Excel sich in der
> Registry widerspiegeln und das Umbenennen schöne Nebeneffekte haben
> kann. Außerdem sehe ich bspw. wenig Sinn die Tabelle1 Hinz
> Arbeitsblatt Kunz zu nennen, Hauptsache ich vermag sie zu manipulieren

Welche Nebeneffekte kann das haben?

Timo Rumland

unread,
Jul 24, 2003, 4:05:59 PM7/24/03
to
Hallo Melanie,

Am Thu, 24 Jul 2003 13:35:39 +0200 hat Melanie Breden
<Melanie...@mvps.org> geschrieben:

> du meintest den Codenamen, jetzt hab ich's auch verstanden :-)


>
> Probier mal folgende Prozedur:
>
> Sub Codename()
> Sheets(Sheets.Count).Copy After:=Sheets(DieseArbeitsmappe.Sheets.Count)
>
> ThisWorkbook.VBProject.VBComponents(ActiveSheet.Codename) _
> .Properties("_CodeName").Value = "NeuerCodename" & Sheets.Count
> End Sub

ja genau, das meinte ich. Allerdings kommt bei Ausführung des Codes dieser
Fehler

"Die Methode 'Value' für das Objekt 'Property' ist fehlgeschlagen. Genau so
sieht der Code aus :

' Kopieren des letzten Tabellenblatt
Sheets(Sheets.Count).Copy After:=Sheets(DieseArbeitsmappe.Sheets.Count)
ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName)
.Properties("_CodeName").Value = "test"


Was ist daran falsch?

Danke


Beste Grüsse,
Timo

Melanie Breden

unread,
Jul 25, 2003, 3:03:11 AM7/25/03
to
Hallo Timo,

"Timo Rumland" schrieb:

> > ThisWorkbook.VBProject.VBComponents(ActiveSheet.Codename) _


> > .Properties("_CodeName").Value = "NeuerCodename" & Sheets.Count
> > End Sub
>
> ja genau, das meinte ich. Allerdings kommt bei Ausführung des Codes dieser
> Fehler
>
> "Die Methode 'Value' für das Objekt 'Property' ist fehlgeschlagen. Genau so
> sieht der Code aus :
>
> ' Kopieren des letzten Tabellenblatt
> Sheets(Sheets.Count).Copy After:=Sheets(DieseArbeitsmappe.Sheets.Count)
> ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName)
> .Properties("_CodeName").Value = "test"

am besten kopierst du den Code, es fehlt nur ein Leerschritt mit Unterstrich in der ersten Zeile:

ThisWorkbook.VBProject.VBComponents(ActiveSheet.Codename) _

Julia Leuz

unread,
Jul 25, 2003, 3:25:13 AM7/25/03
to

>-----Originalnachricht-----

>Am Thu, 24 Jul 2003 02:19:34 -0700 hat Julia Leuz
<Julia...@gmx.de>
>geschrieben:
>
>> ich hoffe ich habe Dich richtig verstanden. Mir fällt
nur eine Lösung mit
>> einen dynamischen Array ein. Jetzt heisst es nicht mehr
Tabelle1.Name,
>> sondern arrSheet(0).Name
>>
>> Public Sub test()
>>
>> Dim arrSheet() As Variant
>> ReDim arrSheet(Sheets.Count - 1)
>> For i = 0 To Sheets.Count - 1
>> Set arrSheet(i) = Sheets(i + 1)
>> Next i
>> End Sub
>
>
>Wo wird in Deinem Beispiel denn der Name des Objektes
gesetzt? Nehmen wir
>mal an, ich will ein Tabellenblatt kopieren, es ans Ende
setzen, dessen
>Name auf "Rechnung" stellen und den OBJEKTNAMEN
auf "Tab01" setzen. Ich
>verstehe nicht ganz, warum Du als Lösungsansatz ein
Array verwenden willst?
>
>Langsam beginne ich zu glauben, daÃY man mit VBA gar
nicht in der Lage ist,
>sein "eigenes Obejekt" zu erstellen :-/
>
>
>Timo
>.
Hi Timo,

Du willst den Objektnamen verändern, okay da hab ich Dich
falsch verstanden.

Tschüß
Julia

Timo Rumland

unread,
Jul 25, 2003, 7:24:05 AM7/25/03
to
Hallo,

Am Fri, 25 Jul 2003 09:03:11 +0200 hat Melanie Breden
<Melanie...@mvps.org> geschrieben:

>> ' Kopieren des letzten Tabellenblatt


>> Sheets(Sheets.Count).Copy After:=Sheets(DieseArbeitsmappe.Sheets.Count)
>> ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName)
>> .Properties("_CodeName").Value = "test"
>
> am besten kopierst du den Code, es fehlt nur ein Leerschritt mit
> Unterstrich in der ersten Zeile:
>
> ThisWorkbook.VBProject.VBComponents(ActiveSheet.Codename) _


Nein das kann es nicht sein, es sieht nur so aus, als stände der Code in
zwei Zeilen bei mir, da die Zeile durch die Mail Formatierung umgebrochen
war. Das Zeichen "_" weist soweit ich weiß den Interpreter von VBA an, daß
der aktuelle Ausdruck in der nächsten Zeile noch weiter geht. Also dies
hier steht in EINER Zeile bei mir :


ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName)
.Properties("_CodeName").Value = "test"


Und verursacht den Fehler "Die Methode 'Value' für das Objekt 'Property'
ist fehlgeschlagen".


Gruß, Timo

Melanie Breden

unread,
Jul 25, 2003, 7:44:48 AM7/25/03
to
Hallo Timo,

"Timo Rumland" schrieb:

> Nein das kann es nicht sein, es sieht nur so aus, als stände der Code in


> zwei Zeilen bei mir, da die Zeile durch die Mail Formatierung umgebrochen
> war. Das Zeichen "_" weist soweit ich weiß den Interpreter von VBA an, daß
> der aktuelle Ausdruck in der nächsten Zeile noch weiter geht. Also dies
> hier steht in EINER Zeile bei mir :
>
> ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName)
> .Properties("_CodeName").Value = "test"
>
> Und verursacht den Fehler "Die Methode 'Value' für das Objekt 'Property'
> ist fehlgeschlagen".

diese Fehlermeldung erhalte ich nur, wenn in dem aktiven VBA-Projekt bereits
ein Blatt mit dem gleichen Codenamen existiert.
Dabei spielt die Groß/Kleinschreibung keine Rolle.
"Test" geht nicht, wenn es schon "test" gibt.

BTW: Welche Excel- Version verwendest du?

Timo Rumland

unread,
Jul 25, 2003, 7:58:25 AM7/25/03
to
Hallo,

Am Fri, 25 Jul 2003 13:44:48 +0200 hat Melanie Breden
<Melanie...@mvps.org> geschrieben:

> diese Fehlermeldung erhalte ich nur, wenn in dem aktiven VBA-Projekt

> bereits
> ein Blatt mit dem gleichen Codenamen existiert.
> Dabei spielt die Groß/Kleinschreibung keine Rolle.
> "Test" geht nicht, wenn es schon "test" gibt.
>
> BTW: Welche Excel-Version verwendest du?


Nanu, auf einmal funktioniert es - ich habe eindeutig kein doppelten Namen
verwendet, und die Zeile soweit auch nicht geändert. Ich kann mir wirklich
nicht erklären, warum es vorher nicht ging..

<SCHNIPP>

Ha, jetzt weiß ich es, habe gerade nochmal den Namen überprüft. Der Name
für das Objekt wurde von mir fälschlicherweise so erstellt, daß er am Ende
ein Leerzeichen hatte, z.B. "test ", deshalb ging es nicht - jetzt
funktioniert alles wie erwartet.

Danke!

Melanie Breden

unread,
Jul 25, 2003, 8:13:58 AM7/25/03
to
Hallo Timo,

"Timo Rumland" <schrieb:


> Nanu, auf einmal funktioniert es - ich habe eindeutig kein doppelten Namen
> verwendet, und die Zeile soweit auch nicht geändert. Ich kann mir wirklich
> nicht erklären, warum es vorher nicht ging..
>
> <SCHNIPP>
>
> Ha, jetzt weiß ich es, habe gerade nochmal den Namen überprüft. Der Name
> für das Objekt wurde von mir fälschlicherweise so erstellt, daß er am Ende
> ein Leerzeichen hatte, z.B. "test ", deshalb ging es nicht - jetzt
> funktioniert alles wie erwartet.

manchmal sind es die Kleinigkeiten, die einem das Leben schwer machen :-(

Prima das es nun klappt und danke für die Rückmeldung.

0 new messages