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

Formellogik prüfen

Formellogik prüfen
Kristian
Hallo Excel Profis!
ich erstelle regelmäßig neue Tabellen mit zum Teil sehr komplexen Formeln. Ich suche jetzt ein Makro, das prüft, ob die Zellbezüge in der Formel, einen Bezug auf eine andere als die aktive ZEILE haben.
Beispiel
in A4 steht eine Formel, die sich auf dieverse Zellen in Zeile 4 (auch in anderen Arbeitsblättern derselben Tabelle) und auf eine Zelle in Zeile 5 bezieht. Falls das zutrifft, soll der Zellhintergrund z.B. Orange eingefärbt werden. Wenn sich alle Zeilenbezüge einer Formel auf die aktuelle Zeile beziehen, dann wird die nächste Zelle geprüft.
Das Makro sollte einmal alle Spalten einer Zeile durchlaufen.
Der Detektiv ist hier nicht geeignet, da die Tabelle zum Teil 60-80 Spalten haben.
Habt Ihr vielleicht einen Ansatz für so eine Prüfung?
Kristian
Ein Ansatz : JA !
12.10.2009 16:32:39
NoNet
Hallo Kristian,
in VBA existiert das Objekt "PRECEDENTS" (Vorgängerzellen), mit dem man prüfen kann, auf welche Zellen sich eine Formel/Funktion bezieht.
Einen Ansatz zur Verwendung findest Du in folgendem Thread (bitte auch den darin verlinkten Thread anschauen !!) :
https://www.herber.de/forum/archiv/1096to1100/t1098940.htm
Gruß, NoNet
AW: Ein Ansatz : JA !
12.10.2009 17:13:02
JogyB
Hi.
Pecedents gibt aber nur die Zellen aus demselben Tabellenblatt an. Für Bezüge zu anderen Tabellenblättern müßte man schauen, ob ein Ausrufezeichen außerhalb zweier Anführungszeichen (dann wäre es ein Text) vorkommt.
Teste mal das:
' testet die Vorgänger auf dem Tabellenblatt,
' ob sie _nicht_ in derselben Zeile sind
Function testPrec(testRng As Range) As Boolean
Dim myPrec As Range
' Überprüfen, ob es sich um eine Formel handelt
If Not testRng.HasFormula Then Exit Function
For Each myPrec In testRng.Precedents
If myPrec.Row  testRng.Row Then
testPrec = True
End If
Next
End Function
' Testet auf Bezüge außerhalb des Tabellenblattes
' Sucht in der Formel nach ! außerhalb eines Textblockes
Function testExternal(testRng As Range) As Boolean
Dim endAnf As Long
Dim anF As Long
Dim forMel As String
' Überprüfen, ob es sich um eine Formel handelt
If Not testRng.HasFormula Then Exit Function
forMel = testRng.Formula
' Anführungszeichen, das den vorigen Textbereich beendet
' Zu Beginn natürlich an Stelle 0
endAnf = 0
' Solange außerhalb von Textblöcken prüfen, bis kein
' weitere Anführungszeichen mehr gefunden
Do
' Anführungszeichen nach EndAnf suchen
anF = InStr(endAnf + 1, forMel, """")
' Kein Text in der Formel nach endanf, dann wird ein hypothetisches
' Anführungszeichen nach der Formel zugewiesen,
' damit bis zum Ende getestet wird
If anF = 0 Then anF = Len(forMel) + 1
' zwischen den Anführungszeichen testen
If InStr(Mid(forMel, endAnf + 1, anF - endAnf - 1), "!")  0 Then
testExternal = True
End If
' Anführungszeichen neu bestimmen
endAnf = InStr(anF + 1, forMel, """")
Loop Until endAnf = 0
End Function
' Testet alle Zellen der selektierten Zeile
' Auswahl einer Zelle in der Zeile reicht
Sub testRow()
Dim berEich As Range
Dim zeLLe As Range
' Wenn mehr als eine Zeile markiert, dann abbrechen
If Selection.Rows.Count > 1 Then
Call MsgBox("Bitte nur eine Zeile markieren!", vbCritical, "Fehler!")
Exit Sub
End If
' Gefüllten Bereich in der Zeile bestimmen
With Selection.EntireRow
Set berEich = .Resize(, .Cells(1, Columns.Count).End(xlToLeft).Column)
End With
' Alle testen und ggf. einfärben
For Each zeLLe In berEich.Cells
If testPrec(zeLLe) Or testExternal(zeLLe) Then
zeLLe.Interior.ColorIndex = 46
End If
Next
End Sub
Das Sub ganz unten wird ausgeführt.
Gruss, Jogy
Anzeige
@Jogy : Das wird in Jens' Beitrag alles überprüft
12.10.2009 17:42:15
NoNet
Hey Jogy,
dass PRECEDENTS nur die Bezüge auf dem aktuellen Blatt berücksichtigt hat Jens bereits in seiner Ausgangsfrage gepostet :
https://www.herber.de/forum/archiv/1096to1100/t1097223.htm#1097223
In seiner Lösung (siehe meinen Link oben) hat er dies daher auch berücksichtigt ;-)
Gruß, NoNet
AW: @Jogy : Das wird in Jens' Beitrag alles überprüft
13.10.2009 07:42:35
Jogy
Hi NoNet,
muss zu meiner Schande gestehen, dass ich den Link nicht angeschaut hatte.
Gruss, Jogy
AW: @Jogy : Das wird in Jens' Beitrag alles überprüft
13.10.2009 11:01:02
Kristian
Hallo zusammen,
vielen Dank für die schnellen Rückmeldungen. Ich mach mich jetzt mal an´s testen und werde berichten.
Precedents war mir noch nicht bekannt... :-)
Gruß
Kristian
Anzeige
@Jogy : *fgfg* - ohne Worte ;-) _oW
13.10.2009 11:08:25
NoNet
_oW = "ohne Worte"
AW: @Jogy : Das wird in Jens' Beitrag alles überprüft
13.10.2009 11:09:04
Kristian
HI,
ich habe die Lösung eben ausprobiert. Sie funktioniert sehr gut.
ABER ein Problem ist jetzt noch aufgetaucht. In meinen Formeln greife ich oft auf Bereichsnamen zu da ich mit vielen Variablen arbeite. Diese werden vom Makro jetzt ebenfalls als "falscher Bezug" identifiziert und entsprechend markiert.
Lässt sich das noch irgendwie ausschliessen?
LG
Kristian

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige