Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Phänomen Application.Caller.Address?

Forumthread: Phänomen Application.Caller.Address?

Phänomen Application.Caller.Address?
08.10.2006 07:50:20
Stefan
Hallo,
jetzt wirds kniffelig.
Ich habe eine Zellfunktion die folgendermaßen aussieht:

Function returnPos()
range(Application.Caller.Address).ID = Application.Caller.Address
returnPos = Application.Caller.Address
End Function

Was die Funktion macht, ist die aktuelle Adresse der Zelle in die
ID-Eigenschaft sowie in den Rückgabewert der Zelle zu speichern.
Auf dem Worksheet zeigen Zellen mit dieser Funktion ihre eigene
Position an. Soweit so gut.
Ich habe jetzt sagen wir auf A1 eine solche Zelle und kopiere
diese - wichtig - per Rechtsklick kopieren/einfügen z.B. 3mal nach
rechts, sodass es insgesamt 4 Zellen nebeneinander gibt.
Anzeige: $A$1 $B$1 $C$1 $D$1
Nun geht es eigentlich weniger um den angezeigten Rückgabewert,
sondern den ebenfalls dynamisch abgespeicherten ID-Wert (s.oben),
der sich durch das Kopieren ja ebenfalls dynamisch ändern müsste.
Für $B$1 stimmt das auch, Activecell.ID ergibt hier "$B$1", allerdings
haben alle Zellen-IDs weiter rechts auch "$B$1" !?
Das Phänomen tritt nicht auf, wenn ich die Zellen hoch oder runter kopiere,
sondern nur bei links/rechts. Noch komischer ist, dass es beim alternativen
Kopieren (Ziehen am "Plus" einer Zelle, unten rechts) generell funktioniert.
Egal welche Richtung.
Kann jemand mir das erklären? Meine Anwendung ist auf einen
solchen unsichtbaren "Zell-Speicher" angewiesen...
Danke & Gruss
Stefan
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Phänomen Application.Caller.Address?
08.10.2006 09:54:18
Kurt
Hi,
das ist nicht nachvollziebar!
Diese Zeile:
range(Application.Caller.Address).ID = Application.Caller.Address
erfüllt in der Funktion keine Aufgabe und kann daher entfallen.
mfg Kurt
AW: Phänomen Application.Caller.Address?
08.10.2006 10:11:38
Reinhard
Hi Kurt,
ich kannte ID nicht, aber laut Hilfe kommt ID bei als Html gespeicherten Excelzellen zum Tragen, habe das nun nicht ausprobiert.
Was ich ausprobiert habe ist der nachfolgende Code. Sehr seltsam das Ganze. Ich habe XL2000.
Bei F5 hängt sich Excel auf und ich muss es per Taskmanager (WinXP) abschiessen. Mit F8 läuft es durch und bestätigt die Aussagen des Anfragers. Nach links und rechts kopieren ist unterschiedlich zu nach oben/unten.
Interessant ist, setze ich bei dem For der ersten For-Schleife einen Haltepunkt und drücke F5 so kommt Fehler 424, Objekt fehlt o.ä. und die vierte Funktion, also returnPos4, wird gelb markiert.
Ich setze die Frage auf noch offen a) wegen dem Anfrager, b) weil ich darum bitte dass jemand den Code testet ob bei ihm das gleiche Fehlerverhalten wie bei mir auftritt, Danke im Voraus dafür.
Option Explicit
Sub test()
Dim Ze As Range
Worksheets("Tabelle1").Activate
Range("D3").FormulaLocal = "=returnPos()"
Range("D3").Copy Destination:=Range("A3:C3") 'links
Range("D3").Copy Destination:=Range("D1:D2") 'oben
Range("D3").Copy Destination:=Range("E3:H3") 'rechts
Range("D3").Copy Destination:=Range("D4:D6") 'unten
For Each Ze In ActiveSheet.Range("A1:H6")
Ze.Offset(10, 0) = Ze.ID
Next Ze
Worksheets("Tabelle2").Activate
Range("D3").FormulaLocal = "=returnPos2()"
Range("D3").Copy Destination:=Range("A3:C3") 'links
Range("D3").Copy Destination:=Range("D1:D2") 'oben
Range("D3").Copy Destination:=Range("E3:H3") 'rechts
Range("D3").Copy Destination:=Range("D4:D6") 'unten
For Each Ze In ActiveSheet.Range("A1:H6")
Ze.Offset(10, 0) = Ze.ID
Next Ze
Worksheets("Tabelle3").Activate
Range("D3").FormulaLocal = "=returnPos3()"
Range("D3").Copy Destination:=Range("A3:C3") 'links
Range("D3").Copy Destination:=Range("D1:D2") 'oben
Range("D3").Copy Destination:=Range("E3:H3") 'rechts
Range("D3").Copy Destination:=Range("D4:D6") 'unten
For Each Ze In ActiveSheet.Range("A1:H6")
Ze.Offset(10, 0) = Ze.ID
Next Ze
Worksheets("Tabelle4").Activate
Range("D3").FormulaLocal = "=returnPos4()"
Range("D3").Copy Destination:=Range("A3:C3") 'links
Range("D3").Copy Destination:=Range("D1:D2") 'oben
Range("D3").Copy Destination:=Range("E3:H3") 'rechts
Range("D3").Copy Destination:=Range("D4:D6") 'unten
For Each Ze In ActiveSheet.Range("A1:H6")
Ze.Offset(10, 0) = Ze.ID
Next Ze
End Sub
Function returnPos()
Range(Application.Caller.Address).ID = Application.Caller.Address
returnPos = Application.Caller.Address
End Function
Function returnPos2()
Range(Application.Caller.Address).ID = Application.Caller.Address(0, 0)
returnPos2 = Application.Caller.Address(0, 0)
End Function
Function returnPos3()
Range(Application.Caller.Address).ID = Application.Caller.Address
returnPos3 = Application.Caller.Address(0, 0)
End Function
Function returnPos4()
Range(Application.Caller.Address).ID = Application.Caller.Address
returnPos4 = CStr(Application.Caller.Address(0, 0))
End Function

Gruß
Reinhard
ps: Ich freue mich über eine Rückmeldung ob diese Antwort hilfreich war oder nicht..
Anzeige
AW: Phänomen Application.Caller.Address?
08.10.2006 18:05:34
Stefan
Danke für die Antworten.
@Reinhard: Bei mir schmiert Excel auch ab, allerdings erst ab dem 4.Tabellenblatt.
Wenn ich das weglasse, kommen die erzeugten und kopierten Werte, allerdings gibts immer noch das Problem, dass die "vertikalen" Zellen die falsche ID haben.
@Stefan: Danke für den Code. Habs ausprobiert. Die Anzeige (Rückgabewert) ist korrekt,
aber auch hier ist der ID-Wert der Zellen rechts und links der Originalzelle nicht wie erwartet.
Tja, weiss jetzt auch nicht weiter...gibts bei MS immer noch 100€ für nen Bug?
Teilen wir uns! ; |
Anzeige
AW: Phänomen Application.Caller.Address?
08.10.2006 14:31:29
Stefan
Hallo Stefan,
Weiss zwar nicht warum, aber so geht's bei mir:
Public

Function returnPos()
Dim myAddress As String
Dim myRange As Range
myAddress = Application.Caller.Address
Set myRange = Range(Application.Caller.Address)
myRange.ID = myAddress
returnPos = myAddress
End Function

Schoene Gruesse
Stefan
Anzeige
;
Anzeige

Infobox / Tutorial

Umgang mit Application.Caller.Address in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu, indem du mit der rechten Maustaste auf "VBAProject" klickst und "Einfügen" > "Modul" wählst.

  3. Kopiere den folgenden Code in das Modul:

    Public Function returnPos() As String
       Dim myAddress As String
       Dim myRange As Range
       myAddress = Application.Caller.Address
       Set myRange = Range(myAddress)
       myRange.ID = myAddress
       returnPos = myAddress
    End Function
  4. Schließe den VBA-Editor und gehe zurück zu deinem Arbeitsblatt.

  5. Verwende die Funktion =returnPos() in einer Zelle.

Diese Funktion gibt die Adresse der Zelle zurück, von der sie aufgerufen wurde, und speichert diese auch in der ID-Eigenschaft der Zelle.


Häufige Fehler und Lösungen

  • Fehler 424: Objekt fehlt
    Dieser Fehler kann auftreten, wenn die Application.Caller-Adresse ungültig ist. Stelle sicher, dass die Funktion aus einer Zelle aufgerufen wird und nicht aus dem VBA-Editor.

  • ID-Werte stimmen nicht überein
    Wenn die IDs in Zellen nach einem Kopieren nicht korrekt aktualisiert werden, kann es an der Richtung des Kopierens liegen. Dies geschieht häufig bei horizontalem Kopieren. Teste die Funktion mit vertikalem Kopieren.

  • Excel stürzt ab
    Bei Verwendung bestimmter Excel-Versionen, wie z.B. Excel 2000, kann es zu Abstürzen kommen. In solchen Fällen kann es helfen, die Version zu aktualisieren oder den Code schrittweise auszuführen (F8).


Alternative Methoden

Eine alternative Methode zur Verwendung von Application.Caller ist die Verwendung von ActiveSheet.Buttons(Application.Caller), um auf die Schaltfläche oder das Steuerelement zuzugreifen, das die Funktion aufruft. Diese Methode kann hilfreich sein, wenn Du mit Schaltflächen in Deinem Arbeitsblatt arbeitest.


Praktische Beispiele

Hier sind einige Beispiele, wie Du Application.Caller in verschiedenen Szenarien verwenden kannst:

  1. Dynamisches ID-Management:

    Function returnDynamicID() As String
       Dim cell As Range
       Set cell = Range(Application.Caller.Address)
       cell.ID = Application.Caller.Address
       returnDynamicID = cell.ID
    End Function
  2. Zellen in einem Bereich aktualisieren:

    Sub UpdateIDs()
       Dim Ze As Range
       For Each Ze In ActiveSheet.Range("A1:B10")
           Ze.ID = Ze.Address
       Next Ze
    End Sub

Diese Beispiele zeigen, wie application.caller effektiv genutzt werden kann, um Zellen dynamisch zu verwalten.


Tipps für Profis

  • Verwende Option Explicit am Anfang Deines Moduls, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler zu vermeiden.
  • Teste den Code immer in einer Kopie Deiner Arbeitsmappe, um unerwartete Abstürze zu vermeiden.
  • Berücksichtige, dass die Application.Caller-Funktion empfindlich auf Kopier- und Einfügevorgänge reagiert. Überlege, ob Du die Funktion anpassen musst, um die IDs korrekt zu speichern.

FAQ: Häufige Fragen

1. Was ist Application.Caller?
Application.Caller ist eine VBA-Funktion, die die Adresse der Zelle zurückgibt, von der eine Funktion aufgerufen wurde.

2. Warum funktioniert Application.Caller.Address nicht bei horizontalem Kopieren?
Dies liegt daran, dass Excel die IDs der Zellen nicht korrekt aktualisiert, wenn sie horizontal kopiert werden. Teste es mit vertikalem Kopieren oder ändere die Logik Deiner Funktion.

3. Wie kann ich Fehler beim Ausführen meiner VBA-Funktion beheben?
Verwende die Debugging-Tools in VBA, um den Code schrittweise auszuführen und die Ursache für den Fehler zu identifizieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige