Range mit Namen ansprechen?

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Range mit Namen ansprechen?

    Hallo zusammen,

    ich würde gerne aus Folgendem (Änderungsprotokollierung in einem PMO Tool):

    Visual Basic-Quellcode

    1. Set letzte_Zeile = Range("D19:IB" & Range("D" & Rows.Count).End(xlUp).Row)
    2. Set objRange = Intersect(Target, letzte_Zeile) ' Schnittmenge aus Target und definierten Spalten
    3. If Not objRange Is Nothing Then
    4. Application.EnableEvents = False 'notwendig damit Reaktion auf Änderungen nur einmal verfolgt wird
    5. For Each objCell In objRange
    6. Range("IC" & objCell.Row).Value = Date
    7. Range("ID" & objCell.Row).Value = Environ$("USERNAME") 'in der Zeile in der die änderung vorgenommen wurde wird Datum und Kennung geschrieben
    8. Next
    9. Application.EnableEvents = True ' wenn keine Änderung bleibt Schleife am Laufen
    10. End If
    11. für die Ranges IC und ID die entsprechenden Namen verwenden. Nur gibt das jedes Mal einen Fehler.. ?
    12. So sieht es dann aus:
    13. Range("ProtokollDatum" & objCell.Row).Value = Date
    14. Range("ProtokollNamen" & objCell.Row).Value = Environ$("USERNAME") 'in der Zeile in der die änderung vorgenommen wurde wird Datum und Kennung geschrieben


    Wieso frisst VBA das so nicht :evil: ?

    Codetags eingefügt. ~Trade

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Naja, die Ranges heißen "Protokolldatum1", "Protokolldatum2", "Protokolldatum3" ????
    Du kannst die Ranges über den Namen ansprechen. Willst du dann aber eine spezielle Zelle dieser Range ändern, dann musst du natürlich die Zelle wieder angeben. Also ZB:

    Visual Basic-Quellcode

    1. Range("ProtokollDatum").Value = Date '<- gesamte Zellen in der Range ändern
    2. Range("ProtokollDatum").Cells(1,1).Value = Date '<-linke obere Zelle der Range ändern
    3. Range("ProtokollDatum").Rows(1).Value = Date 'erste Zeile der Range ändern
    Das ist meine Signatur und sie wird wunderbar sein!
    Hi Mono!

    Danke erst mal! Ist nur leider nicht ganz, was ich machen möchte. Ich habe die Spalten IC und ID mit den Namen ProtokollDatum und ProtokollNamen versehen. Das Skript schreibt jetzt bei jeder Änderung in die jeweils benannte Spalte das aktuelle Datum und den Usernamen. Das klappt aber nur, wenn ich die Spalten mit IC und ID angebe - sobald ich die Namen verwende, streikt die Sache.. Syntax falsch, Namen dürfen nicht mit "& objCell.Row" kombiniert werden.. ?
    Ich verstehe einfach nicht, wieso eine Änderung von einer Spaltenbezeichnung (IC) in einen Namen (ProtokollDatum ) bewirkt, dass es nicht mehr funktioniert ?(
    Du hast meine Antwort offenbar nicht verstanden.
    Die Spaltenbezeichnung repräsentiert ja eine Range. Das heißt es gibt eine Range namens ProtokollDatum.

    Würdest du dann noch sagen wir Reihe 20 abfragen wollen (was als Excel Zelle IC20 wäre) dann würdest du nicht die Range ProtokollDatum abfragen sondern "ProtokollDatum" & 20 --> "ProtokollDatum20".
    Es gibt aber keine Range namens "ProtokollDatum20". Es gibt nur eine Range ProtokollDatum.
    Vorher war es Range("IC" & objCell.Row).Value. Das ergibt RANGE("IC" & 20) --> RANGE("IC20").
    Ergibt also Sinn.

    Möchtest du davon die Reihe 20 ändern, dann schreibst du maximal:

    Visual Basic-Quellcode

    1. Range("ProtokollDatum").Rows(20).Value = Date '20. Zeile der Range ändern
    Das ist meine Signatur und sie wird wunderbar sein!
    Stimmt wohl - und meine Frage war wohl auch zu ungenau definiert. Deine Antwort stimmt, wenn ich etwas spezielles abfragen möchte und genau weiss, was ich ändern möchte. Dies weiss ich aber nicht, daher definiere ich zuerst mal meine Range, die betrachtet werden soll so:

    Set letzte_Zeile = Range("D19:IB" & Range("D" & Rows.Count).End(xlUp).Row)
    Set objRange = Intersect(Target, letzte_Zeile) ' Schnittmenge aus Target und definierten Spalten

    Innerhalb dieser Range wird jetzt bei jeder Änderung in die Spalte IC der Zeile das aktuelle Datum und in die Spalte ID der Zeile der Username geschrieben:

    For Each objCell In objRange
    Range("IC" & objCell.Row).Value = Date
    Range("ID" & objCell.Row).Value = Environ$("USERNAME") 'in der Zeile in der die Änderung vorgenommen wurde wird Datum und Kennung geschrieben.

    Funktioniert auch einwandfrei. Gebe ich jetzt allerdings den Spalten IC und ID Namen lautet das Skript so:

    For Each objCell In objRange
    Range("ProtokollDatum" & objCell.Row).Value = Date
    Range("ProtokollNamen" & objCell.Row).Value = Environ$("USERNAME") 'in der Zeile in der die Änderung vorgenommen wurde wird Datum und Kennung geschrieben.

    Und schon klappt's nicht mehr.. ??