Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1264to1268
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Globale und lokale Namen

Globale und lokale Namen
Peter
Guten Abend
Ich habe in einer Datei mehrere Namen mehrmals vergeben, so bezieht sich
der Name "abc" auf Daten1!A3 (globaler Name)
der Name "abc" auf Daten2!A3 (lokaler Name) und
der Name "abc" auf Daten3!A3 (lokaler Name)
Ich möchte eine Funktion schreiben, die mir die "Fundstellen" der gleichen Namen zurückgibt. Dabei sollten lokale Namen zusätzlich in eckigen Klammern stehen. Für mein Beispiel heisst das:
die Funktion =NamAuswertung("abc") gibt folgenden String zurück:
Daten1!A3 - [Daten1!A3] - [Daten1!A3]
Ich kann zwar abfragen, ob ein Name mehrmals vorkommt (vgl. nachstehend). Ich möchte jedoch, wenn die Variable j um 1 erhöht wird ausgehend von WkBk.Names(i).Name abfragen können, ob es sich um ein globaler Name handelt (und wo ersteht) oder ob es sich um ein lokaler Name handelt (und wo er steht) und diese Informationen dann einer Variable zuweisen, die ich gesamthaft zurückgebe.
Gruss, Peter
<pre>Function AdresseTabelleBereich1(str As String)
Dim CountOfNames As Long, i As Long, j As Long, WkBk As Excel.Workbook
Dim strVergleich As String
Set WkBk = ThisWorkbook
CountOfNames = WkBk.Names.Count
For i = 1 To CountOfNames
strVergleich = WkBk.Names(i).Name
If Mid(strVergleich, InStr(strVergleich, "!") + 1) = str Then j = j + 1
Next
If j > 1 Then
AdresseTabelleBereich1 = "nicht eindeutig"
Else
With ThisWorkbook.Names(str).RefersToRange
AdresseTabelleBereich1 = .Parent.Name & "!" & .Address(0, 0)
End With
End If
End Function</pre>

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Globale und lokale Namen
17.06.2012 06:47:34
Erich
Hi Peter,
probier mal

Function AdresseTabelleBereich1(str As String)
Dim CountOfNames As Long, i As Long, j As Long, strAus() As String
CountOfNames = ThisWorkbook.Names.Count
ReDim strAus(0 To CountOfNames)
For i = 1 To CountOfNames
With ThisWorkbook.Names(i)
If .Name = str Then
strAus(0) = Mid(.RefersTo, 2)
ElseIf Right(.Name, Len(str) + 1) = "!" & str Then
j = j + 1
'           strAus(j) = "[" & .Parent.Name & "!" & .RefersToRange.Address(0, 0) & "]"
strAus(j) = "[" & Mid(.RefersTo, 2) & "]"
End If
End With
Next
If strAus(0) = "" Then
For i = 0 To j - 1
strAus(i) = strAus(i + 1)
Next i
ReDim Preserve strAus(0 To j - 1)
Else
ReDim Preserve strAus(0 To j)
End If
AdresseTabelleBereich1 = Join(strAus, " - ")
End Function
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich und: Ich wünsch dir einen schönen Sonntag!
Anzeige
kleine Änderung und Mappe
17.06.2012 10:02:50
Erich
Hi Peter,
deine Version hatte ich (in der auskommentierten Zeile) falsch wiedergegeben.
Hier noch mal mit kleinen Änderungen:

Function AdresseTabelleBereich1(str As String)
Dim CountOfNames As Long, i As Long, j As Long, strAus() As String
CountOfNames = ThisWorkbook.Names.Count
ReDim strAus(0 To CountOfNames)
For i = 1 To CountOfNames
With ThisWorkbook.Names(i)
If .Name = str Then
strAus(0) = Replace(Mid(.RefersTo, 2), "$", "")
ElseIf Right(.Name, Len(str) + 1) = "!" & str Then
j = j + 1
'           With .RefersToRange
'              strAus(j) = "[" & .Parent.Name & "!" & .Address(0, 0) & "]"
'           End With
strAus(j) = "[" & Replace(Mid(.RefersTo, 2), "$", "") & "]"
End If
End With
Next
If strAus(0) = "" Then
For i = 0 To j - 1
strAus(i) = strAus(i + 1)
Next i
ReDim Preserve strAus(0 To j - 1)
Else
ReDim Preserve strAus(0 To j)
End If
AdresseTabelleBereich1 = Join(strAus, " - ")
End Function
Und hier noch eine BeiSpielMappe: https://www.herber.de/bbs/user/80594.xls
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
AW: kleine Änderung und Mappe
18.06.2012 09:21:40
Peter
Hallo Erich
Grosse Klasse. Vielen Dank!
Jetzt habe ich noch ein "kleines" Problem, und zwar kommt es vor, dass sich der Name nicht auf einen Bereich bezieht, sondern eine Formel oder einen Wert enthält.
Bei der Zahl wird nur die global definierte geliefert, bei der Formel werden die einzelnen Formeln geliefert, die globale ohne eckige Klammern, die lokalen mit eckigen Klammern.
Bei der Zahl wäre es toll, wenn auch die lokal definierten Zahlen geliefert würden; sowohl bei der Zahl als auch bei der Formel wäre es super, wenn bei den lokal definierten Zahlen / Formel und der Name der Tabelle geliefert würde.
Vielleicht sind dies jedoch allzu viel der Wünsche ...
Gruss, Peter
https://www.herber.de/bbs/user/80607.xlsm
Anzeige
Kleinbuchstabe
18.06.2012 13:38:13
Erich
Hi Peter,
da habe ich eine Weile gebraucht, bis ich das gefunden habe:
Probier es mal mit "Testzahl" und mit "TestZahl" in abc!C3 - (also mit kleinem und großem Z)...
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
AW: Kleinbuchstabe
18.06.2012 13:48:07
Peter
Hallo Erich
Das ist aber interessant. Jetzt hab' ich's gesehen. Vielen Dank!
Vielleicht müsste man den Code anpassen, so dass Gross- oder Kleinschreibung keinen Unterschied macht, denn wenn ich irgendwo im VBA-Code einen Namen verwende, spielt Gross- oder Kleinschreibung auch keine Rolle.
Wenn nur eine Zahl oder eine Formel zurückgegben wird: könnte ich nebst Zahl oder Formel auch noch die entsprechende Tabelle, wo die Definition erfolgt ist, als Rückgabe haben (natürlich nur bei der lokalen Definition).
Gruss, Peter
Anzeige
UCase und Name.Parent
18.06.2012 15:21:29
Erich
Hi Peter,
probier mal

Function AdresseTabelleBereich2(str As String)
Dim CountOfNames As Long, i As Long, j As Long, strAus() As String
str = UCase$(str)
CountOfNames = ThisWorkbook.Names.Count
ReDim strAus(0 To CountOfNames)
For i = 1 To CountOfNames
With ThisWorkbook.Names(i)
If UCase$(.Name) = str Then
strAus(0) = Replace(Mid(.RefersTo, 2), "$", "")
ElseIf UCase$(Right(.Name, Len(str) + 1)) = "!" & str Then
j = j + 1
strAus(j) = "[" & Replace(Mid(.RefersTo, 2), "$", "") & "]"
End If
End With
Next
If strAus(0) = "" Then
For i = 0 To j - 1
strAus(i) = strAus(i + 1)
Next i
ReDim Preserve strAus(0 To j - 1)
Else
ReDim Preserve strAus(0 To j)
End If
AdresseTabelleBereich2 = Join(strAus, " - ")
End Function
Der Tabellenname wird bei lok. Namen immer ausgegeben, auch bei Bereichen.
Denn der Bereich RefersToRange kann in deiner anderen Tabelle liegen als Name.Parent.
(Ein Beispiel war in meiner Beispielmappe.)
Ich hab mal spitze Klammern um den Tabellennamen gewickelt.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
AW: UCase und Name.Parent
19.06.2012 08:43:54
Peter
Hallo Erich
Das funktioniert. Vielen Dank. Jetzt habe ich mir noch folgende Überlegung gemacht. Nur wenn sich der Name auf eine Zahl oder eine Formel bezieht und es sich um einen lokalen Namen handelt, sollte zusätzlich der Tabellenname in spitzigen Klammern geliefert werden.
Ich habe mir in deinem Code zweimal Debug.Print eingefügt (vgl. nachstehend) und dann im Direktbereich folgende Ergebnisse erhalten (vgl. weiter unten). Wenn es sich nicht um Formeln oder eine Zahl handelt, ist in der entsprechenden Zeile immer ein "!" im String enthalten.
Könnte man zusätzlich nach dem "!" abfragen und dann den Tabellenname in spitzigen Klammern nur liefern, wenn im String kein "!" enthalten ist?
Gruss, Peter
Function AdresseTabelleBereich3(str As String)
Dim CountOfNames As Long, i As Long, j As Long, strAus() As String
str = UCase$(str)
CountOfNames = ThisWorkbook.Names.Count
ReDim strAus(0 To CountOfNames)
For i = 1 To CountOfNames
With ThisWorkbook.Names(i)
If UCase$(.Name) = str Then
Debug.Print "Bedingung1" & UCase$(.Name) & " " & .RefersTo
strAus(0) = Replace(Mid(.RefersTo, 2), "$", "")
ElseIf UCase$(Right(.Name, Len(str) + 1)) = "!" & str Then
Debug.Print "Bedingung2" & UCase$(.Name) & " " & .RefersTo
j = j + 1
strAus(j) = "[" & Replace(Mid(.RefersTo, 2), "$", "") & "]"
End If
End With
Next
If strAus(0) = "" Then
For i = 0 To j - 1
strAus(i) = strAus(i + 1)
Next i
ReDim Preserve strAus(0 To j - 1)
Else
ReDim Preserve strAus(0 To j)
End If
AdresseTabelleBereich3 = Join(strAus, " - ")
End Function

'''Direktbereich
Bedingung2'ABC (5)'!TESTZAHL =3
Bedingung2DEF!TESTZAHL =19
Bedingung1TESTZAHL =3
Bedingung1TESTZELLE =abc!$N$6
Bedingung2DEF!TESTFORMEL =ROUNDDOWN(100.999,1)
Bedingung2ZZZ!TESTFORMEL =ROUND(19/5,3)
Bedingung1TESTFORMEL =ROUND(19/5,3)
Bedingung2'ABC (5)'!TESTZAHL =3
Bedingung2DEF!TESTZAHL =19
Bedingung1TESTZAHL =3
Bedingung2'ABC (2)'!TESTBEREICH ='abc (2)'!$B$6:$B$12
Bedingung2'ABC (3)'!TESTBEREICH ='abc (3)'!$B$6:$B$12
Bedingung2'ABC (4)'!TESTBEREICH =2
Bedingung2'ABC (5)'!TESTBEREICH =2
Bedingung2'ABC (6)'!TESTBEREICH ='abc (6)'!$H$2:$H$8
Bedingung1TESTBEREICH =abc!$M$2:$M$8
https://www.herber.de/bbs/user/80632.xlsm
Anzeige
Zweifel
19.06.2012 09:56:44
Erich
Hi Peter,
sieh dir mal diese Namendefinitionen an:
 ABC
19aaBereich [def!B1:B2] - [def!B1:B2] - [def!C8:C9]
20aaFormel ["mit Ausruf!"] - [abc!A24+1]
21   
22aaBereich <abc>[def!B1:B2] - <def>[def!B1:B2] - <zzz>[def!C8:C9]
23aaFormel <abc>["mit Ausruf!"] - <def>[abc!A24+1]

Formeln der Tabelle
ZelleFormel
C19=AdresseTabelleBereich2(A19)
C20=AdresseTabelleBereich2(A20)
C22=AdresseTabelleBereich3(A22)
C23=AdresseTabelleBereich3(A23)

An aaBereich kannst sehen, dass die Angabe des Bereichs (Blatt <abc> bzw. <def> bzw. <zzz>
für Eindeutigigkeit nötig ist.
Ein Name, der sich auf einen Bereich in Blatt1 bezieht, kann für Blatt2 definiert sein. Die Info in C19 reicht nicht aus.
Wie aaFormel zeigt, kann ein Ausrufezeichen vorkommen, obwohl sich der Name nicht (nur)auf einen Bereich bezieht.
Die Namen aaFormel hielte man für Bereichsnamen, würde man nur das Ausrufezeichen abfragen.
Ändert as deinen Wunsch?
Noch eine Überlegung: Die XL-Hilfe-Aussage
"Ein Name repräsentiert eine Zelle, einen Zellenbereich, eine Formel oder einen konstanten Wert."
ist genau genommen falsch. Jeder Name wird durch eine Formel definiert (beginnend mit "=").
In der Formel, also hinter dem Gleichheitszeichen, kann ein beliebiger Ausdruck stehen.
Bereich und Konstante sind nur Spezialfälle für einen solchen Audruck.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
AW: Zweifel
19.06.2012 11:00:58
Peter
Hallo Erich
Deine Zweifel, ob meine Überlegungen zu Ende gedacht waren, sind natürlich berechtigt.
Unter Berücksichtigung der von dir erwähnten Aspekte, werde ich auf weitere Anpassungen verzichten.
Vielen Dank für deine wertvolle Hilfe und alle Hinweise.
Gruss, Peter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige