Excel-VBA: Blätter ansprechen m. Codename

Salu Profis,

es wäre praktisch, wenn man Excel-Blätter mit VBA über den Codenamen ansprechen könnte. Ein Blatt, das im Tab als „Nikolaus“ angezeigt wird und mit Codenamen „Tabelle1“ heißt könnte dann so:

ThisWorkbook.Worksheets("Nikolaus").Cells(1, 4) = "Hallo Welt"

oder so

ThisWorkbook.Worksheets(Tabelle1).Cells(1, 4) = "Hallo Welt"

angesprochen werden. Der Anwender könnte das Blatt beliebig umbenennen ohne daß das Script angepaßt werden müßte.

Aber so wie ich das aus diffusen Äußerungen in diversen Foren erahne, muß man den Codenamen über eine For-Next-Schleife suchen. Oder gibt’s da doch noch einen Weg, Blätter für Änderungen (nicht nur zum Auslesen von Werten) direkt mit dem Codenamen anzusprechen?

Vielen Dank & einen sonnigen Sonntag :o)
-Rob.

Habs herausgefunden
Bei beharrlichem Suchen in englischsprachigen Foren fand ich die Lösung:

Konventionell mit Tabellenblattnamen (hier: „Nikolaus“):

ThisWorkbook.Worksheets("Nikolaus").Cells(1, 4) = "Hallo Welt"

Verwendung des Codenamens (hier: „Tabelle1“):

Tabelle1.Cells(1, 4) = "Hallo Welt"

Für’s Archiv: Dieser Zugriff funktioniert nur innerhalb einer Mappe.

Beste Grüße
-Rop.

Hallo,

Verwendung des Codenamens (hier: „Tabelle1“):

Tabelle1.Cells(1, 4) = „Hallo Welt“

das ist interessant. Ich wußte bisher nicht, dass ein Worksheet neben seinem Index und Namen auch noch einen Codenamen besitzt.

Für’s Archiv: Dieser Zugriff funktioniert nur innerhalb einer
Mappe.

Du hast damit zwar das Problem gelöst, dass ein Anwender das Worksheet umbenennen könnte, allerdings kann er es immer noch löschen. Wenn man die Struktur des Workbooks schützt, kann der Anwender weder umbennen noch löschen. Vorteil: Wenn du die Variablen (Workbooks und Worksheets) sauber delarierst und die richtigen Namen zuweist, sollte dass auch mappenübergreifend funktionieren.

MfG
Stephan

Hallo R.o.b.

was passiert denn, wenn du die Reihenfolge der Blätter vertauschst? Funktioniert das dann immer noch?

Gruß, Andreas

was passiert denn, wenn du die Reihenfolge der Blätter
vertauschst? Funktioniert das dann immer noch?

Moin Andreas,

ja. Die Reihenfolge der Anzeige im VB-Editor richtet sich alphabetisch
nach de Blatt-Modulnamen. Das sind die Codenamen.
In Klammern dahinter siehst du die Namen die du in Excel siehst.

Klicke einfach auf ein Blattmodul, dann F4, jetzt kannst du beide Namen jedes Blattes abändern.
Die angezeigte Blattreihenfolge in Excel interessiert den Projektexplorer im VBE nicht.

Gruß
Reinhard

Danke Reinhard,
du warst eine min. zu schnell. Ich habs eben selbst getestet.

Gruß, Andreas

Erweiterter Nutzen.
Salu Stephan,

Für’s Archiv: Dieser Zugriff funktioniert nur innerhalb einer
Mappe.

Du hast damit zwar das Problem gelöst, dass ein Anwender das
Worksheet umbenennen könnte, allerdings kann er es immer noch
löschen. Wenn man die Struktur des Workbooks schützt, kann der
Anwender weder umbennen noch löschen. Vorteil: Wenn du die
Variablen (Workbooks und Worksheets) sauber delarierst und die
richtigen Namen zuweist, sollte dass auch mappenübergreifend
funktionieren.

Das ist nicht ganz richtig: Es sind zwei Probleme gelöst, nämlich das von Dir bereits erwähnte Umbenennen, aber auch das Verschieben/Umstellen der Blätter! Und eigentlich kommt drittens noch hinzu, daß auch der Entwickler die Blätter problemlos umbenennen und verschieben kann, ohne auf den Code achten zu müssen.

Die Anwendbarkeit ist nämlich auch vor allem in der Entwicklungsphase einer Mappe von Bedeutung: Der Auftraggeber will eine Mappe mit bestimmten Eigenschaften, Funktionen, Layouts etc. und schraubt immer mal wieder daran herum, sprich: er verschiebt und benennt um. Da wäre eine saubere Deklaration siemlich sisyphosig. Wenn die Mappe dann steht und auf den Anwender losgelassen wird, wird ihre Struktur natürlich geschützt, das war auch schon vorher so.

