4.3k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo,

Ich suche eine Möglichkeit per VBA herauszufinden, ob die Zelle XY in Tabelle Z an einer anderen Stelle in einer Formel verwendet wird.

Hintergrund: Ich möchte überprüfen, ob ich eine bestimmte Zelle löschen kann. Hierzu müsste ich wissen, ob der Wert diese Zelle in einer anderen Tabelle bzw. Zeile/Spalte für eine Berechnung verwendet wird.

Falls es sowas in der Art gibt, wäre ich dankbar für eine Info!

mfg
atogis

6 Antworten

0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

ein Lösungsvorschlag aus EXcel heraus,

"Extras""Formelüberwachung""Spur zum Nachfolger" wird da nichts angezeigt, kann der Wert gelöscht werden. Könnte man als VBA aufzeichnen und mit einem Button steuern.

Gruß

Helmut
0 Punkte
Beantwortet von
Danke für die Antwort, in einem Einzelfall würde diese Funktion super weiterhelfen.
Aber da die Tabellen später von Anwender bearbeitet werden sollen,
hätte ich gerne das alles automatisch überprüft wird, und nur wenn keine Fehler erkannt werden, das Löschen der Zelle über einen Button freigeschalten wird.

mfg
atogis
0 Punkte
Beantwortet von m-o-m Mitglied (499 Punkte)
Hallo atogis,

sofern die Zelle immer dieselbe ist kannst Du doch über ALT+F8 ein Makro wie Saarbauer vorgeschlagen hat selbst machen und das mit einer Tastenkombination oder Icon verknüpfen. Dann können das auch andere Leute machen.

Gruß Maik
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo atogis,

schau mal auf meiner HP in der Rubrik Beispieldateien und dort dann in dem Beispiel 29 nach. Dort stelle ich dazu ein(e) Beispiel(datei) zur Verfügung, die Dir sicherlich helfen wird.

Bei Fragen melde Dich.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von
Hi,

Basierend auf den vorangegangenen Vorschlägen ("Spur zum Nachfolger") habe ich versucht das ganze zu automatisieren.
Angefangen habe ich dabei mit der Range.Dependents-Eigenschaft, welche ein Range-Objekt mit allen von der Quelle abhängigen Zellen zurückgibt. Haken dabei: Die Eigenschaft funktioniert nur für das aktive Blatt. Sind also Zellen anderer Tabellen der aktiven Mappe von der Quelle abhängig, werden diese nicht berücksichtigt.

Also mußte ein WorkAround her:
Dabei half mir die Range.ShowDependents-Methode. Diese schafft es auch Abhängigkeiten in anderen Tabellen der aktiven Mappe mittels Pfeil anzuzeigen. (Diese Methode ist nichts anderes als der von Helmut (Saarbauer) aufgezeigte Weg ("Extras", "Formelüberwachung", "Spur zum Nachfolger").)
Da die bei dieser Methode entstehenden Pfeile in der Shapes-Auflistung auftauchen, lassen sie sich auch zählen. Im nachfolgenden Macro wird also beim Eintritt die Anzahl aller Shapes ausgelesen. Anschliessend werden "Nachfolger gesucht" um nun wieder die Anzahl der Shapes auszulesen. Sind nun Spurpfeile zu Nachfolgern vorhanden ist die Anzahl also größer als beim Eintritt in das Macro. Nun werden die Pfeile wieder entfernt, und der "Lösch"-Button deaktiviert...
Das Macro sieht dann bei mir hier aus wie folgt:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim lngShapes As Long, lngShapes2 As Long 'Variablendefinition
Dim rngZelle As Range 'Variablendefinition
Application.EnableEvents = False 'Events abschalten
Application.ScreenUpdating = False 'Schirmaktualisierung abschalten
lngShapes = ActiveSheet.Shapes.Count 'Anzahl Shapes zwischenspeichern
For Each rngZelle In Target 'alle Zellen in "Target" durchlaufen
With rngZelle
.ShowDependents 'evtl. vorhanden Spurpfeile zeichnen
lngShapes2 = ActiveSheet.Shapes.Count 'Anzahl Shapes erneut auslesen
If lngShapes < lngShapes2 Then 'wenn neue Shapes vorhanden-> Nachfolger vorhanden
.ShowDependents Remove:=True 'diese wieder löschen
CommandButton1.Enabled = False 'LöschButton deaktivieren
Application.EnableEvents = True 'Events einschalten
Application.ScreenUpdating = True 'Schirmaktualisierung wieder einschalten
Exit Sub 'und raus aus dem Macro
End If
End With
Next
'wenn keine Zelle in "Target" Nachfolger hat
CommandButton1.Enabled = True 'LöschButton aktivieren
Application.EnableEvents = True 'Events einschalten
Application.ScreenUpdating = True 'Schirmaktualisierung wieder einschalten
End Sub


Der dabei verwendete CommandButton1 ist eine direkt in Tabelle eingefügte "Befehlsschaltfläche" aus den ActiveX-Steuerelementen.

Bye
malSchauen
0 Punkte
Beantwortet von
Hallo vielen Dank für die zahlreichen Antworten!
Leider konnte ich das Problem damit nicht lösen.

Ich bin jetzt wie folgt vorgegangen:

Anzahl aller in der Arbeitsmappe aktuell angezeigt Fehler (also #BEZUG, #WERT, usw) zählen.
Das funktioniert über

Cells.SpecialCells(xlFormulas, xlErrors).Select
selection.count

anschließend habe ich die Zellen gelöscht und nochmals die Fehler über den gleichen Befehl zählen lassen.
Hat sich die Fehleranzahl erhöht, wird die Arbeitsmappe ohne zu speicher geschlossen und anschleißen neu geladen. Dadurch wird die Änderung rückgängig gemacht und alle Bezüge stimmen wieder.

Über eine zusätzliche Schleife können auch die Zelladressen, die den Fehler beinhalten ausgegeben werden

dim Zelle as range
For each Zelle in selection
debug.print Zelle.Address
Next

mfg
atogis
...