Anzeige
Archiv - Navigation
1828to1832
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

names(i).delete klappt nicht?!?

names(i).delete klappt nicht?!?
15.05.2021 22:38:08
Norman
Hallo zusammen,
bin gerade irritiert.
Habe 2 Namen:
a = Tabelle1!A1 --> Für komplette Mappe
a = Tabelle1!B2 --> Nur für Tabelle1 (sozusagen ein "lokales" a).
Jetzt will ich mit VBA da "globale" a (das auf Tebelle1!A1 zeigt) löschen. Weils noch mehr Namen geben kann, suche ich über names(i).name (bzw. For Each) nach a. NIcht nach 'Tabelle1'!a, sondern nur nach a. Finde ich auch. Ist auch die richtige Stelle. Dann mache ich names(i).delete (bzw. in diesem Falle nameItem.delete, weil ich schon gedacht habe, dass Excel hier nen anderen Index hat). Tja, was soll ich sagen, Excel löscht den "falschen" Namen. Excel löscht den lokalen, nicht den globalen.
Lustiger Weise passiert das nur bei gleichnamigen Namen, die lokal / global sind. Bei anderen Namen gehts.
Habe die Datei mal angehängt, vielleicht bin ich ja auch blöd. Bitte einfach mal WBRemoveTags starten. https://www.herber.de/bbs/user/146211.xlsm
Hier ist der Code

Private Sub PrintTags()
Dim nameItem As Excel.Name
Dim i As Long
If ThisWorkbook.Names.Count > 0 Then
For i = 1 To ThisWorkbook.Names.Count
Debug.Print ThisWorkbook.Names(i).Index & " - " & ThisWorkbook.Names(i).Name & " - " & ThisWorkbook.Names(i).RefersTo & " - " & ThisWorkbook.Names(i).Visible & " - " & ThisWorkbook.Names(i).Comment
Next i
End If
End Sub

Private Sub WBRemoveTags()
Dim nameItem As Excel.Name
Debug.Print "---- Vor Löschen ----"
PrintTags
If ThisWorkbook.Names.Count > 0 Then
For Each nameItem In ThisWorkbook.Names
If nameItem.Name = "a" Then
Debug.Print "---- Löschen ----"
Debug.Print nameItem.Index & " - " & nameItem.Name & " - " & nameItem.RefersTo & " - " & nameItem.Visible & " - " & nameItem.Comment
nameItem.Delete
End If
Next nameItem
End If
Debug.Print "---- Nach Löschen ----"
PrintTags
End Sub
Das kommt bei mir dabei raus:
---- Vor Löschen ----
1 - Tabelle1!a - =Tabelle1!$B$2 - Wahr - nur auf Tabelle
2 - a - =Tabelle1!$A$1 - Wahr - Auf Mappe
---- Löschen ----
2 - a - =Tabelle1!$A$1 - Wahr - Auf Mappe
---- Nach Löschen ----
1 - a - =Tabelle1!$A$1 - Wahr - Auf Mappe
Die letzte Zeile hätte aber wie folgt heißen müssen:
1 - Tabelle1!a - =Tabelle1!$B$2 - Wahr - nur auf Tabelle
? Was übersehe ich?
Vielen Dank, Norman

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: names(i).delete klappt nicht?!?
15.05.2021 23:39:56
GerdL
Moin Norman,
eine kleine Nachtgeschichte.

Sub Unit()
Dim i As Integer
Start:
With ThisWorkbook
For i = 1 To .Names.Count
Debug.Print .Names(i).Index & _
" - " & .Names(i).Name & _
" - " & .Names(i).RefersTo & _
" - " & .Names(i).Visible & _
" - " & .Names(i).Comment
If .Names(i).Name = "Norman" Then
MsgBox "globabler Norman wird gelöscht"
.Names(i).Delete
GoTo Start
End If
Next
End With
End Sub
Wie du siehst, habe ich einen anderen Doppelnamen genommen. :-)
Gruß Gerd
AW: names(i).delete klappt nicht?!?
16.05.2021 08:33:24
Norman
Hallo Gerd,
vielen Dank fürs "Mitgrübeln" :) Dein Code löscht auch den falschen Namen. Step mal durch, dann wirst Du sehen, dass auch bei Dir Tabelle1!a gelöscht wird und nicht a.
Ferner löscht Dein Code alle Namen in meiner Testdate (vorausgesetzt natürlich, man ändert "norman" auf a). Das hat damit zu tun, dass Du mit goto start wieder von vorn anfängst. Da beim ersten Mal der falsche Name gelöscht wird, wird beim zweiten Mal der richtige gelöscht - und dann sind beide weg.
Scheint also wirklich ein Excel Bug zu sein.
Noch jemand eine Idee?
Viele Größe
Norman
Anzeige
AW: names(i).delete klappt nicht?!?
16.05.2021 10:36:19
GerdL
Moin,
ich weis nicht, was du wie versucht hast. Bei mir ist gestern Abend nur der "globale" Name gelöscht worden.
Gruß Gerd
AW: names(i).delete klappt nicht?!?
16.05.2021 10:48:05
Hans
Hallo,
vielleicht hilft es:
Beim Löschen von irgendwas aus einer Schleife heraus muss der Vorgang rückwärts erfolgen:

For i = ActiveWorkbook.Names.Count to 1 step -1
ActiveWorkbook.Names(i).WegMitIhm
Next i
Gruss hans
AW: names(i).delete klappt nicht?!?
16.05.2021 11:26:09
Norman
Hallo Hans,
vielen Dank, hilft leider auch nicht. Das Item ist ja das richtige, das kann man ja sehen, wenn die Werte des Items per debug.print ausgegeben werden. D.h. "a" wurde gefunden. Aber das Delete auf genau dieses Item löscht ein anderes. Verrückt...
Viele Größe
Norman
Anzeige
AW: names(i).delete klappt nicht?!?
16.05.2021 12:18:20
Hans
Hallo Norman,
Du hast recht. Bei Excel sind irgendwann alle a-Namen "a", keiner "Tabelle1!a".
Als Kriterium wirst Du vermutlich den Kommentar oder sowas festlegen müssen.
Gruss hans
AW: names(i).delete klappt nicht?!?
16.05.2021 12:38:46
Norman
Hi Hans,
danke noch mal. Das mit dem Kriterium klappt ja leider auch nicht, denn den richtigen Namen finde ich ja. Nur .delete geht nicht.
Gruß
Norman
AW: names(i).delete klappt nicht?!?
16.05.2021 12:45:27
ralf_b
wurde der Name von dir oder vom System erstellt?
hier ein Script für die Auflistung de Namen im Direktfenster
Manche Namen sind nur für das Blatt und manche für die Mappe erstellt. Vielleicht bringt dich das auf ne Idee.

Sub listnames()
Dim ws As Worksheet, wb As Workbook
Dim sN As Name
If Application.Names.Count > 0 Then Debug.Print "************* App Names ********************" & vbCrLf
For Each sN In Application.Names
Debug.Print "APP.Name: " & sN & vbCrLf & "       Value: " & sN.Value & vbCrLf
Next
If Application.Names.Count > 0 Then Debug.Print "************* End  App Names ********************" & vbCrLf
For Each wb In Workbooks
' If wb.Name  "Personal.xlsb" Then
If wb.Names.Count > 0 Then Debug.Print "-------------- end " & wb.Name & " --------------" & vbCrLf; ""
For Each sN In wb.Names
Debug.Print "wb= " & wb.Name & "    Name: " & sN.Name & vbCrLf & "       Value: " & sN.Value & vbCrLf
Next
If wb.Names.Count > 0 Then Debug.Print "-------------- end " & wb.Name & " --------------" & vbCrLf; ""
For Each ws In wb.Worksheets
If ws.Names.Count > 0 Then Debug.Print "-------------- end " & ws.Name & " --------------" & vbCrLf; ""
For Each sN In ws.Names
Debug.Print "ws= " & ws.Name & "    Name: " & sN.Name & vbCrLf & "       Value: " & sN.Value & vbCrLf
Next
If ws.Names.Count > 0 Then Debug.Print "-------------- end " & ws.Name & "  ----------------" & vbCrLf
Next
' End If
Next
End Sub
gruß
rb
Anzeige
Delete bei mehreren Bedingungen
16.05.2021 12:51:11
Hans
Hallo Norman,
was ich meinte, war sowas:

If nameItem.Name = "a" And nameItem.Comment = "In der Mappe" Then
oder

If nameItem.Name = "a" And InStr(nameItem.Name, "!") = 0 Then
Gruss hans
AW: names(i).delete klappt nicht?!?
16.05.2021 15:01:44
Norman
Hallo ihr Beiden :)
ich glaube ich brings irgendwie nicht richtig rüber. Das Element finde ich. Es ist auch kein Code-Fehler soweit ich das erkennen kann.
DELETE geht nicht :) Schaut Euch doch einfach mal die Datei an, die ich beigelegt habe: Wenn Ihr einen Weg findet, den Namen "a" per VBA zu löschen und den Namen "Tabelle1!a" nicht, dann postet die Lösung :)
Die beiden Namen habe ich einfach über den Namensmanager eingetippt.
PS: Kam eben mal auf die Idee den Makrorekorder einzuschalten, wenn ich "a" manuell lösche (was nebenbei im Namensmanager ohne Fehler (!) funktioniert). Das ist das aufgezeichnete Makro:
ActiveWorkbook.Names("a").Delete
Das geile ist, wenn man die Datei dann neu lädt (damit wieder beide Namen da sind) und die Zeile dann in VBA ausführt, wird auch der falsch Name gelöscht. Ich denke Mal, damit ist der Microsoft Bug dann final nachgewiesen.
Tja, ist halt wie es ist, Bug ist Bug :) Oder findet noch jemand einen Weg, den "richtigen" Namen per VBA zu löschen?
Viele Grüße
Norman
Anzeige
AW: names(i).delete klappt nicht?!?
16.05.2021 17:45:32
EtoPHG
Hallo Norman,
Nächstes Mal besser die Eigenschaften von Names in der Hilfe nachschlagen!
so:

Option Explicit
Sub DeleteName(sName As String, Optional bIsValidWBP As Boolean = True)
Dim thisName As Name
For Each thisName In Names
If thisName.Name = sName And _
thisName.ValidWorkbookParameter = bIsValidWBP Then thisName.Delete
Next thisName
End Sub
Sub Test()
DeleteName "a"                       ' Lösche Name bezgl. Arbeitsmappe
'   DeleteName "Tabelle1!a", False       ' Lösche Name bezgl. Tabelle
End Sub
Gruess Hansueli
AW: names(i).delete klappt nicht?!?
16.05.2021 18:08:34
Norman
Hi Hansueli,
vielen Dank. Paste Deinen Code doch mal in die Arbeitsmappe von mir in Office 365. Funktioniert nämlich nicht, habs gerade probiert. Löscht auch den falschen Namen, nämlich den lokalen, nicht den globalen. Probiers mal aus.
Zumindest bei mir. Ich habe Excel Microsoft® Excel® für Microsoft 365 MSO (16.0.13929.20206) 32-Bit
Danke für den Hinweis auf die Hilfe, habe ich gelesen. Hilft beim .DELETE nicht :)
---- Nach Löschen ----
1 - a - =Tabelle1!$A$1 - Wahr - Auf Mappe
Viele Grüße
Anzeige
und wo bitte finde ich deine Arbeitsmappe?
16.05.2021 18:23:24
EtoPHG

AW: und wo bitte finde ich deine Arbeitsmappe?
16.05.2021 18:40:47
Norman
Na im ersten Post :)
"Habe die Datei mal angehängt, vielleicht bin ich ja auch blöd. Bitte einfach mal WBRemoveTags starten. https://www.herber.de/bbs/user/146211.xlsm"
...dann bin ich es aber auch (zu blöd ;-)
16.05.2021 19:09:07
EtoPHG
Hallo Norman,
Ich hab es mit deiner Mappe simuliert und du hast recht : Der Code löscht in Deiner Mappe den Namen aus der Tabelle und lässt den aus deiner Mappe stehen.
Ich habe es mit einer eigenen Datei erstellt mit Excel 2013 simuliert und da hat mein Code je nach übergebenen Parametern immer den richtigen Namen gelöscht.
Da muss irgendwo tief in der XL-(365)-Erde ein Wurm drin sein. Ich kann ihn bis jetzt nicht finden. Sorry.
Gruess Hansueli
Anzeige
AW: ...dann bin ich es aber auch (zu blöd ;-)
16.05.2021 19:13:21
Norman
Hi Hansueli,
super, danke Dir für die Rückmeldung. Jetzt habe ich eine Frage an Dich:
Heißt das, Du hast kein Office 365? Das würde ja bedeuten, dass der Fehler "in der Datei" liegt, wenn es mit Deiner eigenen Datei geht (unter 2013) und mit meiner Datei nicht (auch unter 2013). Das wäre ja ein Ding...
Viele Grüße
Norman
AW: nein ich hab keine office 365 (owT)
16.05.2021 19:18:25
EtoPHG

AW: nein ich hab keine office 365 (owT)
16.05.2021 19:20:34
Norman
Merci.
Das ist aber schon komisch, dann liegts in der Datei. Könntest Du mir mal Deine 2013er Datei uploaden? Mit einem a auf der Mappe und einem a auf der Tabelle und Deinem Code? Dann probiere ich mal aus, ob das bei mir dann richtig läuft.
Viele Grüße
Norman
Anzeige
AW: 1 Fisch gefangen, kleiner Wurm noch da!
16.05.2021 20:37:10
EtoPHG
Hallo Norman,
Ich hab jetzt nochmals mit meinem Code ausführlich getestet.
Der Code funktioniert, wenn er mit einem aktivierten Blatt, in dem der(zu löschende) Name nicht vorkommt, ausgeführt wird. Dann wird der Arbeitsmappen-Name gelöscht.
Wird er dagegegen mit aktiviertem Blatt, in dem der Name vorkommt, ausgeführt. Dann löscht er den Namen des Blatts, statt den der Arbeitsmappe.
Den Test den ich Dir beschrieben habe, war also mit aktiviertem Blatt Tabelle1 ausgeführt worden. Da du nur 1 Blatt hast, wird der Code immer den des Blatts und nicht den der Arbeitsmappe löschen (das ist der verbleibende Wurm!). Addiere mal 1 Blatt in deiner Mappe und führe dann nochmals meinen Löschcode für den Arbeitsmappen-Namen aus, wenn das addierte aktiv ist.
Ich finde das ist wirklich ein Bug, aber offensichtlich hat MS da die Codeteile der Namensmanager Dialoge verwendet und nicht strikt auf die Objekt-Kontexte geachtet.
Gruess Hansueli
Anzeige
AW: 1 Fisch gefangen, kleiner Wurm noch da!
17.05.2021 06:03:55
Norman
Hey Hansueli,
na das ist mal ne klasse Analyse, auf die Idee wäre ich nicht gekommen, vielen Dank dafür. Ein kleinwenig macht das aus Sicht Microsoft Sinn (nach dem Motto, wenn das aktive Blatt ein a hat, dann lösche ich das zuerst, ist ja dann sozusagen auch die lokale Sicht), aber eben nur ein kleinwenig.
Auch alle Fälle wäre damit das Geheimnis gelöst, Dank Dir dafür.
Viele Grüße
Norman
Danke, aber ich will den grossen Fisch fangen
17.05.2021 09:48:57
EtoPHG
Hallo Norman,
Danke für die Blumen.
Der grosse Fisch (was ist wirklich die Ursache, des fehlerhaften Löschens?) ist aber noch nicht gefangen.
Es darf nicht sein, dass mein Code den tabellenbezogenen Namen löscht, das die Eigenschaft ValidWorkbookParameter True sein muss für das Löschen.
Nachweislich ist diese Eigenschaft bei den beiden gleichen Namen unterschiedlich. D.h. die Methode Names(index) .Delete bestimmt vermutlich den index nochmals aufgrund der Bezeichnung (in deinem Beispiel "a") noch einmal neu und gibt dem lokalen Namen den Vorzug.
Ich werde mich noch weiter mit "Bug"-fischen beschäftigen, bis ich den Mutterfisch gefangen habe ;-) Als Rentner muss man schliesslich ein Hobby haben ;-)
Gruess Hansueli
Anzeige
AW: müssen muß man nicht, nur wollen will man ;-)
17.05.2021 10:11:04
neopa
Gruß Werner
.. , - ...
AW: ..das funkt bei mir... Gruß
17.05.2021 14:41:09
Helmut

Sub Namen_weg()
ActiveWorkbook.Names("a").Delete
ActiveWorkbook.Names("a").Delete
End Sub

AW: ..das funkt bei mir... Gruß
17.05.2021 15:09:37
EtoPHG
Hallo,
Was soll das ?
Was funkt ?
Ich bin sicher, du hast das Problem nicht begriffen!
Gruess Hansueli
beide Namen "a" werden gelöscht...
17.05.2021 16:23:01
Helmut
..ob Bereich Arbeitsmappe oder Tabelle.
So habe ich das Problem verstanden :-(
Gruß
AW: Nein, lies genauer ! (owT)
17.05.2021 16:47:23
EtoPHG

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige