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

Monatstage aus Variablenwert

Monatstage aus Variablenwert
15.12.2013 07:59:26
Marco
Liebe Excelfreunde,
ich habe mit der Variable X die Spalte in der ich in der Tabelle arbeite.
X ist auch gleichzeitig der Monat für den ich monatliche Berechnungen durchführe (also X=3 entspricht Januar, X=4 entspricht Februar.....bis X=14 entspricht Dezember)
Nun muss ich aus dem Wert der Variable X die Monatstage für eine weitere Rechnung ermitteln. Habe dazu nachstehenden Syntax geschrieben, der zwar funktioniert aber erfahrenen Programmieren bestimmt nur ein mitleidiges Lächeln abgewinnt. Hat denn nicht jemand einen Tip wie ich diese Sache etwas eleganter lösen kann?
Über die Schaltjahrproblematik habe ich natürlich nicht nachgedacht , da die Tabelle ja jedes Jahr angepasst werden kann, aber wenn es auch da ne einfache Lösung gibt?
vielen Dank für Eure Hilfe und schöne Grüße
Marco
If X = 3 Then
T = 31
ElseIf X = 4 Then
T = 28
ElseIf X = 5 Then
T = 31
ElseIf X = 6 Then
T = 30
ElseIf X = 7 Then
T = 31
ElseIf X = 8 Then
T = 30
ElseIf X = 9 Then
T = 31
ElseIf X = 10 Then
T = 31
ElseIf X = 11 Then
T = 30
ElseIf X = 12 Then
T = 31
ElseIf X = 13 Then
T = 30
ElseIf X = 14 Then
T = 31
End If

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Monatstage aus Variablenwert
15.12.2013 09:25:08
fcs
Hallo Marco,
statt der vielen
If .. ElseIf .. End If kann man hier mit Select Case-Constuction arbeiten, um einzukürzen.
Da kann man dann auch die Monatsnummer statt der Spaltennummer in der Prüfung verwenden (liest etwas besser).
Hier 2 Varianten, wie man es lösen könnte.
Gruß
Franz 'Variante 1 Select Case X - 2 'Nummer des Monats prüfen Case 1, 3, 5, 7, 8, 10, 12 T = 31 Case 2 Jahr = 2014 '4-stellig, hier ggf. Info aus einer Zelle im Tabellenblatt holen If IsDate(Format(Jahr, "0000") & "-02-29") Then T = 29 Else T = 28 End If Case 4, 6, 9, 11 T = 30 End Select 'Variante 2 Jahr = 2014 '4-stellig, hier ggf. Info aus einer Zelle im Tabellenblatt holen If IsDate(Format(Jahr, "0000") & "-" & Format(X - 2, "00") & "-31") Then T = 31 ElseIf IsDate(Format(Jahr, "0000") & "-" & Format(X - 2, "00") & "-30") Then T = 30 ElseIf IsDate(Format(Jahr, "0000") & "-" & Format(X - 2, "00") & "-29") Then T = 29 Else T = 28 End If

Anzeige
AW: Monatstage aus Variablenwert
15.12.2013 10:05:46
Marco
Hallo Franz,
vielen Dank für Deine Hilfe.
Klappt hervorragend.
Einen schönen 3. Advent
wünscht Marco

Einzeiler
15.12.2013 10:39:00
Erich
Hi Marco,
das geht auch in einer kurzen Zeile:

Sub Monatstage()
Dim myJahr As Long, X As Long, tt As Long
myJahr = 2014        ' steht vielleicht in einer Zelle?
X = 4                ' Monatsspalte für Februar als Beispiel
tt = Day(DateSerial(myJahr, X - 1, 0))
MsgBox X & "/" & myJahr & ": " & tt
End Sub
Um Schaltjahre muss man sich da auch nicht kümmern - das geht automatisch richtig. :-)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich und: Schönen Sonntag allerseits!

Anzeige
kleine Korrektur
15.12.2013 10:45:54
Erich
Hi Marco,
die MsgBox gaukelt ein falsches Ergebnis vor.
Bitte schreib statt
MsgBox X & "/" & myJahr & ": " & tt
besser
MsgBox "Monat " & X - 2 & "/" & myJahr & " hat " & tt & " Tage"
Grüße aus Kamp-Lintfort von Erich

AW: Einzeiler
15.12.2013 12:25:39
Marco
Erich vielen Dank für Deine Hilfe,
ich hab schon wieder einen Punkt an dem ich nicht weiterkomme.
Diese Silect case Anweisung von Franz funktioniert prima.
Select Case X - 2 'Nummer des Monats prüfen
Case 1, 3, 5, 7, 8, 10, 12
T = 31
Case 2
Jahr = 2014 '4-stellig, hier ggf. Info aus einer Zelle im Tabellenblatt holen
If IsDate(Format(Jahr, "0000") & "-02-29") Then
T = 29
Else
T = 28
End If
Case 4, 6, 9, 11
T = 30
End Select
Bekommt man denn das hier noch hin, das man dem Monatsnamen eine Variable zuweisen kann?
Ich muß nämlich mit jedem Monat mit einer anderen Zahl rechnen, wenn ich also den Monatsnamen
exakt hätte wäre das prima.
Vielleicht würde mir ja noch mal jemand helfen.
vielen vielen Dank für Eure Hilfe
Marco

Anzeige
AW: Einzeiler
15.12.2013 13:41:24
fcs
Hallo Marco,
ganz genau hab ich nicht verstanden, was du möchtest.
Wenn du für jeden Monat mit einem anderen Wert rechnen willst, dann benötigst du für jeden Monat eine Case-Zeile.
Allerdings solltest du diese Werte nur fest in den Code schreiben, wenn sie sich nicht mehr ändern. Ansonten ist es zweckmäßiger die Werte aus Tabellenzellen in die Variable einzulesen.
Gruß
Franz
  Dim X, T, Jahr
Dim intMonat As Integer, strMonat As String, Wert2
intMonat = X - 2    'Nummer des Monats
strMonat = Format(DateSerial(Year(Date), intMonat, 1), "MMMM") 'Langname
Select Case intMonat 'Nummer des Monats prüfen
Case 1: T = 31: Wert2 = 21
Case 2
Jahr = 2014 '4-stellig, hier ggf. Info aus einer Zelle im Tabellenblatt holen
If IsDate(Format(Jahr, "0000") & "-02-29") Then
T = 29
Else
T = 28
End If
Wert2 = 22
Case 3: T = 31: Wert2 = 23
Case 4: T = 30: Wert2 = 24
Case 5: T = 31: Wert2 = 25
Case 6: T = 30: Wert2 = 26
Case 7: T = 31: Wert2 = 27
Case 8: T = 31: Wert2 = 28
Case 9: T = 30: Wert2 = 29
Case 10: T = 31: Wert2 = 30
Case 11: T = 30: Wert2 = 31
Case 12: T = 31: Wert2 = 32
End Select

Anzeige
AW: Einzeiler
15.12.2013 14:25:09
Marco
Hallo Franz,
vielen Dank für Deine Mühe.
Ich will Netzleistungen zurückrechnen und deswegen müssen den einzelnen Monaten unterschiedliche Werte für die Rückrechnung zugeordnet werden, weil die Energieversorger immer aus der Abnahme des höchsten Viertelstunde Wertes den Monatsleistungspreis auch rückwirkend für die vergangenen Monate berechnen.
Bedeutet für 2014 ich brauche folgende Zuordnungen:
Januar = 31 Tage
Februar = 59 Tage (also 31Tage + 28Tage)
März = 90 Tage
April = 120 usw. bis
Dezember = 365 Tage
pro KW müssen für 365 Tage 50€ bezahlt werden die sich auf die Monate Tag genau aufteilen. Der höchste gemessene Wert im Jahr wird auf jeden Monat berechnet und auch zurückberechnet.
Also angenommen im Monat April ist der höchste gemessene Wert = 500 KW und in den Monaten davor war er nur 400 KW
Bedeutet das also bis Ende März folgende Rechnung galt
(400KW * 50€ *90Tage(für März))/365 Tage = 4931,51€ bis Ende März
nun auf Grund der höheren 15min Leistung im April gilt neu
(500KW * 50€ *120Tage(für April))/365 Tage = 8219,18€ bis Ende April
4931,51€ wurden ja schon bezahlt, also beträgt die Rechnung im April
8219,18€-4931,51€ = 3287,67€
Kam das klar rüber?
Mein Problem ist ich setz mich an die Programmiererei einmal im Jahr und da fängt man fast immer wieder bei Null an. Aber mit Deiner Empfehlung vorhin kann ich sicher schon einiges anfangen.
Nochmals vielen Dank für Deine Hilfe
und viele Grüße
Marco

Anzeige
Abrechnungstage
15.12.2013 16:45:44
Erich
Hi Marco,
probier mal aus, ob das deine Abrechnungtage berechnet:

Option Explicit
Sub MarcoMonate()
Dim X As Long        ' Tabellenspalte
Dim iMon As Integer  ' Monat
Dim iJahr As Integer ' Jahr
Dim ii As Integer    ' Laufindex
Dim iTage As Integer ' Anz. Tage für Abrechnung
iJahr = 2014
X = 6          '(Spalte für April)
For iMon = 1 To X - 2      ' Januar bis Monat
iTage = iTage + Day(DateSerial(iJahr, iMon + 1, 0))
Next iMon
MsgBox iTage & " für Monat " & X - 2 & "/" & iJahr
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
einfacher ohne Schleife
15.12.2013 19:13:38
Erich
Hi Marco,
um die Abrechnungstage zu ermitteln braucht man gar keine Schleife. Vergiss bitte meinen vorigen Post!
Man kann einfacher die Differenz zwischen dem nächsten Monatsersten und dem 1. Januar des Jahres
verwenden:

Option Explicit
Sub Test()
MsgBox AbrTage(2014, 4)
MsgBox AbrTage(2014, 12)
MsgBox AbrTage(2016, 12)
End Sub
Function AbrTage(iJahr As Integer, iMon As Integer) As Integer
AbrTage = DateSerial(iJahr, iMon + 1, 1) - DateSerial(iJahr, 1, 1)
End Function
Wie gefällt dir das?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
einfacher ohne VBA
15.12.2013 19:36:44
Erich
Hi Marco,
muss es denn VBA sein? Das geht auch mit normalen Excelformeln.
Vorgaben kommen in die gelben Zellen, die grünen zeigen die Resultate.
Die Formeln in den Spalten F:G sind nur zu Ansehen der Formelteile, sie werden nicht gebraucht.
 ABCDEFG
1Jahr2014EUR/kW:50,00   
2       
3   zu zahlender   
4Monatmax kWaufgel. EURRest EUR   
513001273,971273,97 31365
623002424,661150,69 59 
734004931,512506,85 90 
844006575,341643,83 120 
954008273,971698,63 151 
10660014876,716602,74 181 

Formeln der Tabelle
ZelleFormel
C5=RUNDEN(B5*D$1*(DATUM(B$1;A5+1;1)-DATUM(B$1;1;1))/(337+TAG((3&-B$1)-1)); 2)
D5=C5
F5=DATUM(B$1;A5+1;1)-DATUM(B$1;1;1)
G5=337+TAG((3&-B$1)-1)
C6=RUNDEN(B6*D$1*(DATUM(B$1;A6+1;1)-DATUM(B$1;1;1))/(337+TAG((3&-B$1)-1)); 2)
D6=C6-C5
F6=DATUM(B$1;A6+1;1)-DATUM(B$1;1;1)


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: einfacher ohne VBA
16.12.2013 03:01:00
Marco
Hallo Erich,
Deine Berechnung ohne VBA klappt 1:1. Wenn ich nunmehr die Formelfelder sperre ist das natürlich die bessere (einfachere!!) Lösung. Übrigens einfacher, auch diese Formeln hätte ich selbst nicht aufgebaut bekommen :-( die Formeln in C und F wäre ich viel umständlicher angegangen. Hier ist viel Wissen. Vielen Dank.
Gern würde ich mit Dir mal meine gesamte Problematik durchsprechen, aber das übersteigt dieses Forum.
Du siehst an der Zeit, das mich dieses Thema eben auch beschäftigt.
Also vielen herzlichen Dank für Deine Hilfe die mir wirklich viel Zeit gespart hat.
viele Grüße Marco

Anzeige
noch etwas einfacher
17.12.2013 01:18:10
Erich
Hi Marco,
danke für deine Rückmeldung!
Eine Vereinfachung, die die Formeln schneller, kürzer und klarer macht, ist mir noch eingefallen:
Die Anzahl der Tage des Jahres (365 oder 366) muss nicht in jeder Zelle in Spalte C immer wieder neu
berechnet werden. Hier wird die Zahl in B2 einmalig berechnet und dann in den Formeln als B$2 verwendet:
 ABCD
1Jahr2014EUR/kW:50,00
2Tage365  
3    
4Monatmax kWaufgel. EURzu zahlender Rest (EUR)
513001273,971273,97
623002424,661150,69
734004931,512506,85
844006575,341643,83
954008273,971698,63
10660014876,716602,74

Formeln der Tabelle
ZelleFormel
B2=337+TAG((3&-B1)-1)
C5=RUNDEN(B5*D$1*(DATUM(B$1;A5+1;1)-DATUM(B$1;1;1))/B$2;2)
D5=C5
C6=RUNDEN(B6*D$1*(DATUM(B$1;A6+1;1)-DATUM(B$1;1;1))/B$2;2)
D6=C6-C5

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: noch etwas einfacher
18.12.2013 17:12:49
Marco
vielen Dank Erich,
auch das habe ich noch berücksichtigt.
DANKE
viele Grüße
Marco

Verstehe ich nicht...
15.12.2013 13:50:59
Erich
Hi Marco,
"Diese Silect case Anweisung von Franz funktioniert prima." Ja, aber:
Das Select Case-Konstrukt ist hier ziemlich umständlich und überflüssig!
In meinem Post habe ich geschrieben, dass man es ersetzen kann durch eine einzige einfache Zeile:
T = Day(DateSerial(myJahr, X - 1, 0))
Hast du das mal ausprobiert? Wenn ja, was willst du noch mit Select Case ...?
Was du jetzt möchtest, verstehe ich auch nicht.
Was meinst du mit "dem Monatsnamen eine Variable zuweisen"?
Du kannst eine Variable strMonat als String deklarieren und den jeweiligen Monatsnamen reinschreiben mit
strMonat = Format(X - 2 & -1900, "mmmm")
Für X=3 (also deine Spalte 3) erhält die Variable den Wert "Januar".
Aber was bringt es dir, dass du den Monat nun auch als Text hast?
"mit jedem Monat mit einer anderen Zahl rechnen" kannst du auch, ohne die Namen der Monate zu benutzen.
Reichen da nicht schon die Nummern der Monate (also die Zahlen 1 bis 12)?
Wo kommen diese "anderen Zahlen", mit denen du rechnen musst, eigentlich her?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: Verstehe ich nicht...
15.12.2013 15:08:15
Marco
Hallo Erich,
Du hast recht select case brauch ich nicht Dein Code funktioniert Klasse.
Sorry ich hatte ihn vorhin nicht ausprobiert, weil ich ihn auch nicht verstanden hatte,
läuft wirklich tadellos.
Hätte gern einen Bruchteil von Deinen kaum Excel und VBA Kenntnissen.
Vielleicht darf ich mich noch einmal melden, wenn ich mein Werk fertig habe.
Danke Euch BEIDEN für die wirklich tolle Hilfe
einen schönen Avent
Marco

Variablenname Jahr
15.12.2013 10:41:59
Erich
Hi Marco,
in meinem Code habe ich für das Jahr den Variablennamen "myJahr" verwendet.
Von "Jahr" rate ich dir ab - da JAHR bereits der Name einer Excelfunktion ist.
Grüße aus Kamp-Lintfort von Erich

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige