Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
856to860
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
856to860
856to860
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

WENN-Formel(n) via VBA ersetzen

WENN-Formel(n) via VBA ersetzen
29.03.2007 20:13:00
Günter
Guten Abend,
da ich mit meinen Anfängerkenntnissen in VBA gerade am Ende bin, hoffe ich, dass
mir bei meinem unten stehenden Problem evtl. jemand weiter helfen kann.
In meinem Tabellenblatt (Tabelle 1), kann ich über ein einen Button ein Formular (frmAnlegen)
öffnen.
In diesem Formular habe ich die Möglichkeit ein Startdatum (txtStart), ein Enddatum (txtEnde)
und ein Stundenvolumen (txtStart) einzugeben. Klicke ich anschließend auf cmdAnlegen werden
meine eingegebenen Daten mit folgenden Code in das Tabellenblatt (Tabelle 1) geschrieben:

Private Sub cmdAnlegen_Click()
'Formular schließen
frmAnlegen.Hide
'Befüllung aktives Tabellenblatt
With ActiveSheet
Dim LastRow As Long
LastRow = Range("A65536").End(xlUp).Row
.Range("A" & LastRow + 1) = Me.txtStart
.Range("B" & LastRow + 1) = Me.txtEnde
.Range("C" & LastRow + 1) = DateDiff("m", CDate(txtStart), CDate(txtEnde)) 'Anzahl Monate
.Range("D" & LastRow + 1) = Me.txtStunden
.Range("E" & LastRow + 1) = Me.txtStunden / .Range("C" & LastRow + 1) 'Stunden pro Monat
End With
'Formular leeren
Me.txtStart = ""
Me.txtEnde = ""
Me.txtStunden = ""
End Sub
Jetzt gibt es ab Spalte F WENN-Formeln, die errechnen, wie viele Stunden auf welches Quartal
fallen und die Zelle wird mit der entsprechenden Stundenanzahl befüllt.
Beispiel WENN-Formel für Quartal 1 2007:
=WENN(C9 E9*WENN(UND((A9)=DATUM(2007;3;1));3;
WENN(ODER(UND((A9)=DATUM(2007;2;1);(B9)>=DATUM(2007;3;1));
UND((A9) WENN(UND((A9) E9*WENN(UND((A9)=DATUM(2007;3;1));3;
WENN(ODER(UND((A9)=DATUM(2007;2;1);(B9)>=DATUM(2007;3;1));
UND((A9) Nun suche ich verzweifelt eine Möglichkeit diese langen WENN-Formeln in den VBA-Code mit aufzunehmen.
Sollte mein Problem durch diesen Beitrag nicht verständlich sein, habe ich auch
noch eine Beispieldatei angehängt.

Die Datei https://www.herber.de/bbs/user/21.xls wurde aus Datenschutzgründen gelöscht


Bin für jede Hilfe sehr dankbar!
Viele Grüße,
Günter

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: WENN-Formel(n) via VBA ersetzen
01.04.2007 19:59:17
Erich
Hallo Günter,
probier mal:

Private Sub cmdAnlegen_Click()
Dim Differenz As Long, dblStd As Double, dblProM As Double
Dim aintQ(1 To 4, 1 To 4) As Double
Dim intJ As Integer, ii As Integer, NextRow As Long
'Formular schließen
frmAnlegen.Hide
'Befüllung aktives Tabellenblatt
'Errechnung Anzahl Monate
Differenz = (Year(txtEnde) - Year(txtStart)) * 12 + Month(txtEnde) - Month(txtStart) + 1
dblStd = CDbl(txtStunden)
dblProM = dblStd / Differenz
'Quartalszahlen berechnen
intJ = Year(txtStart) - 2006     ' Startjahr
For ii = Month(txtStart) To IIf(Year(txtEnde) > Year(txtStart), 12, Month(txtEnde))
aintQ(intJ, Month(10 * ii)) = aintQ(intJ, Month(10 * ii)) + dblProM
Next ii
' Jahre dazwischen
For intJ = Year(txtStart) - 2005 To Year(txtEnde) - 2007
For ii = 1 To 4
aintQ(intJ, ii) = 3 * dblProM
Next ii
Next intJ
intJ = Year(txtEnde) - 2006      ' Endejahr
For ii = IIf(Year(txtEnde) > Year(txtStart), 1, Month(txtStart)) To Month(txtEnde)
aintQ(intJ, Month(10 * ii)) = aintQ(intJ, Month(10 * ii)) + dblProM
Next ii
'Zellen Füllen
With ActiveSheet
NextRow = Range("A65536").End(xlUp).Row + 1
.Cells(NextRow, 1) = CDate(txtStart)
.Range(NextRow, 2) = CDate(txtEnde)
.Range(NextRow, 3) = Differenz
.Range(NextRow, 4) = dblStd
.Range(NextRow, 5) = dblProM
For intJ = 1 To 4
For ii = 1 To 4  ' hier könnte man auch noch die Jahreswerte ermitteln
.Cells(NextRow, 5 * intJ + ii) = aintQ(intJ, ii)
Next ii
Next intJ
End With
'Formular leeren
Me.txtStart = ""
Me.txtEnde = ""
Me.txtStunden = ""
End Sub
Eine Bemerkung:
Month(10*Month(datum)) ergibt das Quartal von datum, frei nach
http://www.excelformeln.de/formeln.html?welcher=175
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: WENN-Formel(n) via VBA ersetzen
02.04.2007 11:29:30
Günter
Hallo Erich,
vielen Dank für Deine große Hilfe!!!!
Hab es auch gerade gleich mal getestet und bis auf 2 Ausnahmen funktioniert alles super!
Wenn ich als Startdatum den Jan. 08 und Enddatum Dez. 08 zum Beispiel eingebe, schreibt mir Excel in die Zellen immer den Wert Jan. 07 und Dez. 07 und verteilt auch die Quartalsstunden entsprechend auf 2007.
Die Jahressumme der vorangegangenen 4 Quartale bleibt leer, auch wenn es Stunden in den Quartalen zuvor gab.
Kann man an diesen beiden Punkten evtl. noch etwas ändern?
Hab nochmals meine Datei nach dem jetzigen Stand angehängt!
https://www.herber.de/bbs/user/41487.xls
Viele Grüße und nochmals danke,
Günter
Anzeige
AW: WENN-Formel(n) via VBA ersetzen
02.04.2007 11:30:00
Günter
Hallo Erich,
vielen Dank für Deine große Hilfe!!!!
Hab es auch gerade gleich mal getestet und bis auf 2 Ausnahmen funktioniert alles super!
Wenn ich als Startdatum den Jan. 08 und Enddatum Dez. 08 zum Beispiel eingebe, schreibt mir Excel in die Zellen immer den Wert Jan. 07 und Dez. 07 und verteilt auch die Quartalsstunden entsprechend auf 2007.
Die Jahressumme der vorangegangenen 4 Quartale bleibt leer, auch wenn es Stunden in den Quartalen zuvor gab.
Kann man an diesen beiden Punkten evtl. noch etwas ändern?
Hab nochmals meine Datei nach dem jetzigen Stand angehängt!
https://www.herber.de/bbs/user/41487.xls
Viele Grüße und nochmals danke,
Günter
Anzeige
AW: WENN-Formel(n) via VBA ersetzen
02.04.2007 13:49:00
Erich
Hallo Günter,
VBA wandelt Jan. 08 in den 08.01.2007 um - 08 wird als Tag, nicht als Jahr interpretiert.
Als Jahr wird dann das aktuelle Jahr verwendet.
Um das zu vermeiden, wird in der Prozedur jetzt der 1. als Tag vorangestellt,
wenn der Text nicht mit einer Ziffer beginnt.
Ob das so immer klappt? Es gibt viele Möglichkeiten, ein Datum einzugeben...
Die Summation für die Jahre ist jetzt auch drin:

Private Sub cmdAnlegen_Click()
Dim Differenz As Long, dblStd As Double, dblProM As Double, dblSum As Double
Dim datSta As Date, datEnd As Date, aintQ(1 To 4, 1 To 4) As Double
Dim intJ As Integer, ii As Integer, NextRow As Long
'Formular schließen
frmAnlegen.Hide
'Errechnung Anzahl Monate
datSta = CDate(IIf(IsNumeric(Left(txtStart, 1)), "", "1.") & txtStart)
datEnd = CDate(IIf(IsNumeric(Left(txtEnde, 1)), "", "1.") & txtEnde)
Differenz = (Year(datEnd) - Year(datSta)) * 12 + Month(datEnd) - Month(datSta) + 1
dblStd = CDbl(txtStunden)
dblProM = dblStd / Differenz
'Quartalszahlen berechnen
intJ = Year(datSta) - 2006     ' Startjahr
For ii = Month(datSta) To IIf(Year(datEnd) > Year(datSta), 12, Month(datEnd))
aintQ(intJ, Month(10 * ii)) = aintQ(intJ, Month(10 * ii)) + dblProM
Next ii
' Jahre dazwischen
For intJ = Year(datSta) - 2005 To Year(datEnd) - 2007
For ii = 1 To 4
aintQ(intJ, ii) = 3 * dblProM
Next ii
Next intJ
If Year(datEnd) > Year(datSta) Then
intJ = Year(datEnd) - 2006      ' Endejahr
For ii = IIf(Year(datEnd) > Year(datSta), 1, Month(datSta)) To Month(datEnd)
aintQ(intJ, Month(10 * ii)) = aintQ(intJ, Month(10 * ii)) + dblProM
Next ii
End If
'Befüllung aktives Tabellenblatt
With ActiveSheet
NextRow = Range("A65536").End(xlUp).Row + 1
.Cells(NextRow, 1) = datSta
.Cells(NextRow, 2) = datEnd
.Cells(NextRow, 3) = Differenz
.Cells(NextRow, 4) = dblStd
.Cells(NextRow, 5) = dblProM
For intJ = 1 To 4
For ii = 1 To 4
.Cells(NextRow, 5 * intJ + ii) = aintQ(intJ, ii)
dblSum = dblSum + aintQ(intJ, ii)   ' Jahreswerte addieren
Next ii
.Cells(NextRow, 5 * intJ + 5) = dblSum ' Eintragen der Jahreswerte
dblSum = 0
Next intJ
End With
'Formular leeren
Me.txtStart = ""
Me.txtEnde = ""
Me.txtStunden = ""
End Sub
Noch ein Tipp:
Mit einer zusätzlichen Zeile kannst du erreichen, dass txtStart beim Anzeigen der UF den Focus _ hat:

Private Sub cmdAnlegen_Click()
frmAnlegen.txtStart.SetFocus
frmAnlegen.Show
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: WENN-Formel(n) via VBA ersetzen
02.04.2007 15:38:49
Günter
Hallo Erich,
vielen Dank für Deine schnelle Antwort & Hilfe!
Funktioniert jetzt wirklich super!!!
Wäre super, wenn Du mir evtl. noch sagen könntest, wo ich folgende Sachverhalte im Code selbst ändern kann:
- Beginn 1. Quartal 2007 in Spalte M
- Kann ich z. B. auch ohne Probleme meine Quartale erweitern (2011, 2012...) ohne größere Anpassungen im Code vornehmen zu müssen? Der Aufbau bleibt natürlich der gleiche.
Für eine Antwort schon jetzt besten Dank!!!
Günter
AW: WENN-Formel(n) via VBA ersetzen
02.04.2007 17:27:00
Erich
Hallo Günter,
danke für deine Rückmeldung!
Für das Verschieben der Quartale auf den Bereich ab Spalte M brauchst du nur zwei Zeilen zu ändern.
Momentan steht das 1. Qu. in Spalte F.
Um auf Spalte M zu kommen, muss man 7 addieren (hier 1. und letzte Zeile):

.Cells(NextRow, 5 * intJ + ii + 7) = aintQ(intJ, ii)
dblSum = dblSum + aintQ(intJ, ii)   ' Jahreswerte addieren
Next ii
.Cells(NextRow, 5 * intJ + 12) = dblSum ' Eintragen der Jahreswerte
Wenn du mehr als 4 Jahre verarbeiten willst, musst du die Deklaration von aintQ ändern, etwa von
aintQ(1 To 4, 1 To 4) As Double
zu
aintQ(1 To 7, 1 To 4) As Double
Dann hast du Platz für 7 Jahre.
Bei der Ausgabe musst du noch in der Zeile
For intJ = 1 To 4
die 4 durch eine 7 ersetzen, dann sollte es funzen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: WENN-Formel(n) via VBA ersetzen
02.04.2007 19:27:00
Günter
Hallo Erich,
klappt alles perfekt mit der Erweiterung bzw. der Verschiebung der Spaltenposition!
Nochmals an dieser Steller herzlichen Dank für Deine Hilfe!
Gruß,
Günter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige