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

Formel als Makro

Formel als Makro
15.10.2016 09:21:12
Sven
Hallo Leute,
kann man die folgende Formel irgendwie als Makro erstellen ?
WENN(ODER(C7=0;D7=0);0;REST(D7-C7;1)-(REST(D7-C7;1)*24>=6,01)*0,5/24-(REST(D7-C7;1)*24>=9)*0,5/24) +WENN(ODER(E7=0;F7=0);0;REST(F7-E7;1)-(REST(F7-E7;1)*24>=6,01)*0,5/24-(REST(F7-E7;1)*24>=9)*0,5/24) +WENN(ODER(G7=0;H7=0);0;REST(H7-G7;1)-(REST(H7-G7;1)*24>=6,01)*0,5/24-(REST(H7-G7;1)*24>=9)*0,5/24) +WENN(ODER(I7=0;J7=0);0;REST(J7-I7;1)-(REST(J7-I7;1)*24>=6,01)*0,5/24-(REST(J7-I7;1)*24>=9)*0,5/24) +WENN(ODER(K7=0;L7=0);0;REST(L7-K7;1)-(REST(L7-K7;1)*24>=6,01)*0,5/24-(REST(L7-K7;1)*24>=9)*0,5/24) +WENN(ODER(M7=0;N7=0);0;REST(N7-M7;1)-(REST(N7-M7;1)*24>=6,01)*0,5/24-(REST(N7-M7;1)*24>=9)*0,5/24) +WENN(ODER(O7=0;P7=0);0;REST(P7-O7;1)-(REST(P7-O7;1)*24>=6,01)*0,5/24-(REST(P7-O7;1)*24>=9)*0,5/24) +SUMMENPRODUKT((C7:P7={"u";"ft";"k"})*1) *H6/24~f~
~f~ZÄHLENWENN(C7:P7;"U")+ZÄHLENWENN(C11:P11;"U")+ZÄHLENWENN(C15:P15;"U")+ZÄHLENWENN(C19:P19;"U") +ZÄHLENWENN(C23:P23;"U")+ZÄHLENWENN(C27:P27;"U")
So das es sich um die dazu kommenden Zeilen erweitert bzw. auch diese ausrechnet ?
https://www.herber.de/bbs/user/108801.xlsx
Vielen dank schon mal für eure Mühe.
VG
Sven

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Formel als Makro
15.10.2016 10:09:11
ransi
Hallo Sven,
Was willst du mit der Mörderformel denn ausrechnen?
ransi
AW: Formel als Makro
15.10.2016 10:29:39
Sven
Hallo ransi ,
Damit werden Abwesenheitszeiten ausgerechnet und die Pausen automatisch abgezogen .
D.h. Wenn ich von 10:00 bis 18:00 eingebe , wird die Anwesenheit minus den Pausen ausgerechnet und auf die Woche addiert .
Dann werden werte bei krank und Urlaub automatisch mir einen vorbestimmten Wert aus einen anderen Datenblatt dazu addiert .
Die andere Formel zählt krank und Urlaub und gibt das am Ende der Woche aus .
Vg
Sven
AW: Formel als Makro
15.10.2016 11:42:11
Bastian
Dafür müsstest du es schon besser beschreiben wieviel pause wo wird Krank eingetragen usw.
und was wird noch mal genommen als letztes =D
Mit *'\\Mac\Home\Desktop\Arbeit\Neuer Ordner\[Dienstplan.xls]Einstellungen'!H6/24
Kann man nicht viel anfangen
Gruß Basti
Anzeige
AW: Formel als Makro
15.10.2016 11:55:49
Sven
Hi basti ,
Also bei den Pausen Zeiten ist es von 0 bis 6 Stunden , keine Pause , ab 6 bis 8 eine halbe Stunde und über acht Stunden 45 min Pause .
K und U wird in der Tabelle bei von eingetragen und bis bleibt leer . Das andere ist der Wert welcher bei u und k gerechnet werden soll und dieser steht auf einen anderen Tabellenplatt weil der unterschiedlich ist . Das * soll nur die dezimal Zeit in Industrie Zeit rechnen . Z.b . 6:40 h ist dann 6,67 h
Gruß
Sven
AW: Formel als Makro
15.10.2016 13:45:15
Bastian
Hm Das mit den deinen Pausen in deier Formel Passt aber nicht die Pause über 8 H 45min gibts nicht oder ich bin zu doof =D zumindest komme ich auf ein andere ergebniss.
Nun ja ich Guck mal was man da so mit meiner schwachen erfahrung hin bekommt =D
Soll das für alle Worksheets sein die in dem Workbook sind ?
Gruß Basti
Anzeige
AW: Formel als Makro
15.10.2016 13:49:11
Sven
Hi Basti ,
ja das soll für alle sheets sein Januar bis Dezember .
Aber wenn da drunter noch ein Name hinzu kommt soll es auch für den funktionieren 🙈
Gruß
Sven
AW: Formel als Makro
15.10.2016 14:03:38
Bastian
Hey Vielleicht so ?
Gruß Basti

Option Explicit
Sub rechnen()
Dim ListStr
Dim PauseUeber6 As Date, PauseUeber8 As Date, Date1 As Date, Date2 As Date
Dim Jein As Long, Firstcell As Long, x As Long, c As Long
Dim WStunden As Double, MStunden As Double
Dim NamenDazu As String
Dim Ws As Worksheet
PauseUeber6 = "00:30:00"
PauseUeber8 = "00:45:00"
NamenDazu = ",Name1,Name2,Name3" ' Hier die Namen der Worksheets eintragen die auch berechnet  _
werden sollen aber nicht Januar-Dezember heißen"
For Each Ws In ThisWorkbook.Worksheets
Jein = InStr(1, Join(Application.GetCustomListContents(8), ",") & NamenDazu, Ws.Name)
If Not Jein = 0 Then
With Ws
Firstcell = 7
Do While Not IsEmpty(.Cells(Firstcell + x, 1))
For c = 3 To 16 Step 2
If IsNumeric(.Cells(Firstcell + x, c).Value) Then
Date1 = CDate(.Cells(Firstcell + x, c).Value)
Date2 = CDate(.Cells(Firstcell + x, c).Offset(0, 1).Value)
If (Date2 - Date1) > CDate("08:00:00") Then
WStunden = WStunden + (Date2 - Date1 - (1 * CDate(PauseUeber8)))
ElseIf (Date2 - Date1) > CDate("06:00:00") Then
WStunden = WStunden + (Date2 - Date1 - (1 * CDate(PauseUeber6)))
Else
WStunden = WStunden + (Date2 - Date1)
End If
End If
Next
With .Range("T" & Firstcell + x)
.Value = WStunden
.NumberFormat = "[h]:mm:ss;@"
End With
MStunden = MStunden + WStunden
WStunden = 0
x = x + 4
Loop
With .Range("U" & Firstcell)
.Value = MStunden
.NumberFormat = "[h]:mm:ss;@"
End With
End With
MStunden = 0
x = 0
End If
Next
End Sub

Anzeige
AW: Formel als Makro
15.10.2016 19:50:55
Sven
Hey Basti,
Ich werde es nachher ausprobieren und gib dir dann Rückmeldung .
Gruß
Sven
die "andere" Formel kannst Du eindampfen
15.10.2016 11:46:13
WF
von:
=ZÄHLENWENN(C7:P7;"U")+ZÄHLENWENN(C11:P11;"U")+ZÄHLENWENN(C15:P15;"U")+ZÄHLENWENN(C19:P19;"U") +ZÄHLENWENN(C23:P23;"U")+ZÄHLENWENN(C27:P27;"U")
auf:
=SUMME(ZÄHLENWENN(INDIREKT({"C7:P7";"C11:P11";"C15:P15";"C19:P19";"C23:P23";"C27:P27"});"U"))
WF
AW: die "andere" Formel kannst Du eindampfen
15.10.2016 11:56:51
Sven
😂 wie meinst du das ?
Eindampfen ?
na ja: verkürzen
15.10.2016 12:16:42
WF
.
AW: na ja: verkürzen
15.10.2016 12:36:48
Sven
Achso ich doofi 😂
AW: Formel als Makro
16.10.2016 10:55:26
Sven
Hey Basti,
das Makro funktioniert ganz gut, zumindest in der ersten Daten Zeile.
Wie kann ich festlegen in welcher spalte bzw. wo das Ergebnis erscheinen soll ?
Kann ich da noch einfügen wenn da U FT oder K eingetragen wird , das er sich aus einer bestimmten Zelle die zu dem Namen gehört den wert holt und dazu rechnet ?
Wie kann ich das auf Zeilen anwenden die dann dazu kommen ?
Ich glaube ich hab da Vorstellungen die nicht wirklich gut zu realisieren sind
Gruß
Sven
Anzeige
AW: Formel als Makro
16.10.2016 12:28:46
Bastian
Ich weiß zwar nich wie du das genau meinst aber hier mal ein Muster=D
Du solltest den Code im einzel Modus ablaufen damit du ihn auch verstehst.
Gruß basti
https://www.herber.de/bbs/user/108811.xlsm
AW: Formel als Makro
16.10.2016 15:09:50
Sven
Hi Basti,
das Funktioniert super.
Was ist jedoch wenn unter Hans jeweils noch 10 andere Namen stehen, geht das dann auch für diese ?
Gruß
Sven
AW: Formel als Makro
16.10.2016 16:05:45
Bastian
Ja das müsste auch gehen solange dein format so bleibt ´wie in der Bsp. Datei.
Hier ersetz mal war noch ein kleiner Fehler drinne
Option Explicit
Sub rechnen()
Dim ListStr
Dim PauseUeber6 As Date, PauseUeber8 As Date, Date1 As Date, Date2 As Date
Dim Jein As Long, Firstcell As Long, x As Long, c As Long
Dim WStunden As Double, MStunden As Double
Dim NamenDazu As String
Dim Ws As Worksheet
On Error GoTo err
On Error Resume Next
Dim NAmeSort As Worksheet
Dim FindenName As Range, FindenSonder As Range
Set NAmeSort = ThisWorkbook.Worksheets("NamenSonderWerte")
PauseUeber6 = "00:30:00"
PauseUeber8 = "00:45:00"
NamenDazu = "Name1,Name2,Name3" ' Hier die Namen der Worksheets eintragen die auch berechnet  _
werden sollen aber nicht Januar-Dezember heißen"
For Each Ws In ThisWorkbook.Worksheets
Jein = 0
Jein = Application.WorksheetFunction.Match(CStr(Ws.Name), Split(Join(Application. _
GetCustomListContents(8), ",") & "," & NamenDazu, ","), 0)
'Jein = InStr(1, Join(Application.GetCustomListContents(8), ",") & NamenDazu, Ws.Name)
If Not Jein = 0 Then
With Ws
Firstcell = 7
Do While Not IsEmpty(.Cells(Firstcell + x, 1))
For c = 3 To 16 Step 2
If IsNumeric(.Cells(Firstcell + x, c).Value) Then
Date1 = CDate(.Cells(Firstcell + x, c).Value)
Date2 = CDate(.Cells(Firstcell + x, c).Offset(0, 1).Value)
If (Date2 - Date1) > CDate("08:00:00") Then
WStunden = WStunden + (Date2 - Date1 - (1 * CDate(PauseUeber8)))
ElseIf (Date2 - Date1) > CDate("06:00:00") Then
WStunden = WStunden + (Date2 - Date1 - (1 * CDate(PauseUeber6)))
Else
WStunden = WStunden + (Date2 - Date1)
End If
Else
Set FindenName = NAmeSort.Columns(1).Find(.Cells(Firstcell + x, 1).Value,  _
LookIn:=xlValues)
Set FindenSonder = NAmeSort.Rows("1:1").Find(.Cells(Firstcell + x, c).Value,  _
LookIn:=xlValues)
Select Case UCase(.Cells(Firstcell + x, c).Value)
Case "K"
WStunden = WStunden + CDate(NAmeSort.Cells(FindenName.Row, FindenSonder.Column). _
Value)
Case "FT"
WStunden = WStunden + CDate(NAmeSort.Cells(FindenName.Row, FindenSonder.Column) _
.Value)
Case "K"
WStunden = WStunden + CDate(NAmeSort.Cells(FindenName.Row, FindenSonder.Column) _
.Value)
End Select
End If
Next
With .Range("R" & Firstcell + x)
.Value = WStunden
.NumberFormat = "[h]:mm:ss;@"
End With
MStunden = MStunden + WStunden
WStunden = 0
x = x + 4
Loop
With .Range("S" & Firstcell)
.Value = MStunden
.NumberFormat = "[h]:mm:ss;@"
End With
End With
MStunden = 0
x = 0
End If
Next
Exit Sub
err:
MsgBox "In der  Tabelle " & NAmeSort.Name & " kann der Name einer Person nicht gefunden  _
werden "
End Sub
Gruß Basti
Anzeige
AW: Formel als Makro
16.10.2016 17:56:51
Sven
Hi Basti,
funktioniert Super.
Kann man das so einstellen, dass das Makro automatisch läuft sobald eine eingabe in den Zellen gemact wird ?
Gruß
Sven
AW: Formel als Makro
16.10.2016 18:27:48
Bastian
Ja das geht aber dafür war das Makro nicht ausgelegt da es jedesmal alle Tabellenblätter Aktualisiert und das kann paar sec dauern wenn du zuviele Blätter hast aber ich denke mit 12 passt das noch .
Diesen code in DiesesArbeitsblatt kopiereen
Gruß Basti
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Column >= 3 And Target.Column 

Wenn nicht schau die dir Variante von Daniel an vielleicht kommst du damit besser klar.
Anzeige
AW: Formel als Makro
17.10.2016 14:03:31
Sven
Hey Basti ,
Ich werd es heute Abend gleich testen .
Vielleicht kannst ja dann bei meinen anderen Problem helfen 🙈
Gruß
Sven
AW: Formel als Makro
16.10.2016 17:27:44
Daniel
Hi
ich würde hier nicht unbedingt mit einem Makro arbeiten, sondern eine benutzerdefinierte Funktion erstellen, welche genau für dein Problem geeignet ist.
Dann schriebst du einfach nur diese Funktion in die entsprechenden Zellen.
dh ins Modul kommt dieser Code:
Function Zeitberechnung(Beginn_EndZeiten As Range, Zeit_Bei_FT_K_U As Double) As Double
Dim arrZeit
Dim s As Long
Dim T As Double
arrZeit = Beginn_EndZeiten.Value
For s = 1 To UBound(arrZeit, 2) Step 2
If IsNumeric(arrZeit(1, s)) And IsNumeric(arrZeit(1, s + 1)) Then
If (arrZeit(1, s + 1) * arrZeit(1, s)) > 0 Then
T = arrZeit(1, s + 1) - arrZeit(1, s)
If T > TimeSerial(6, 0, 0) Then T = T - TimeSerial(0, 30, 0)
If T > TimeSerial(8, 0, 0) Then T = T - TimeSerial(0, 30, 0)
Zeitberechnung = Zeitberechnung + T
End if
Else
Select Case LCase(arrZeit(1, s))
Case "u", "k", "ft"
Zeitberechnung = Zeitberechnung + Zeit_Bei_FT_K_U
End Select
End If
Next
End Function
und in die Zelle R7 dann diese Formel:
=Zeitberechnung(C7:P7;ZEIT(6;40;0))
der erste Parameter sind die Zellen mit den Komm- und Geh-Zeiten (immer abwechselnd)
der zweite Parameter ist die Zeit, die bei K; U und FT eingesetzt wird.
Welche Abzüge für die Pausen gemacht werden, kannst du im Code leicht erkennen und ggf anpassen.
hier ist es eine halbe Stunde bei mehr als 6h Arbeitszeit und eine Stunde bei mehr als 8h Arbeitszeit (wie in deiner Formel). Die berechnug erfolgt additiv.
Alternativ kannst du die Formel aber auch kürzen und die Berechnung mit dieser Formel machen:
Ist ne Matrixformel, dh eingabe immer mit SHIFT+STRG+ENTER abschließen.
=SUMMENPRODUKT(WENN(ISTZAHL(C7:O7);WENN(ISTUNGERADE(SPALTE(C7:O7));(D7:P7-C7:O7)-WENN((D7:P7-C7:O7) >ZEIT(8;0;0);ZEIT(0;30;0))-WENN((D7-P7-C7:O7)>ZEIT(8;0;0);ZEIT(0;30;0)));WENN(C7:O7""; ISTZAHL(SUCHEN(C7:O7;"_K_U_FT_"))*ZEIT(6;40;0)))) 
Gruß Daniel
Anzeige
AW: Formel als Makro
17.10.2016 20:17:02
Sven
Hi Daniel,
danke für den Code/Formel, jedoch sind die werte für U,FT,K von person zu person unterschiedlich und variieren je nach anstellungsart :-(.
Die vorherige Formel hat die werte aus einer anderen Tabelle geholt , wo es hinterlegt war .
Gruß
Sven
AW: Formel als Makro
17.10.2016 20:33:07
Daniel
Hi
deswegen habe ich ja die Zeit für diese Texte als freien Parameter angegeben.
du musst da nicht unbedingt den Wert "Zeit(6;40;0)" eingeben, du kannst dort auch jede andere Formel als Parameter hinterlegen und dir ggf aus einer Personaltabelle die jeweilige individuelle Tägliche Arbeitszeit auslesen (Wahrscheinlich mit SVerweis oder was ähnlichem)
Gruß Daniel
Anzeige
AW: Formel als Makro
17.10.2016 20:49:23
Sven
Ah ja cool,
da war ja was mit SVErweis :-)
Danke für den Denkanstoss :-)
Gruß
Sven

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige