Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1080to1084
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
Excel Formel in VBA
marc

Moin zusammen,
wie kann ich folgende Excel Formeln in VBA umschreiben? Möglichst einfach, wenn möglich nicht  _
als irgendwelche Sub-Formeln...Applications...etc...
"WENN(C12>0;GRAD(ARCTAN2(C11;C12));360+GRAD(ARCTAN2(C11;C12)))"
"WENN(C21>0;GRAD(ARCTAN2(C20;C21));360+GRAD(ARCTAN2(C20;C21)))"
Habe es zuerst als IF...THEN...Variante versucht. Hat aber nicht geklappt. VBA meckert bei den  _
Klammern (C11; 12) bzw, (C20;21)...
Wäre nett wenn mir jemand helfen könnte.
Gruß
M.Vogel


9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Excel Formel in VBA
23.06.2009 10:20:16
ptonka
Hallo Marc,
einfach mal aufzeichnen:
ActiveCell.FormulaR1C1 = _
"=IF(RC[-1]>0,DEGREES(ATAN2(R[-1]C[-1],RC[-1])),360+DEGREES(ATAN2(R[-1]C[-1],RC[-1])))"
Gruß,
Ptonka
ActiveCell.FormulaLocal ...
23.06.2009 10:25:44
Matthias
Hallo
vorher die Zelle markieren:

Sub Aendern()
ActiveCell.FormulaLocal = "=WENN(C21>0;GRAD(ARCTAN2(C20;C21));360+GRAD(ARCTAN2(C20;C21)))"
End Sub


Gruß Matthias

AW: ActiveCell.FormulaLocal ...
23.06.2009 10:51:21
marc
hmmm....das Problem ist folgendes:
Die Werte für C11, 12, 20, 21 werden nicht aus einer Zelle geholt, sondern in einer VBA-Funktion vorher berechnet, bzw. definiert.
Die Funktion ist folgendermaßen aufgebaut: Sogenannte Startwerte durch die Funktion hindurch Schritt für Schritt berechnet. DIe Startwerte sind in Zellen gegeben und der Endwert (Schritt 25) wird ausgegeben.
Schritt1
Schritt2
.
.
.
Schritt n (=Formel wie oben erwähnt
.
.
Schritt25
Anzeige
damit kann ich nix anfangen ... oT
23.06.2009 11:02:38
Matthias
AW: damit kann ich nix anfangen ... oT
23.06.2009 11:33:20
marc

Jau...kann ich verstehen...Danke übrigens für die schnelle Antwort.
Ich versuch mal das, doch recht komplexe, Problem ausführlicher darzustellen.
Hier die gesamte Function:
Besagte Formeln befinden sich unter Schritt 7 und 11.
Startwerte sind L1, L2, a1, a2, b1, b2 (als Zellen vorhanden)
Ausgegeben wird dE2000 (in Zelle in der das Makro aktiviert wird)
Alle Werte "dazwischen" werden nur benötigt um von den Startwerten auf den Endwert zu kommen.
Deshalb das Makro mit den vielen Zwischenschritten...
Public Function Testmakro_dE2000(ByVal L1 As Double, L2 As Double, a1 As Double, a2 As Double,  _
b1 As Double, b2 As Double) As Double
'--- Schritt 1
C1 = (a1 ^ 2 + b1 ^ 2) ^ 0.5
'--- Schritt 2
C2 = (a2 ^ 2 + b2 ^ 2) ^ 0.5
'--- Schritt 3
G = 0.5 * (1 - (((C1 + C2) / 2) ^ 7 / (((C1 + C2) / 2) ^ 7 + 25 ^ 7)) ^ 0.5)
'--- Schritt 4
a1STRICH = (1 + G) * a1
'--- Schritt 5
b1STRICH = b1
'--- Schritt 6
C1STRICH = (a1STRICH ^ 2 + b1STRICH ^ 2) ^ 0.5
'--- Schritt 7
'WENN(C12>0;GRAD(ARCTAN2(C11;C12));360+GRAD(ARCTAN2(C11;C12)))
h1STRICH = .Degrees(.Arctan2(a1STRICH, b1STRICH)) - 360 * (b1STRICH > 0)
'--- Schritt 8
a2STRICH = (1 + G) * a2
'--- Schritt 9
b2STRICH = b2
'--- Schritt 10
C2STRICH = (a2STRICH ^ 2 + b2STRICH ^ 2) ^ 0.5
'--- Schritt 11
'WENN(C21>0;GRAD(ARCTAN2(C20;C21));360+GRAD(ARCTAN2(C20;C21)))
h2STRICH = .Degrees(.Arctan2(a2STRICH, b2STRICH)) - 360 * (a2STRICH > 0)
'--- Schritt 12
mean_CSTRICH = (C1STRICH + C2STRICH) / 2
'--- Schritt 13
If Abs(h2STRICH - h1STRICH) 


Anzeige
Viell solltest du die vollstd Fkt inkl aller...
23.06.2009 16:00:59
Luc:-?
...Deklarationen posten, Marc!
So weiß man nicht, was Variable und was evtl Zellbezug(sanalogie) sein soll. Mir scheint _ außerdem, dass du die TabBlatt-Formeln schon umgesetzt hast oder fehlt da noch was? Bitte das deutlich(er) machen, z.B. welcher Zellbezug entspricht welcher Variablen! Was soll übrigens der Pkt vor Degrees etc? Das liefert einen Bezugsfehler, wenn das nicht in einem With-Komplex notiert wird wie bspw...

With WorksheetFunction
End With

Also bitte etwas exakter darstellen und die Netiquette nicht vergessen!
Gruß Luc :-?

Anzeige
Re...Luc
25.06.2009 10:05:30
marc
Hallo Luc,
Deklarationen...hmmm...also ich dachte mit folgender Zeile...
Public Function Testmakro_dE2000(ByVal L1 As Double, L2 As Double, a1 As Double, a2 As Double, _
b1 As Double, b2 As Double) As Double
...sind die Werte definiert.
Was meinst du mit Zellbezug(sanalogie)? Leider bin ich absoluter VBA-Anfänger, Stand, sag ich mal "Gefährliches Halb/Wenig-wissen" ;-))) Habe also aus Vorlagen, Vorschlägen und Selbstversuchen einfach mein Makro zusammengebastelt.
Zu den Formeln. Diese habe ich, analog wie die anderen aus Excel entnommen und umgesetzt. Bei allen anderen funktionierts, nur bei diesen 2 Formeln, die ja die gleiche Synthax/Prozedur erfordern, stoße ich offensichtlich an meine Grenzen.
Ich habe auch schon Vorschläge bekommen, wie z.B. die von dir bereits erwähnte
With WorksheetFunction - End With - Variante. Aber offensichtlich war ich mit deren Umsetzung überfordert und hatte deswegen nochmals angefragt, ob eine einfachere Umsetzung als Formel, anstatt z.B. Sub-Formel...etc nicht möglich ist.
Das ist auch der Kernpunkt meines Threads. Hilfe bei der möglichst, für den Laien einfachen, Umsetzung der noch offen stehenden 2 Formeln in VBA.
Der Punkt vor dem Degrees geht auf mein Konto...mein Fehler. Copy-Paste eben....
Was ist eigentlich mit dem Punkt vor Arctan2? Gehört der jetzt nun dahin, oder nicht?
Bin jetzt doch ein bißchen verunsichert...
Nettiquette....hmmm....dachte eigentlich, ich habe höflich angefragt und nachgehakt. Das ich Anfangs nicht alles ausführlich genug erklärt hatte, ist mir erst im nachhinein aufgefallen. Manchmal ist man so in etwas drin, das man unter einer gewissen Betriebsblindheit leidet.
Wenn ich gegen eine Regel verstoßen haben sollte, dann tuts mir leid.
Gruß
Marc
Anzeige
Nicht ganz klar, ob du wirklich 'ne Fkt...
25.06.2009 17:42:13
Luc:-?
...schreiben willst, Marc,
denn du hast da Einiges missachtet, was ihr fkt bedingt...
1. Deklarationen: In der Kopfzeile/Argumentliste der Fkt wdn nur die Argumente und das Fktsergebnis, alle anderen Variablen wdn am Anfang des Fktskörpers deklariert. Bin jetzt mal davon ausgegangen, dass das alles wirklich Variablen sind, weil auch entsprechende Berechnungen existieren.
2. Fkts- vs Subproz: Eine Fkt gibt im Ggsatz zu einer Subproz einen bzw mehrere Werte zurück. Dazu müssen diese aber auch der Fkt zugewiesen wdn! Da nicht klar ist, welche Variable das Ergebnis liefern soll, habe ich die 3 letzten verwendet.
3. Sprachfalle: Die dt xlFkt haben im US-Original oft andere Namen. VBA verwendet letztere. Nur bei Ausgabe als TabBlattFml kannst du ...FormulaLocal dt Bezeichnungen zuweisen.
Eigene Fktt, sog userdefinedFunctions kann man im TabBlatt wie xlFktt einsetzen. Das ist in folgd Abb demonstriert. Deine udF macht allerdings nur als Matrixformel über 3 Zellen Sinn, denn sie gibt hier 3 Werte zurück. Einen einzelnen Wert kannst du mit xlFkt INDEX auswählen...
Userbild
Deine udF habe ich also wie folgt ergänzt. Musst du selber wissen, ob das so OK ist...

Option Explicit
Function Test_dE2000(ByVal L1 As Double, ByVal L2 As Double, ByVal a1 As Double, _
ByVal a2 As Double, ByVal b1 As Double, ByVal b2 As Double) As Variant
Dim C1 As Double, C2 As Double, G As Double, a1STRICH As Double, a2STRICH As Double, _
b1STRICH As Double, b2STRICH As Double, C1STRICH As Double, C2STRICH As Double, _
h1STRICH As Double, h2STRICH As Double, mean_CSTRICH As Double, mean_hSTRICH As Double,  _
_
deltah As Double
'--- Schritt 1
C1 = (a1 ^ 2 + b1 ^ 2) ^ 0.5
'--- Schritt 2
C2 = (a2 ^ 2 + b2 ^ 2) ^ 0.5
'--- Schritt 3
G = 0.5 * (1 - (((C1 + C2) / 2) ^ 7 / (((C1 + C2) / 2) ^ 7 + 25 ^ 7)) ^ 0.5)
'--- Schritt 4
a1STRICH = (1 + G) * a1
'--- Schritt 5
b1STRICH = b1
'--- Schritt 6
C1STRICH = (a1STRICH ^ 2 + b1STRICH ^ 2) ^ 0.5
'--- Schritt 7
'WENN(C12>0;GRAD(ARCTAN2(C11;C12));360+GRAD(ARCTAN2(C11;C12)))
With WorksheetFunction
h1STRICH = .Degrees(.Atan2(a1STRICH, b1STRICH)) - 360 * (b1STRICH > 0)
End With
'--- Schritt 8
a2STRICH = (1 + G) * a2
'--- Schritt 9
b2STRICH = b2
'--- Schritt 10
C2STRICH = (a2STRICH ^ 2 + b2STRICH ^ 2) ^ 0.5
'--- Schritt 11
'WENN(C21>0;GRAD(ARCTAN2(C20;C21));360+GRAD(ARCTAN2(C20;C21)))
With WorksheetFunction
h2STRICH = .Degrees(.Atan2(a2STRICH, b2STRICH)) - 360 * (a2STRICH > 0)
End With
'--- Schritt 12
mean_CSTRICH = (C1STRICH + C2STRICH) / 2
'--- Schritt 13
If Abs(h2STRICH - h1STRICH) 

Option Explicit am Modulanfang bewirkt einen PgmStop, wenn eine Variable nicht deklariert ist. Der überflüssige einzelne Tiefstrich ist der Forumssoftware geschuldet — entfernen! Sicher kann man die udF noch straffen – manche Einzelschritte und zugehörige Variablen dürften überflüssig sein, wenn sie nicht auch im Fktsergebnis erscheinen –, aber wie gesagt, das musst du entscheiden...
Viel Erfolg, Luc :-?
PS: Dieses Mal stimmte die Netiquette... ;-)

Anzeige
Rückmeldung ist...
02.07.2009 14:19:32
Luc:-?
...hier zu finden.
Luc :-?

320 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige