zorbas81
Goto Top

Rechenterm berechnen mit VBA (inkl. Substitution)

Hallo liebe Excel-Profis,

ich habe ein „Problemchen“ in VBA und hoffe auf Eure Hilfe face-smile

Folgende Problemstellung:

Im ersten Tabellenblatt sind verschiedenen Codes (Bsp: 650,750 etc.) unterschiedliche Zahlen zugeordnet (können auch Kommazahlen sein).
Im zweiten Tabellenblatt sind Rechenterme, die nur aus den Codes bestehen. Wenn man jetzt die Codes mit den Zahlen substituiert, kann man diesen Term hervorragend berechnen (siehe Beispiel unten)


Tabellenblatt 1:

Code zugeordn. Zahl
A1: 650 B1: 2
A2: 750 B2: 3
A3: 850 B3: 4
A4: 950 B4: 5


Tabellenblatt 2:

A1: 650*(750+850) B1: hier sollte das Ergebnis stehen (Ergebnis: 14)
A2: 750+850*950 B2: (Ergebnis: 23)
A3: 650+850*(750+950) B3: (Ergebnis: 34)

In Zelle B1, B2, usw. sollen dann mit Hilfe eines VBA-Makros diese Terme berechnet werden. Allerdings muss auf Punkt vor Strich geachtet werden.

Ich habe in allerlei Foren nach diesem Problem gesucht, etliche Internetseiten durchforstet und nichts gefunden! face-sad


Habt Ihr mir hierfür eine Lösung? Das wäre unglaublich Klasse!!!
Vielen lieben Dank im Voraus für Eure Bemühungen.

Viele Grüße
Alex aus Stuttgart

Content-Key: 116084

Url: https://administrator.de/contentid/116084

Printed on: April 26, 2024 at 15:04 o'clock

Member: ITLocke
ITLocke May 14, 2009 at 13:10:31 (UTC)
Goto Top
Mitglied: 76109
76109 May 14, 2009 at 13:33:16 (UTC)
Goto Top
Hallo Zorbas81,

ich setze mal voraus, dass Du VBA kannst.

Da sicherlich außer der Spalte B in Tabelle(2) alles andere erhalten bleiben sollen, würde ich es so machen:

Ein drittes temporäres Tabellenblatt verwenden (kann auch versteckt sein. Ansprechen per Set-Anweisung) oder andere Spalten?

1. Spalte A von Tabelle(2) in Tabelle(Temp) kopieren.

3. Spalte A von Tabelle(1) Zeile für Zeile durchlaufen lassen mit def IstZahl = Zelle "A?", SollZahl = Zelle "B?" und in Spalte A von Tabelle(Temp) mit Replace ersetzen.

4. Im Anschluß in Tabelle(Temp) in Spalte "B?" ist Formula = Inhalt "A?"

5. Von Tabelle(Temp) Spalte B nach Tabelle(2) Spalte B Werte übertragen.

Das sind mal so grob die Schritte wie's geht, vorausgesetzt ich habe Deinen Beitrag richtig verstanden.

Eventuell macht es auch Sinn, manche Funktionen anhand einer Makroaufzeichnung nachzuvollziehen.

Gruß Dieter
Member: Zorbas81
Zorbas81 May 14, 2009 at 14:00:47 (UTC)
Goto Top
Hallo Locke, Hallo Dieter,

Vielen lieben Dank für Eure Bemühungen, besonders Dieter. face-smile

ich werde gleich am Wochenende Eure Tips ausprobieren und am Montag hier
berichten was daraus geworden ist.

Vielen herzlichen Dank nochmal, und ein schönes Wochenende wünsche ich Euch.

Grüße
Alex
Member: bastla
bastla May 14, 2009 at 14:02:37 (UTC)
Goto Top
Hallo Zorbas81!

Versuch es mit folgendem Code:
Function Term(T As String)
Application.Volatile
Tabelle = "Tabelle1"  
Set Codes = Range(Tabelle & "!A:A")  
Set re = CreateObject("VBScript.RegExp")  
re.Global = True
re.Pattern = "\w+"  
For Each Match In re.Execute(T)
    Set a = Codes.Find(Match, LookIn:=xlValues, LookAt:=xlWhole)
    If Not a Is Nothing Then
        V = Range(Tabelle & "!" & a.Address).Offset(0, 1)  
        T = Replace(T, Match, V)
    End If
Next
Term = Evaluate(Replace(T, ",", "."))  
End Function
Erstelle dafür ein Modul und füge den Code dort ein - danach solltest Du zB in B1 der Tabelle2 folgende Formel verwenden können:
=Term(A1)
Vorausgesetzt habe ich, dass, wie in Deinem Beispiel, nur numerische Codes nur Codes aus Buchstaben und Ziffern verwendet werden (dazu in Zeile 7 "\d" durch "\w" ersetzt). Ob den Codes auch wirklich Zahlenwerte zugeordnet sind, wird allerdings nicht geprüft.

Grüße
bastla

[Edit] Da war ich ja mit einiger Verspätung unterwegs ... [/Edit]

[Edit2] Noch "Application.Volatile" nachgereicht und mit dem "Replace()" in Zeile 15 dafür gesorgt, dass tatsächlich auch Dezimalzahlen (mit "," anstelle von ".") verarbeitet werden können [/Edit2]

[Edit3] Auf Vorschlag von didi1954 "LookAt" dem "Find" hinzugefügt [/Edit3]
Member: Zorbas81
Zorbas81 May 14, 2009 at 14:20:46 (UTC)
Goto Top
Oh, Bastla treues Haus, ich grüße Dich face-smile

Echt schön von Dir zu hören, mein treuer Retter hier im Forum face-smile

Wow, das sieht ganz gut aus, werde das gleich mal testen und hier dann posten obs tut!

Tausend Dank Bastla!!!!!

Grüße
Alex
Mitglied: 76109
76109 May 14, 2009 at 14:35:07 (UTC)
Goto Top
Hallo bastla,

hast Du einen Fortbildungskurs gemachtface-smile

Dein RegExp scheint sehr effektiv zu sein und da ich jetzt auch weiß, wie ich das Ding in VBA einbinden kann, muss ich das mal testen.

Dabei fällt mir auf, dass die Parameter wohl in der "C"-Schreibweise angegeben werden müssen.

Gruß Dieter
Member: bastla
bastla May 14, 2009 at 14:41:24 (UTC)
Goto Top
@Didi1957
hast Du einen Fortbildungskurs gemachtface-smile
Wie kommst Du darauf - bin ja immer noch zu langsam ... face-wink
Dabei fällt mir auf, dass die Parameter wohl in der "C"-Schreibweise angegeben werden müssen.
Was meinst Du damit?

Grüße
bastla
Member: Zorbas81
Zorbas81 May 14, 2009 at 14:44:28 (UTC)
Goto Top
Hi Bastla,

der absolute Wahnsinn bist du, ES FUNKTIONIERT!
und zwar genau so wie du es beschrieben hast!!!

Danke Danke Danke!!! face-smile

Allerdings hab ich eine frage noch:

Wenn diese Excel-Datei offen ist, und ich eine andere Excel-Datei, die Makros enthält, öffne, kommt in der gesamten Spalte B in Tabelle 2 folgende fehlermeldung: "Wert".
Sobald ich die zelle B2 anklicke und enter drücke, ist alles wieder in Ordnung!!!

komisch oder? hmmmmmm keine Ahnung waerum!

Grüße
Alex
Member: Zorbas81
Zorbas81 May 14, 2009 at 14:55:17 (UTC)
Goto Top
hab oben geantwortet.... hasts gesehen? face-smile
Member: bastla
bastla May 14, 2009 at 14:59:40 (UTC)
Goto Top
Hallo Zorbas81!

Wenn diese Excel-Datei offen ist, und ich eine andere Excel-Datei, die Makros enthält, öffne, kommt in der gesamten Spalte B in Tabelle 2 folgende fehlermeldung: "Wert".
Sobald ich die zelle B2 anklicke und enter drücke, ist alles wieder in Ordnung!!!

komisch oder? hmmmmmm keine Ahnung waerum!
Liegt vermutlich daran, dass die Bezüge mit Range() in den Zeilen (jetzt) 4 und 11 nur Tabellennamen, aber nicht auch die Datei (Mappe) berücksichtigen und dann (vorübergehend) in der neu geöffneten Datei nach den Werten gesucht wird ...

Grüße
bastla
Mitglied: 76109
76109 May 14, 2009 at 15:07:34 (UTC)
Goto Top
Hallo bastla,

bei der Find-Anweisung würde ich empfehlen, die Option "LookAt:=xlPart" zu setzen, weil immer die gerade eingestellte Option verwendet wird. D.h. wenn in der Exceloberfläche eine Suche nach Wort eingestellt wird, dann funktioniert die Find-Funktion nicht mehr.

Gruß Dieter
Member: bastla
bastla May 14, 2009 at 15:10:43 (UTC)
Goto Top
@76109
Danke für den Hinweis - da ist aber sicher noch mehr zu optimieren (siehe oben) ...

Allerdings würde ich eher "xlWhole" verwenden - ich will ja nur Zellen finden, in denen der gesamte Code steht.

Grüße
bastla
Member: Zorbas81
Zorbas81 May 14, 2009 at 15:10:46 (UTC)
Goto Top
kann man das umgehen, indem man auch den namen der Mappe hineinschreibt?
Member: bastla
bastla May 14, 2009 at 15:15:01 (UTC)
Goto Top
Hallo Zorbas!

Besser so:
Function Term(T As String)
Application.Volatile
Set re = CreateObject("VBScript.RegExp")  
Tabelle = "Tabelle1"  
Spalte = "A"  
Set Codes = ThisWorkbook.Worksheets(Tabelle).Columns(Spalte)
re.Global = True
re.Pattern = "\w+"  
For Each Match In re.Execute(T)
    Set a = Codes.Find(Match, LookIn:=xlValues, LookAt:=xlWhole)
    If Not a Is Nothing Then
        V = a.Offset(0, 1)
        T = Replace(T, Match, V)
    End If
Next
Term = Evaluate(Replace(T, ",", "."))  
End Function
Grüße
bastla

[Edit] Auf Vorschlag von didi1954 "LookAt" dem "Find" hinzugefügt [/Edit]
Member: Zorbas81
Zorbas81 May 14, 2009 at 15:16:00 (UTC)
Goto Top
So, Bastla ich muss jetzt leider schon gehen,

morgen früh bin ich wieder hier, dann teste ich weiter face-wink

Nochmals VIELEN VIELEN DANK bastla, du bist der Hammer!!!

Grüße
Alex
Mitglied: 76109
76109 May 14, 2009 at 15:17:15 (UTC)
Goto Top
Hallo bastla,

Zitat von @bastla:
"C"-Schreibweise Was meinst Du damit?

ja, die Parameter "\n \r \w+ \r+" usw. sind Steuercodes in "C"-Programmiersprache

Zum Beispiel:
Printf-Bildschirmausgabe "\n\r" = Zeilenvorschub
Open-Dateifunktion = "\w+" oder "\r+" = Write/Read

Gruß Dieter

PS. Irgendwie haben wir jetzt aber ein Antwort-Durcheinanderface-smile
Member: bastla
bastla May 14, 2009 at 15:22:38 (UTC)
Goto Top
@76109

Die Codes für "Pattern" findest Du hier.
Open-Dateifunktion = "\w+" oder "\r+" = Write/Read
"\w+" bedeutet in diesem Zusammenhang allerdings "mindestens ein alphabetisches Zeichen oder ein Unterstrich" ...

Grüße
bastla
Mitglied: 76109
76109 May 14, 2009 at 15:25:58 (UTC)
Goto Top
Hallo bastla,

Zitat von @bastla:
Allerdings würde ich eher "xlWhole" verwenden - ich
will ja nur Zellen finden, in denen der gesamte Code steht.

ja, in dem Fall hast Du natürlich mit "xlWhole" recht.

Das liegt daran, dass ich den Code mit dem RegExp noch nicht verstanden habe.

Gruß Dieter

PS. Danke für den Link von weiter oben.
Member: bastla
bastla May 14, 2009 at 15:37:44 (UTC)
Goto Top
Hallo didi1954!

Mit RexExp wird der Term zerpflückt, indem alles, was kein Sonderzeichen darstellt ("\w") als Code interpretiert und daher durch den zugeordneten Zahlenwert ersetzt wird (wobei noch zu klären wäre, was mit nicht definierten Codes passieren soll - derzeit werden diese nämlich einfach nicht ersetzt und daher, wenn es sich um numerische Codes handelt, im Term als Konstante interpretiert und "mit verrechnet") ...
Das "LookAt" ergänze ich jedenfalls oben in beiden Versionen.

Grüße
bastla
Member: Zorbas81
Zorbas81 May 15, 2009 at 07:59:06 (UTC)
Goto Top
Guten Morgen bastla,

die zweite Version von Dir funktioniert jetzt hervorragend.
Beim Öffnen anderer Makro-Dateien gibt es jetzt keine Fehlermeldung mehr.

Super Sache bastla, wenn du jetzt in Stuttgart wärst, würden wir einen trinken gehen auf mich...
Ich danke Dir jedenfalls riesig für deine Mühe, Respekt!

In diesem Sinne, wünsche ich Euch allen hier drin ein schönes Wochenende und bis bald face-smile

Viele grüße
Alex
Mitglied: 76109
76109 May 15, 2009 at 21:36:32 (UTC)
Goto Top