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:
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?
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.
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.
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.
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
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
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*
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.