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

Aus einer Formel mit Zellbezug die unterformel abg

Aus einer Formel mit Zellbezug die unterformel abg
13.11.2018 17:17:39
Florian
Hallo liebe Leute,
Ich knacke gerade an einem Kleinen... Größeren....Problem.
Ich würde gerne aus einer Formel in z.b. B1, die Formel extrahieren... gut kein Problem.
Sagen wir es kommt raus A1+A2.
Jetzt weiss ich aber das A1 und A2 selber Formeln sind, Welche Z.b. u.a. per Sverweis selber auf eine Formel referenzieren.
Meine Idee:
Ich gehe die Formel aus B1 als String Zeichen für Zeichen durch bis ich die Kombination Buchstabe...Nummer...Sonderzeichen(Ende) habe.
Und ziehe mir einen neuen String A1 und prüfe ob hier Felder angesprochen werden, welche selber eine referenzierende funktion sind, bis ich am Ende aus der Formel und Unterformel eine lange einzelne Formel habe.
Quasi die Formel mit der Formel ohne referenzierende zellbezeichnung.
FRAGE: Habt Ihr eine einfachere Idee?...
Vielen Dank für euer Feedback =)
MfG
Ich
P.s. Code gibt es noch nicht bin noch am Ideensammeln

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Na, dann viel Erfolg, ...
13.11.2018 20:20:13
Luc:-?
…Florian,
denn das hat ein großes Aufwandspotenzial! Hoffentlich willst/musst du nicht noch bis Weihnachten fertig wdn… ;-]
Normalerweise benötigt man so etwas ja nicht für DokuZwecke, sondern nur, wenn man Fmln zusammenfassen will. Und da reicht allemal manueller Ersatz von Adressen durch Fmln (lt Zelle bzw Doku).
Ansonsten könnte das wohl so aussehen (ZellInhalte des Musters als MatrixKonstanten angezeigt):
Daten A1:L5:={2.8.""."beta"."alpha".1.""."eta"."vau".6."".10;"".""."".""."beta".2."".""."zeta".7.""."";"".""."".""."gamma".3."".""."eta".8.""."";
"".""."".""."delta".4."".""."theta".9.""."";"".""."".""."epsilon".5."".""."iota".10."".""}
Fmln A7:B13:={"L1"."=SUMME(A1;B1)";"A1;B1"."=SVERWEIS(D1;E1:F5;2;FALSCH)";""."=SVERWEIS(H1;I1:J5;2;FALSCH)";"D1;E1:F5"."beta";
""."alpha";"".5;"=SUMME(SVERWEIS(D1;E1:F5;2;FALSCH);SVERWEIS(H1;I1:J5;2;FALSCH))".""}

Die Fmln dazu sähen dann so aus (mit zT ersetzbaren UDFs):
A8:=AList(INDIREKT(A7);;";";;1)
A10:=TEIL(LINKS(B8;VLike(B8;"*#[;:]*#*";-1));VLike(B8;"*(*";1)+1;LÄNGE(B8))
A13: {=WECHSELN(B7;A8;VJoin(RECHTS(B8:B9;LÄNGE(B8:B9)-1);";"))}
B7:=TextOf(INDIREKT(A7);2)
B8:=TextOf(INDIREKT(Splint(A$8;";";ZEILE(A1);;1));2)
B9:=TextOf(INDIREKT(Splint(A$8;";";ZEILE(A2);;1));2)
B10:=TextOf(INDIREKT(Splint(A$10;";";ZEILE(A1);;1));2)
B11:=TextOf(INDIREKT(Splint(A$10;";";ZEILE(A2);;1));2)
B12:=TextOf(INDIREKT(Splint(A$10;":";1;1;1));2)
Außer AList sind alle UDFs im Archiv vorhanden, können ggf aber auch anderweitig ersetzt wdn.
Das soll hier auch nur als Anregung dienen, was alles zu beachten wäre.
Bin allerdings in den nächsten Tagen höchstwahrscheinlich hier nicht präsent.
🙈 🙉 🙊 🐵 Gruß, Luc :-?
„Die Intelligenzmenge ist auf diesem Planeten eine Konstante, die Bevölkerung nimmt aber zu!“ Auch deshalb informieren mit …
Anzeige
AW: Aus einer Formel mit Zellbezug die unterformel abg
13.11.2018 21:41:33
Daniel
Hi
hier mal ein Ansatz, für eine Ermittlung der Zellbezüge per VBA.
Theoretisch gäbe es dafür auch die Funktion Range("B1").Precedessors, aber die scheint mir für deine Zwecke eher ungeeignet, weil sie nur Zellbezüge auf dem eigenen Tabellenblatt erkennen kann und Zellbezüge zusammenfasst, dh wenn du einen Bezug auf A1 und A2 hast, macht das Precedessors aus den Einzelzellen den Bereich A1:A2 und das ist für das was du vor hast nicht brauchbar.
1. lese die Formel in einen Textstring ein
2. ersetzte jedes Zeichen, welches vor oder nach einem Zellbezug stehen kann, durch die Zeilchenfolge: Trennzeichen - Zeichen - Trennzeichen
das Trennzeichen sollte ein Zeichen sein, welches ansonsten im Formeltext nicht vorkommt.
Beipsiel, ersetze:
( durch |(|
) durch |)|
+ durch |+|
- durch |-|
ob jetzt , oder ; ersetzt werden muss, hängt davon ab ob du lieber international mit .Formula oder national mit .FormulaLocal arbeitest
den Doppelpunkt solltest du nicht ersetzen.
3. Teile den String mit der Funktion Split in ein Array auf.
4. setze eine Prüfvariable auf False
5. laufe mit einer Schleife über die Elemente des Arrays
5.1 prüfe, ob der Teiltext eine Zelladresse sein könnte. das geht am einfachsten, wenn du im On-Error-Resume-Next-Modus versuchst, den Text in die Range-Funktion einzusetzten und das ganze einer Range-Variable zuzuweisen.
ob das funktioniert hat, kannst du anhand der Variable err überprüfen. wenn es einen Fehler gab, ist err 0
Wenn es funktioniert hat, hast du die referenzierte Zelle gleich in der Rangevariablen für die weitere Bearbeitung.
oder man prüft mit IsNothing, ob die Übergabe geklappt hat.
5.2 wenn die Übergabe in eine Range-Variable geklappt hat, prüfe mit .Count, ob es sich um eine Einzelzelle oder einen Zellbereich handelt. Das Austauschen des Zellbezugs durch die Formel ist nur bei einer Einzelzelle sinnvoll
5.3 prüfe, ob der Zellbezug auf ein anderes Tabellenblatt verweist. Das prüfst du einfach in dem du abfragst ob ein Ausrufezeichen enthalten ist. Wen ja, hast du ein Problem.
5.4 ermittle die Formel des Zellbezugs und schreibe die Formel ohne das erste gleichheitszeichen anstelle der Adresse ins Array.
Sollte der Zellbezug auf ein anderes Tabellenblatt verweisen, müsstest du in dieser Formel vor allen Zellbezügen, die kein Tabellenblatt davor stehen haben, das Tabellenblatt ergänzen (dann wirds aufwendig)
5.5 setze die PrüfVariable auf TRUE wenn du einen Zellbezug gefunden und ersetzt hast und der Ersatz auch wieder eine Formel war und kein Fixwert
5. wenn die Schleife durchgelaufen ist, setze das Array wieder mit JOIN und ohne Trennzeichen zu einer Formel zusammen.
6. Prüfe, ob deine Prüfvariable TRUE ist und wiederhole den Vorgang ab 2. (DO-Schleife)
7. wenn alle ersetzbaren Zellbezüge ausgetauscht wurden (Prüfvariable ist False), schreibe den Formeltext in die Zelle zurück.
das mal so als Ansatz.
Reicht dir das, um daraus einen Code zu stricken (bei VBA-Gut solltest du damit was anfangen können)?
Wenn du irgendwo stecken bleibst, kannst du ja wieder fragen.
wie gesagt, problematsich wirds, wenn du eine Zellreferenz auf ein anderes Tabellenblatt hast, und dort wieder eine Formel steht. Die Formel ziehst du dir dann ja in ein anderes Tabellenblatt und müsstest dann in allen Zellbezügen, die kein Tabellenblatt voranstehen haben, das alte blatt zum Zellbezug hinzufügen, damit weiterhin die richtigen Zellen referenziert werden.
Zellbezüge, die mehr als eine Zelle umfassen, solltest du natürlich auch nicht durch die Formel oder Werte ersetzen, sondern so stehen lassen.
Gruß Daniel
Anzeige
könnte als Code so aussehen:
13.11.2018 22:48:20
Daniel

Sub FormelnWandeln()
Dim Zelle As Range
Dim Bereich As Range
Dim arr
Dim i As Long
Dim FormelHinzu As Boolean
Dim FO As String
Const Z As String = "()+-*/=> 1 Then '-- keine Trennzeichen
Set Bereich = Nothing
On Error Resume Next
Set Bereich = Range(arr(i))
On Error GoTo 0
If Not Bereich Is Nothing Then '--- prüfen, ob Zellbereich
If Bereich.Count = 1 Then '--- nur Bezüge auf Einzelzellen
If Bereich.HasFormula Then
If Bereich.Worksheet Is Zelle.Worksheet Then '--- nur im gleichen  _
Blatt
arr(i) = Mid(Bereich.FormulaLocal, 2)
FormelHinzu = True
End If
Else
Select Case VarType(Bereich.Value)
Case vbDouble, vbBoolean
arr(i) = Bereich.Value
Case vbString
arr(i) = """" & Bereich.Value & """"
Case Else
End Select
End If
End If
End If
End If
Next i
FO = Join(arr, "")
Loop While FormelHinzu
Zelle.FormulaLocal = FO
Next
End Sub

funktioniert so erstmal nur für normale Formeln und nicht für Array-Formeln
ausgetauscht werden nur Zellbezüge auf Einzelzellen, es macht keinen Sinn, ein A:A durch die Werte zu ersetzen.
Besteht ein Bezug auf ein anderes Tabellenblatt, so wird der Bezug nur dann ersetzt, wenn er auf einen festen Wert verlinkt. Geht der Link auf eine andere Formel, findet kein Austausch statt, weil dann in der eingefügten Formel die Zellbezüge alle nochmal überarbeitet und ggf mit dem Tabellenblatt ergänzt werden müssten. Das ist dann eine extraaufgabe.
Gruß Daniel
Anzeige

308 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige