Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1044to1048
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

Namensvergabe per VBA

Namensvergabe per VBA
30.01.2009 12:14:00
Boris
Hallo,
ich verwende untenstehenden Code, um per VBA automatisch Namen zuzuweisen. Wenn in Zeile 1 eines Blattes (die Überschriften enthält) der Wert einer Zelle geändert wird, wird ein Name erstellt aus Blattname + "." + Überschrift (z.B. Umsatz.2008), mit dem Bezug=Blattname!$X$#2, wobei X die entsprechende Spalte ist, also z.B. =Umsatz!$K$2:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim n As Name
If Target.Row = 1 And Target.Cells.Count = 1 Then
If Application.CountIf(Sh.Rows(1), Target) > 1 Then
Application.Undo
Else
On Error Resume Next
Set n = ThisWorkbook.Names.Item(Target.Offset(1, 0).Name.Name)
On Error GoTo 0
If Not n Is Nothing Then n.Delete
If Target  "" Then Target.Offset(1, 0).Name = Sh.Name & "." & Target
End If
End If
End Sub


Frage 1: Anstelle von Bezug=Blattname!$X$#2 würde ich gerne Bezug=INDIREKT(Blattname!$X$#2) zuweisen, weiß aber leider nicht wie...
Frage 2: Zusätzlich zu obigem Code würde ich gerne in einer anderen xl-Datei ein Makro implementieren, dass die gleichen Schritte wie oben ausführt, jedoch nur per Knopfdruck (und nicht über Workbook_SheetChange), weiß aber auch nicht wie...
LG Boris
PS: Der Code wurde mir hier zur Verfügung gestellt, allerdings verstehe ich ihn nicht so richtig:)

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Namensvergabe per VBA
31.01.2009 21:04:00
schauan
Hallo Boris,
im Prinzip so:

'DieseArbeitsmappe
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Row = 1 And Target.Cells.Count = 1 Then AddNames Sh, Target
End Sub
'Tabellenblatt
Sub ButtonClick()
If ActiveCell.Row = 1 Then AddNames ActiveSheet, ActiveCell
End Sub
'Modul
Sub AddNames(ByVal Sh As Object, ByVal Target As Range)
Dim n As Name
If Application.CountIf(Sh.Rows(1), Target) > 1 Then
Application.Undo
Else
On Error Resume Next
Set n = ThisWorkbook.Names.Item(Target.Offset(1, 0).Name.Name)
On Error GoTo 0
If Not n Is Nothing Then n.Delete
If Target  "" Then
ThisWorkbook.Names.Add Name:=Target.Offset(1, 0).Value, RefersTo:= _
"=INDIRECT('" & Sh.Name & "'!" & Target.Offset(1, 0).Address & ")"
End If
End If
End Sub


Anzeige
AW: Namensvergabe per VBA
02.02.2009 09:58:02
Boris
Schonmal danke, funktioniert leider aber noch nicht richtig:
ThisWorkbook.Names.Add Name:=Target.Offset(1, 0).Value, RefersTo:= _
"=INDIRECT('" & Sh.Name & "'!" & Target.Offset(1, 0).Address & ")"
weist den Namen nicht richtig zu. Müsste das nicht so sein:
ThisWorkbook.Names.Add Name:=Sh.Name & "." & Target, RefersTo:= _
"=INDIRECT('" & Sh.Name & "'!" & Target.Offset(1, 0).Address & ")"
Und dann funktioniert das Löschen/Ändern der Namen nicht: bei einer Änderung einer Überschrift wird nur der neue Name angelegt, aber der alte nicht gelöscht. Lösche ich eine Überschrift komplett, bleibt der Name weiterhin bestehen...
Gruß Boris
Anzeige
AW: Namensvergabe per VBA
02.02.2009 10:00:00
Boris
Habe vergessen, den "Frage noch offen Punkt" zu aktivieren:)
AW: Namensvergabe per VBA
02.02.2009 17:37:00
schauan
Hallo Boris,
bei mir hat der Part Sh.Name & "." im Originalcode einen Fehler gebracht, daher habe ich diesen Part rausgenommen. Normalerweise wird ein Tabellenname mit einem "!" abgeschlossen und nicht mit einem "."
Lief das Original bei Dir? Der Eintrag als Name ist dabei nicht das Problem, aber wenn Du Dich in einer Formel darauf beziehst, geht es nicht.
Die einfachen Anführungszeichen stehen dabei, weil ein Tabellenname auch mal ein Leerzeichen enthalten kann.
Der Originalcode macht auch nicht das, was Du beschrieben hast. Als Name wird z.B. der Inhalt der Zelle A2 eingetragen, und nicht der Blattname usw. Der Blattname steht beim Bezug.
Mal schauen, was ich noch finde. Muss jetzt erst mal weg, meine Frau bekommt ein neues Nasenfahrrad
Grüße, Andre
Anzeige
AW: Namensvergabe per VBA
02.02.2009 18:36:00
Boris
Also bei mir funktioniert der Originalcode einwandfrei. Meine Sheets und die Überschriften enthalten allerdings auch keine Leerzeichen, sondern nur _. Mehr kann ich dazu leider auch nicht sagen, da ich wie schon erwähnt den Code nicht ganz verstehe.
Ich vermute allerdings, dass es einen erheblichen Unterschied macht, ob man einer Zelle einen Namen gibt oder ob man dort eine Formel (wie mit indirect gewünscht) eingibt.
Ich mache das ganze aus folgendem Grund: In Zelle K1 steht "2008", in Zelle K2 baue ich automatisch einen Bezug zusammen, also z.B. Umsatz_BRD!$K$10:K$2349 (die Tabelle fängt in Zeile 10 an und wird nach unten variabel erweitert). Über die Namensvergabe kann ich nun von jedem anderen Blatt aus z.B. Summe(indirect(Umsatz_BRD.2008)) rechnen lassen, unabhängig davon, ob sich in Umsatz_BRD Spalten ändern und Zeilen gelöscht/hinzugefügt werden.
Vielleicht kann man dies ja auch anders lösen.
Boris
Anzeige
AW: Namensvergabe per VBA
02.02.2009 20:17:00
schauan
Hallo Boris,
mit dem INDIREKT muss ich erst mal passen. Name steht nicht in der "normalen" Namensliste, da weiß ich im Moment nicht, wie ich da ran komme.
Mit der Buttongeschichte kannst DU aber den Originalpart, fast wie ich gepostet habe, einsetzen. Nur "meine" Änderung muss wieder raus. ALso so:

Sub AddNames(ByVal Sh As Object, ByVal Target As Range)
Dim n As Name
If Application.CountIf(Sh.Rows(1), Target) > 1 Then
Application.Undo
Else
On Error Resume Next
Set n = ThisWorkbook.Names.Item(Target.Offset(1, 0).Name.Name)
On Error GoTo 0
If Not n Is Nothing Then n.Delete
If Target  "" Then Target.Offset(1, 0).Name = Sh.Name & "." & Target
End If
End Sub


Das ButtonClick muss natürlich ein ... Commandbutton1_Click ... sein, da ist nur die eine Zeile relevant wo das Makro AddNames aufgerufen wrd ...
Grüße, ANdre

Anzeige
AW: Namensvergabe per VBA
03.02.2009 09:30:00
Boris
Hm, ok, schade... danke trotzdem, die "Modul-Lösung" habe ich schon gestestet, funktioniert auch so.
Nochmal zu der Button-Geschichte: das war eigentlich anders gemeint. Ich hätte gerne ein Modul mit einem Makro, so ähnlich wie Dein Vorschlag, das ich manuell aufrufen kann. Das Ergebnis soll das gleiche sein wie mit WorksheetChange. Die Namen sollen aber nicht während der Eingabe vergeben werden, sondern erst zu einem späteren Zeitpunkt, eben wenn das Makro manuell aufgerufen wird.
Gibt es hierzu eine Lösung?
Boris

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige