Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
880to884
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
880to884
880to884
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Formel in VBA umschreiben
21.06.2007 21:36:00
Peter
Hallo Excel-Experten,
ich versuche die untenstehende Formel in VBA umzuschreiben - bisher mit mäßigem Erfolg.
Ich muss allerdings dazusagen: Ich bin kein Formel-Spezialist und durchschaue die Formel deshalb auch nicht. Was muss ich z. B. mit den Matrixkonstanten der Formel in VBA machen?


=MIN(DATUM(JAHR(A1);MONAT(A1)+(TAG(A1+1)=1)+{1.2};{1.0}*TAG(A1)*(TAG(A1+1)>1))) }


Mein bisheriger Versuch wird von VBA nicht akzeptiert:


Range("E" & lZeile).Value = Application.Min(DateSerial(Year(dDatum), _
            Month(dDatum) + (Day(dDatum + 1) = 1) + (1, 2), _
            (1, 0) * Day(dDatum) * Day(dDatum + 1) > 1)) }


Für Hilfe bereits schon jetzt vielen Dank im voraus.
Gruß Peter

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Formel in VBA umschreiben
21.06.2007 22:27:00
ingUR
Hallo, Peter,
für die Aufgabe, wenn ich sie den richtig erkannt habe, kannst Du die VBA-Funktion DateAdd(Kennung, Zahl, StringDatum)
Range("E" & lZeile).Value = DateAdd("m", 1, CStr(Range("A1"))
Gruß,
Uwe

AW: Formel in VBA umschreiben
21.06.2007 22:33:00
ingUR
Hallo, Peter,
natürlich kannst du auch das Datum ohne Typenumwandlung eingeben; mein Erinnerungsfehler!
Range("E" & lZeile).Value = DateAdd("m", 1, Range("A1"))
bzw.
Range("E" & lZeile).Value = DateAdd("m", 1, dDatum)
Gruß,
Uwe

AW: Formel in VBA umschreiben
21.06.2007 23:32:25
Gerd
Hallo Peter, Hallo Uwe
falls wie bei der Formel ein Monatsletzter stets den letzten Tag des Folgemonats zurückgeben soll:
Range("E" & lZeile).Value = IIf((Day(dDatum + 1)) = 1, DateAdd("m", 1, dDatum + 1) - 1, DateAdd("m", 1, dDatum))
Grüße Gerd

Anzeige
AW: Formel in VBA umschreiben
22.06.2007 00:20:00
ingUR
Hallo, Gerd,
danke für Deine Ergänzung, obwohl bei mir mit Deiner Formel nicht das Datum des letzten Tages des folgemonats geliefert wird.
Ich habe daraufhin einmal die Zellenformel von Peter getestet. Sie liefert bei mir immer ein um ein Monat erhöhtes Datum, wobei allerdings kein Monat übersprungen wird, so dass z.B. der 30.01.2007 nicht ein Datum im März 2007 liefert, sonder den 28.02.2007, ebenso wie der 28.01., 29.01 und 31.01,2007.
Möglich das Peter Deine Aufgabenstellung im Sinn hat, denn eigentlich liefert die Zellenformel =EDATUM(A1;1) das um einen Kalendermonat erhöhte Datum ebenso.
Wenn die Aufgabe also so gemeint ist, dann wären zwei Monate zu addieren und Day(1) zu setzen, so dass bei Abzug von 1 vom vollständigen Datumswert, das Datum des Monatsletzen des Folgemotas vom Ausgangsmonat ausgegeben wird.
Gruß,
Uwe
Gruß,
Uwe

Anzeige
AW: Formel in VBA umschreiben
22.06.2007 06:57:00
Peter
Hallo Uwe, Hallo Gerd,
es geht mir ausschließlich darum, die Formel 1 zu 1 in VBA umzusetzen.


=MIN(DATUM(JAHR(A1);MONAT(A1)+(TAG(A1+1)=1)+{1.2};{1.0}*TAG(A1)*(TAG(A1+1)>1)))


Eine VBA-Lösung für das eigentliche Problem würde ich sicherlich auch finden.
Gruß Peter

AW: Formel in VBA umschreiben
22.06.2007 07:07:00
Hajo_Zi
Hallo Peter,
schreibe die Formel in eine Zelle, Starte den Makrorecorder, gehe in die Zelle, Enter und stopppen und Du hast die Formel in VBA.

Anzeige
AW: Formel in VBA umschreiben
22.06.2007 08:14:00
ingUR
Hallo, Peter,
sofern nicht das gesucht wurde, wofür Hajo einen Lösungsweg beschrieben hat, nämlich das Schreiben einer Zellenformel aus VBA heraus, bin ich nicht sicher, ob Du überhaupt dieses "1:1"-Abbild der Zellenformel als VBA-Codezeile herstellen kannst, da in der Zellenformel Variabiabelnfelder eingesetzt werden.
Warum also dieser Weg, der nur über das Auflösen der Formel führt, da die Felder, hier {2.1} und {1.0}, nicht in einer VBA-Formel geschrieben werden können:
Sub Datumsformel() Dim dDatum As Date, nDatum As Date Dim n1Datum As Date, n2Datum As Date, n3Datum As Date, n4Datum As Date dDatum = Cells(1, 1) '==== nur für Testzwecke n1Datum = DateSerial(Year(dDatum), _ Month(dDatum) + (Day(dDatum + 1) = 1) + 1, _ 1 * Day(dDatum) * (Day(dDatum + 1) > 1)) n2Datum = DateSerial(Year(dDatum), _ Month(dDatum) + (Day(dDatum + 1) = 1) + 2, _ 1 * Day(dDatum) * (Day(dDatum + 1) > 1)) n3Datum = DateSerial(Year(dDatum), _ Month(dDatum) + (Day(dDatum + 1) = 1) + 1, _ 0 * Day(dDatum) * (Day(dDatum + 1) > 1)) n4Datum = DateSerial(Year(dDatum), _ Month(dDatum) + (Day(dDatum + 1) = 1) + 2, _ 0 * Day(dDatum) * (Day(dDatum + 1) > 1)) nDatum = Application.Min(DateSerial(Year(dDatum), _ Month(dDatum) + (Day(dDatum + 1) = 1) + 1, _ 1 * Day(dDatum) * (Day(dDatum + 1) > 1)), _ DateSerial(Year(dDatum), _ Month(dDatum) + (Day(dDatum + 1) = 1) + 2, _ 1 * Day(dDatum) * (Day(dDatum + 1) > 1)), _ DateSerial(Year(dDatum), _ Month(dDatum) + (Day(dDatum + 1) = 1) + 1, _ 0 * Day(dDatum) * (Day(dDatum + 1) > 1)), _ DateSerial(Year(dDatum), _ Month(dDatum) + (Day(dDatum + 1) = 1) + 1, _ 0 * Day(dDatum) * (Day(dDatum + 1) > 1))) Range("E" & lZeile).Value= nDatum End Sub


Ich erspare es mir, die Formeln nDatum(i,j) = DateSerial(Year(dDatum), Month(dDatum) + (Day(dDatum + 1) = 1) + i, j * Day(dDatum) * (Day(dDatum + 1) > 1)) für in eine doppelte Schleife zu packen und das Minimum aus den vier Werten zu suchen.
Gruß,
Uwe

Anzeige
AW: @ Uwe
22.06.2007 18:15:42
ingUR
Hallo, Peter,
nun mal in konkret, was soll Deine Formel berechnen?
Dass die Einführung von Matrixelementen in eine Zellenformel interessante Ansätze bietet, ist wohl war und nicht immer leicht auf dem ersten Blick zu überschauen. Ist jedoch erst einmal die Fragestelle in Worten gekleidet, wird sich wohl auch dazu ein Code finden, wobei es, wenn ich Dich richtig verstehe, hier nur der "Codeformulierungsergeiz" Dich dazu treibt, nicht auf einfache und vorhandene Funktionen zurück zu greifen.
Doch generell ist zu beachten, dass die WAHR/FALSCH-Zahlen in EXCEL und VBA nicht identisch sind1).
Diesen Umstand bedenkend, wird man mit der Transformation der Wahrheitswerte iif(day(dDatum+),1,0) bzw. iff(day/dDatum+1)>1,1,0) oder einfacher, dem Einsatz der ABS-Funktion für den VBA-Boolean-Wert , wohl zu die ensprechenden Ergebnisse finden, sofern eine entsprechende Aufgabenformulierung (s.o.) vorliegt, denn für den 15.05.2007 in der Zelle A2 wird als kleinster Wert der 31.05.2007 aus der "Matrix" {1.2}{1.0} berechnet:
 
 DEFGHIJ
5    10 
6    1515=TAG(A2)
7    WAHRWAHR=TAG(A2+1)>1
8=JAHR(A2)=MONAT(A2)=(TAG(A2+1)=1)    
920075FALSCH115.06.200731.05.2007 
10   215.07.200730.06.2007 
Formeln der Tabelle
H6 : =TAG(A2)
I6 : =TAG(A2)
J6 : ="=TAG(A2)"
H7 : =TAG(A2+1)>1
I7 : =TAG(A2+1)>1
J7 : ="=TAG(A2+1)>1"
D8 : ="=JAHR(A2)"
E8 : ="=MONAT(A2)"
F8 : ="=(TAG(A2+1)=1)"
D9 : =JAHR(A2)
E9 : =MONAT(A2)
F9 : =(TAG(A2+1)=1)
H9 : =DATUM($D9;$E9+$F9+$G9;H$5*H$6*H$7)
I9 : =DATUM($D9;$E9+$F9+$G9;I$5*I$6*I$7)
H10 : =DATUM($D9;$E9+$F9+$G10;H$5*H$6*H$7)
I10 : =DATUM($D9;$E9+$F9+$G10;I$5*I$6*I$7)
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Gruß,
Uwe
1)
EXCEL:
=5+(6>3) :: Ergebnis 6
=5+(6<3) :: Ergebnis 5
WAHR = +1 :: FALSCH = 0
VBA (z.B. im Direkbereich testen):
=5+(6>3) :: Ergebnis 4
=5+(6<3) :: Ergebnis 5
WAHR = -1 :: FALSCH = 0

Anzeige
AW: @ Peter F: VBA_Befehlszeile wurde verschluckt!
22.06.2007 18:19:00
ingUR
nDatum = Application.Min(DateSerial(Year(dDatum), _ Month(dDatum) + Abs(Day(dDatum + 1) = 1) + 1, _ 1 * Day(dDatum) * Abs(Day(dDatum + 1) > 1)), _ DateSerial(Year(dDatum), _ Month(dDatum) + Abs(Day(dDatum + 1) = 1) + 2, _ 1 * Day(dDatum) * Abs(Day(dDatum + 1) > 1)), _ DateSerial(Year(dDatum), _ Month(dDatum) + Abs(Day(dDatum + 1) = 1) + 1, _ 0 * Day(dDatum) * Abs(Day(dDatum + 1) > 1)), _ DateSerial(Year(dDatum), _ Month(dDatum) + Abs(Day(dDatum + 1) = 1) + 2, _ 0 * Day(dDatum) * Abs(Day(dDatum + 1) > 1)))


Gruß!

AW: @ Peter F: VBA_Befehlszeile wurde verschluckt!
22.06.2007 20:40:08
Peter
Hallo Uwe,
ich wollte die besagte Formel möglichst 1:1 in VBA abbilden, wobei ich als Formel-Laie erst spät die Matrix-Konstanten begriffen habe. Nun habe ich eine Möglichkeit gesucht, diese in VBA umzusetzen, was mir nicht gelungen ist.
Es soll mit der Formel zu einem Datum ein Monat hinzugerechnet werden.
Wenn der Folgemonat jedoch ein abweichendes Ultimo aufweist, soll dieses berücksichtigt werden.
31.01.2007 = 28.02.2007, 30.06.2007 = 31.07.2007 aber 01.06.2007 = 01.07.2007.
Die Formel kann das perfekt, VBA nicht ohne Schwierigkeiten.
Verschwende bitte keine Gedanken mehr an das Thema, hab ein schönes Wochenende
Gruß Peter
https://www.herber.de/bbs/user/43500.xls

Anzeige
AW: @ Peter F: VBA_Befehlszeile wurde verschluckt!
22.06.2007 21:10:36
ingUR
Danke für die Rückmeldung, Peter,
und Erläuterung. Mit diesen Angaben sollten folgende spezielle Kombinationen zum gewünschten Ergebnis führen:

nDatum = Application.Min(DateSerial(Year(dDatum), _
Month(dDatum) + Abs(Day(dDatum + 1) = 1) + 1, _
1 * Day(dDatum) * Abs(Day(dDatum + 1) > 1)), _
DateSerial(Year(dDatum), _
Month(dDatum) + Abs(Day(dDatum + 1) = 1) + 2, _
0 * Day(dDatum) * Abs(Day(dDatum + 1) > 1)))

Es wird also von von den {1.2} und {1.0} Matrix-Konstanten nur die Kombinationen (1;1) und (2;0) ausgewertet und nicht alle vier möglichen Kombinationen. Damit befolge ich nun Deinen Vorschlag und verschwende keinen weiteren Gedanken für das Problem.
Dennoch danke ich Dir für das Aufwerfen, denn dadurch ist in Erinnerung gerifen, dass es da den Unterschied bei den Boolean-Werten gibt, so dass hier gut gezeigt ist, wie jede Antwort auch für den Antwortenden Erkenntnisse bringen unf vertiefen kann.
Gruß,
Uwe

Anzeige
AW: danke an Uwe, Gerd + Hajo
22.06.2007 15:47:56
Peter
Hallo Uwe, Gerd und Hajo,
danke dass ihr mitgeholfen habt meine Neugierde auf eine mir bisher unbekannte Matrixkonstante zu befriedigen.
Ich hatte die leise Hoffnung, dass es dafür auch eine Variante in VBA gäbe, die ich noch nicht kannte.
Allen ein schönes WE, Gruß Peter

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige