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

Excel-VBA: Spalte und Zelle mit Namen ansprechen?

3,004 views
Skip to first unread message

Andre Sokolew

unread,
Sep 6, 2010, 4:37:44 PM9/6/10
to
Hallo,

ich habe ein Diagramm, darauf ein Kontrollkästchen, dem die Zelle W1 und
folgendes Einzeiler-Makro zugeordnet ist:

Sub cbCross_Click()
Worksheets("Training").Columns("K:K").EntireColumn.Hidden = Not
Worksheets("Training").Cells(1, 23)
End Sub

Das Makro blendet eine Spalte ein und wieder aus, damit wird im Diagramm ein
Datenreihe sichtbar und wieder unsichtbar.
Das funktioniert prima, so weit so gut.

Nun möchte ich die Spalte K aber nicht über ihre Buchstabenkoordinate,
sondern über einen Bereichsnamen ansprechen, den ich im Namensmanager
vergeben will.
Analog soll auch die Zelle W1 (entspricht 1, 23) einen Namen bekommen und
darüber in VBA ausgewählt werden.

Wie stellt man das am geschicktesten an?

Danke!
Andre


Wolfgang Habernoll

unread,
Sep 6, 2010, 6:18:50 PM9/6/10
to
Andre Sokolew schrieb:
Hallo

spreche die Namen als Range an, in deimem Beispiel sollte das so gehen

Range("NameSpalte").EntireColumn.Hidden = Not Range("NameZelle")


--
mfG
Wolfgang Habernoll

Andre Sokolew

unread,
Sep 7, 2010, 12:14:33 PM9/7/10
to
"Wolfgang Habernoll" schrieb

>
> spreche die Namen als Range an, in deimem Beispiel sollte das so gehen
>
> Range("NameSpalte").EntireColumn.Hidden = Not Range("NameZelle")
>

Ja, so habe ich mir das vorgestellt, nur nicht so einfach!
Vielen Dank!

Andre

Jörg Eisenträger

unread,
Sep 7, 2010, 1:22:43 PM9/7/10
to

>> Range("NameSpalte").EntireColumn.Hidden = Not Range("NameZelle")
>
>Ja, so habe ich mir das vorgestellt, nur nicht so einfach!

Ich empfehle, sich gleich anzugewöhnen, Bereiche immer vollständig mit
Workbook und Blatt zu adressieren, auch globale Bereiche, also z. B.

ThisWorkbook.Sheets("DeinSheetName").Range(...)
ActiveWorkbook.Sheets("DeinSheetName").Range(...)


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.

Andre Sokolew

unread,
Sep 7, 2010, 3:22:14 PM9/7/10
to
"Jörg Eisenträger" schrieb

> Ich empfehle, sich gleich anzugewöhnen, Bereiche immer vollständig mit
> Workbook und Blatt zu adressieren, auch globale Bereiche, also z. B.
>
> ThisWorkbook.Sheets("DeinSheetName").Range(...)
> ActiveWorkbook.Sheets("DeinSheetName").Range(...)

Warum? Spontan, ohne Erklärung, leuchtet mir das nicht ein.
Ich will ja gerade vermeiden, den Namen von irgendwas, was man auf der
Oberfläche sichtbar umbenennen kann, in den VBA-Quelltext einfließen zu
lassen.
Der Name des Blattes wird doch vom Namensmanager mit verwaltet, und das ist
gut so.
Welchen Vorteil hätte die vollständige Adressierung?

Andre

Jörg Eisenträger

unread,
Sep 7, 2010, 6:14:53 PM9/7/10
to

Hallo Andre,

>> Ich empfehle, sich gleich anzugewöhnen, Bereiche immer vollständig mit
>> Workbook und Blatt zu adressieren, auch globale Bereiche, also z. B.
>> ThisWorkbook.Sheets("DeinSheetName").Range(...)
>> ActiveWorkbook.Sheets("DeinSheetName").Range(...)
>
>Warum?

>Ich will ja gerade vermeiden, den Namen von irgendwas, was man auf der
>Oberfläche sichtbar umbenennen kann, in den VBA-Quelltext einfließen zu
>lassen.

Nun, das waren nur Beispiele. Den Sheet-Namen kannst Du auch vermeiden
z. B. durch
ActiveSheet.Range(...)

Range ohne etwas davor setzt voraus, dass das Workbook aktiviert ist und
der Range global definiert ist. Solange das bei Dir immer so ist,
funktioniert es auch.

Bei komplizierteren sheet- oder gar workbook-übergreifenden VBA-Lösungen
kommt man damit meist nicht mehr hin.

Bereiche lassen sich auch lokal definieren, sie gelten nur für ein
Blatt. Deren Name darf auf jedem Blatt eines Workbooks vorkommen. Dann
gehört das Sheet dazu, um den Range zu adressieren - und sei es nur
durch vorheriges Aktivieren des Sheets.
Ich zitiere mal einen Satz von Andreas K. von gestern aus dem Thread
"Code Hilfe": "Bitte niemals Select, Selection, Activate, ActiveCell in
Makros benutzen, dauert lange in der Ausführung und ist
_fehleranfällig_." (Hervorhebung durch mich.)

Und schließlich: 1 Jahr später lässt sich der Code besser verstehen,
wenn man sofort sieht, auf welchem Blatt der Range ist.


Mach's, wie Du es brauchst. Es war nur eine Empfehlung auf Grund eigener
schmerzlicher Erfahrungen.

Andreas Killer

unread,
Sep 8, 2010, 2:05:37 AM9/8/10
to
Am 07.09.2010 19:22, schrieb Jörg Eisenträger:

>>> Range("NameSpalte").EntireColumn.Hidden = Not Range("NameZelle")

> Ich empfehle, sich gleich anzugewöhnen, Bereiche immer vollständig mit
> Workbook und Blatt zu adressieren, auch globale Bereiche, also z. B.
>
> ThisWorkbook.Sheets("DeinSheetName").Range(...)
> ActiveWorkbook.Sheets("DeinSheetName").Range(...)

Da muss ich wiedersprechen, das macht in diesem Zusammenhang wenig Sinn.

Jeder benannte Bereich (Range) weiß immer selber für welchen Bereich er gültig ist, eine zusätzliche Spezifizierung
durch eine Tabelle ist überflüssig und gibt bei falscher Zuweisung nur einen Fehler.

Neue Mappe machen, in Tabelle1 die Zelle A1 als "qwe" benennen, Tabelle2 aktiv machen, dies Makro starten:

Sub Test()
Dim R As Range
Range("qwe") = 1
Stop
Set R = Sheets(1).Range("qwe")
R = 2
Stop
Set R = Sheets(2).Range("qwe")
R = 3
End Sub

Und bei jedem Stop in Tabelle1 und Tabelle2 nachkucken was passiert. Ich nehm's mal vorweg, es wird immer Tabelle1!A1
beschrieben, außer beim 3ten Mal, das gibt einen RTE 1004.

Anders sieht es aus wenn wir global gültige Namen an den Range übergeben, wie z.B. "A1", dann stimmt es was Du gesagt hast.

Andreas.

Andre Sokolew

unread,
Sep 8, 2010, 5:06:21 PM9/8/10
to
"Jörg Eisenträger"

> Mach's, wie Du es brauchst.

Ja, so verstehe ich Deine Empfehlung, und ich halte Deinen Hinweis
grundsätzlich für nützlich, in diesem Fall allerdings nicht.

Andre


0 new messages