none
Excel VBA Range auf Zelle, die die Function enthält RRS feed

  • Frage

  • Hallo, NG,

    ich muss viele Functions basteln, die ich großenteils wie die eingebauten einsetze. Ist es ok, wenn ich den Bereich, in dem die Function steht, als Range definiere?

    Function TestRange()
       Dim rngSelection as Range
       Set rngSelection = selection
       ...
    End Function
       

    Ist das ok oder bastle ich mir da einen Zirkelbezug? Ich brauche die Range nur, um die aktuelle Zeile oder Spalte zu greifen, d. h. ich greife auf rngSelection nur über rngSelection.Offset(,1) oder rngSelection.Row, etc zu.

    Danke für Eure Tipps.

    Gruß

    Susanne


    Mittwoch, 24. Juli 2019 11:22

Alle Antworten

  • Ein Range-Objekt beschreibt einen Bereich auf einem Sheet.
    Die Selection kann sowohl eine Zelle als auch ein Bereich von Zeilen/Spalten umfassen.
    Der Zugriff auf eine Range erfolgt relativ zu seiner Basisadresse, also immer beginnend mit Zeile 1, Spalte 1, egal wohin die Selection gerade zeigt.

    Mit Zirkelbezug hat das noch nichts zu tun.

    Mittwoch, 24. Juli 2019 16:08
  • Hallo Susanne,

    das kommt darauf an, was Du damit machen willst und ob Du nur eine Zelle brauchst, oder eine Range und wozu Du das dann brauchst.

    Zunächst: Ein Zirkelbezug kommt daei nicht raus.

    Wenn Du eine Funktion bei einem Klick auf eine bestimmte Zelle auslösen willst, könntest Du so vorgehen:

     If Not Application.Intersect(Target, Worksheets("Bedienbuttons").Range("B3")) Is Nothing Then
            x = Worksheets("Bedienbuttons").Range("B3").Value
            If x <> "" Then
               Range("B5").Activate
               x = ""
               Worksheets("Bedienbuttons").Range("B4").Value = "yes"
             End If

     End If

    Der Code überwacht die Zelle B3 der Tabelle Bedienbuttons. Diese Zelle ist nicht leer, aber hat keinen Fokus. Solange nicht auf B3 geklickt wird, passiert nichts.

    Bekommt B3 den Fokus, z.B. durch draufklicken, wird der Inhalt von B3 der wariablen x zugewiesen, wodurch die if-Bedingung ausgelöst und die Funktion ausgeführt wird. 

    - B4 erhält den String "yes" als Inhalt

    - Der Fokus wird von B3 auf B5 gesetzt, das leer und ohne Funktion sein muss und x wird wieder leer gemacht. WICHTIG! Machst Du das nicht, oder ist B5 nicht leer, bekommst Du eine Endlosschleife.

    Der Code wäre ein Sub. Du kannst beliebig viele Subs schreiben und über den Klick auf eine Zelle Deiner Tabelle auslösen und so z.B. ein Menü konstuieren.

    Du kannst natürlich auch jeden anderen Code in die if-Bedingung schreiben, solange Du nicht vergißt, den Fokus umzusetzen und x wieder leer zu machen.

    Schöne Grüße

    Spockspockspock



    Fortschritt ist nicht, das Alte abzuschaffen, sondern das schlechte Alte durch etwas besseres zu ersetzen, das gute Alte aber zu erhalten, bis es etwas wirklich besseres gibt.


    Mittwoch, 7. August 2019 20:32
  • Hallo, 

    ich glaube, ich habe mich zu kompliziert ausgedrückt, bei meiner Funktion ist es so, dass von der Zelle aus, in der die Funktion eingegeben werden muss, einige Zellen erreicht werden müssen, also z. B. durch ActiveCell.Offset(1,1). Ich hatte den Eindruck, dass dieses Vorgehen die Berechnungen der Mappe sehr verlangsamt. Habe jetzt einfach in der Function die Zelle darüber abgefragt und die Bezüge (sicherheitshalber) auf diese abgefragte Zellrange gesetzt.

    Gruß

    Susanne

    Donnerstag, 8. August 2019 06:49
  • ActiveCell ist die falsche Verwendung, da dies immer die gerade selektierte Zelle ist!
    Steht die Formel z.B. auf A1 und du hast diei Zelle C4 markiert, berechnet Excel eben die Zelle D5!

    Berechnungen erfolgen aber immer nur dann, wenn sich der Wert einer Zelle ändert.
    Solange du also nur von einer Zelle in die nächste spingst oder sonstwie kreuz und quer über das Blatt hüpfst passiert da nichts.
    Erst wenn du in eine Zelle was eingibst werden alle Formeln, die einen Bezug dazu haben berechnet.
    Möchtest du einen relativen Bezug zu der Zelle, die die Formel enthält, kannst du mit der Funktion Adresse() einen relativen Bezug ausrechnen:
    https://support.office.com/de-de/article/adresse-funktion-d0c26c0d-3991-446b-8de4-ab46431d4f89

    Das ist insbesonders bei Matrixformeln interessant.
    https://support.office.com/de-de/article/erstellen-einer-matrixformel-arrayformel-e43e12e0-afc6-4a12-bc7f-48361075954d

    Donnerstag, 8. August 2019 08:24
  • Aber genau das ist doch mein Problem, ausgehend von der ActiveCell muss meine Function ihre Berechnungen machen, mit irgendwelchen fixen Adressangaben fange ich nichts an. Aber wie gesagt, ich habe das jetzt so gelöst, dass die Zelle über der in die Function eingegeben wird.
    Donnerstag, 8. August 2019 10:36
  • Ich kann mir i.M. keine Zell-Formel vorstellen, die auf ActiveCell zugreifen soll.
    In einem VBA-Makro könnte das schon eher sein.
    Donnerstag, 8. August 2019 11:07
  • Hallo? Ich habe gleich zu Anfang geschrieben, dass ich eigene Functions baue, d. h. VBA-Programmierung. In VBA kann man nämlich nicht nur Subroutinen bauen, sondern auch eigene Functions, die man entweder in den Subs verwendet oder aber wie die eingebauten Funktionen verwendet.
    Donnerstag, 8. August 2019 11:18
  • Ja klar, aber diese Funktion weist du doch anschließend einer Zelle zu und ActiveCell ist dann nicht die Zelle, aus der die Funktion aufgerufen wurde.
    Da ist dann "Application.Caller" die sichere Variante um relative Bezüge zu generieren.
    Caller enthält dann bei Matrixfunktionen den Bereich, der der Funktion zugeordnet wurde.
    In diesem Fall musst du dann als Ergebnis auch ein Array gleicher Größe zurückgeben.

    Da habe ich den Ursprungspost missverstanden.

    Donnerstag, 8. August 2019 11:35