Durch den Blattzugriff mittels Codenamen kann man aber nun auch scriptgesteuerte Blattnamen-Änderungen vornehmen, ohne das Script auf die Blattreihenfolge festzunageln. Dem Entwickler bleibt dann immer noch die Möglichkeit, dynamisch benamste Blätter zu verschieben.

Auch mappenübergreifend ist der Codename verwendbar, nur eben nicht so elegant, da er nur als Eigenschaft ausgelesen, nicht aber in einer Methode verwandt werden kann.

Bestliche Grüße :o)
-Rob.

Andere Mappe Tabellenblatt übr Codename ansprechen

Auch mappenübergreifend ist der Codename verwendbar, nur eben
nicht so elegant, da er nur als Eigenschaft ausgelesen, nicht
aber in einer Methode verwandt werden kann.

Hallo Rob,

naja, wenn das sowieso nur temporär so sein soll geht das doch elegant
auch über Mappen *denk*

Man bräuchte doch nur da wo man es braucht eine Funktion aufzurufen:
so eine z.B.

function TabellenIndex(byref wkb as workbook, byval strCodename as string) as integer
dim wks as worksheet
for each wks in wkb.worksheets
 If wks.codename = strCodename then
 TabellenIndex=wks.index
 exit function
 end if

Aufruf:
Workbooks(„Mappe2“).worksheets(TabellenIndex(Workbooks(„Mappe2“),„Tabelle1“).cells(1,4).value=„huhu“

Gruß
Reinhard

Elejant, oda nich
Salu Reinhard,

Auch mappenübergreifend ist der Codename verwendbar, nur eben
nicht so elegant, da er nur als Eigenschaft ausgelesen, nicht
aber in einer Methode verwandt werden kann.

naja, wenn das sowieso nur temporär so sein soll geht das doch
elegant
auch über Mappen *denk*

Man bräuchte doch nur da wo man es braucht eine Funktion
aufzurufen:
so eine z.B.

function TabellenIndex(byref wkb as workbook, byval
strCodename as string) as integer
dim wks as worksheet
for each wks in wkb.worksheets
If wks.codename = strCodename then
TabellenIndex=wks.index
exit function
end if

Aufruf:
Workbooks(„Mappe2“).worksheets(TabellenIndex(Workbooks(„Mappe2“
),„Tabelle1“).cells(1,4).value=„huhu“

Richtig, so hatte ich das auch im Sinn. Doch elegant ist das eben nicht. Elegant wäre z. B.:

Workbooks("Mappe2").Tabelle1.Cells(1, 4).Value = "Huhu"

Gell?

Workbooks(„Mappe2“).worksheets(TabellenIndex(Workbooks(„Mappe2“
),„Tabelle1“).cells(1,4).value=„huhu“

Richtig, so hatte ich das auch im Sinn. Doch elegant ist das
eben nicht. Elegant wäre z. B.:

Workbooks(„Mappe2“).Tabelle1.Cells(1, 4).Value = „Huhu“

Hallo Rob,

Gell?

mag ja sein daß Alkoholgenuß Gehirnzellen liquidiert, warum aber immer die falschen?
Bei „Gell“ fiel mir in nicht meßbarer kurzer Zeit sofort ein:
Gell, du hast mich gelle gern…
Die Gehirnzelle hätte doch weggehört und nicht wichtige Gehirnzellen wo wichtiges stand was ich mal wußte *fluch* *jammer*

Zum Thema, zu elegant, ich schrieb das:
„naja, wenn das sowieso nur temporär so sein soll“
und darauf bezogen ist mein Funktionseinsatz durchaus nicht unelegant.

Soweit ich dich verstanden habe soll das später mal hartcodiert
umgeschrieben werden.
Das kann man dann doch elegant lösen *glaub*
Entweder semimauell durch Suchen im Projekt nach diesem Funktionsaufruf oder ggfs. per Vba automatisch ersetzen lassen.
Letzteres könnte kompliziert werden wenn die Funktionsaufrufe kein klares System zeigen.

Außerdem, was hat dein Kunde von schickem kurzen eleganten Code
wenn er den eh nicht lesen kann?
Schreib eher mehr, zur Not unnötige, Zeilen. Dann sieht er mehr für sein Geld *grien*

Gruß
Reinhard

Für’s Archiv: Dieser Zugriff funktioniert nur innerhalb einer
Mappe.

Hallo Rob,

so ja, Interesse an einer lösung wo du auch in Fremdmappen Blätter durch ihren Codenamen ansprechen kannst?
Zwar von mir noch nicht getestet, hab auch nur die Beschreibung wie das geht ohne Code aber es klang überzeugend.

Gruß
Reinhard