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

VBA Dauer berechnen

VBA Dauer berechnen
17.09.2017 17:06:22
victoria
https://www.herber.de/bbs/user/116304.doc
https://www.herber.de/bbs/user/116305.xlsm
Hallo Leute,
ich habe im Unterricht folgende Aufgaben bekommen und momentan ein Problem bei dem Quellcode für "2." bei dem Kommissionier-Lager-Programm.
Zurzeit pendele ich zwischen einem SVerweis (umgeschrieben auf VBA) und der Funktion "Selection"/"Selection Case", wobei ich bei beiden nur den Ansatz habe und mit dem Quellcode ein paar Probleme aufgetreten sind.
Habt ihr vielleicht Vorschläge, wie ich das Problem angehen kann?
Wäre echt Klasse

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

Betreff
Datum
Anwender
Anzeige
AW: VBA Dauer berechnen
17.09.2017 18:11:36
Piet
Hallo victoria
die Aufgabe ist ein richtiger Hammer, zudem offenbar eine Prüfungsarbeit.
Da wirst du schon zeigen müssen was du bei VBA wirklich selbst drauf hast.
Den Befehl Select Case kannst du hier vergessen, denk bitte selbst darüber nach. Der Wertet einen Fall aus mehreren aus. Wenn du aber per InputBox die Zeiten nacheinander in Variable ladest must du diese Variablen auch ALLE verarbeiten, oder willst du Zeiten "verschlucken"? Nur eine Zeit notieren und die anderen ignorieren?
Ich habe gesehen das du im Code in Modul1 den Befehl "End" verwendest. - Gewöhne dir das bitte ab!! - Verwende dafür Exit Sub!! Dieser Befehl ist absolut tödlich, denn er beendet ALLE laufenden Makros!! Auch Makros die in anderen Datein laufen, z.B. Daten aus dem Internet sammeln! Der stoppt alle Makros!! In einem Büro/ Industriebetrieb ist das tödlich!!
(PS Ich benutze ihn zum Test meiner Makros, gebe den Befehl aber nie im fertigen Code raus!! Auch nicht ins Forum!!)
Frage: du fragst mit deinen InputBoxen nach Zeiten für den 1.Auftrag und für die naechsten. Was verstehst du unter diesen Zeiten? Die Zeiten für den Gabelstapler haengen doch vom Weg ab, oder sehe ich das falsch? Sind das die Zeiten um den Artikel aufzuladen?
Ich habe nicht viel Zeit mir die Sache gründlich anzusehen, weil ich in Urlaub gehe. Mal sehen wieweit ich dir noch helfen kann?
Lasse den Thread mal offen für andere Kollegen die mehr Zeit haben.
mfg Piet
Anzeige
AW: VBA Dauer berechnen
17.09.2017 22:28:23
victoria
Hallo Piet,
ich habe mir das so vorgestellt, dass ich auf die Taste "Dauer" klicke und dann die Spalte der Dauer automatisch ausgefüllt wird. Praktisch auf einen Schlag.
Ich frage mit den anderen Inputboxen ab, welche Zeit der Mitarbeiter IN den Bereichen durchschnittlich benötigt und wie viel Zeit er für den ersten Artikel benötigt, um diesen im Bereich rauszusuchen, aber hier ist ebenfalls impliziert, dass er den Auftrag erst einmal annehmen muss. Dafür ist der Weg noch nicht von Relevanz. Um das in deinen Worten zu erklären ist es sehr wohl die Zeit zum "aufladen".
Vielen Dank für die hilfreichen Tipps. End Sub werde ich nun rausnehmen und Select Case ist auch aus meinen Möglichkeiten gestrichen.
Mfg und dankenden Grüßen,
Victoria
Anzeige
AW: VBA Dauer berechnen
18.09.2017 11:28:59
Peter(silie)
Hallo,
ich bin mir nicht sicher, ob ich die Anforderung zu 100% verstanden habe.
Ich habe auf die Schnelle eine UserForm erstellt.
Dort können nur Zahlen eingetragen werden.
Probier sie einfach mal aus und lese dir den Code durch, vielleicht Hilft es dir ja weiter
Hier deine Datei mit einer Eingabemaske für die Zeiten: https://www.herber.de/bbs/user/116322.xlsm
Hier nur Code:
UserForm Code:
(Name der UF: frm_Time_Input)

Option Explicit
Private InputRestriction(5) As cls_Input_Restrictions
Private worksheet_ As Worksheet
Private PrivateCounter As Long
'//Schließen
Private Sub btn_Done_Click()
Unload Me
End Sub
Private Sub btn_AddTime_Click()
Dim time_ As Double
Dim ctl As Control
Dim lRow As Long
'//Letzte Zelle in G +1
lRow = LastRow(7) + 1
For Each ctl In Me.Controls
If TypeOf ctl Is MSForms.TextBox Then
If ctl.Text  "" Then
time_ = time_ + ctl.Text
End If
End If
Next ctl
worksheet_.Cells(lRow, 7).Value = time_
End Sub
'//Nächster Auftrag
Private Sub btn_Next_Click()
Dim lRow_1, lRow_2 As Long
lRow_1 = LastRow(1)
lRow_2 = LastRow(7) + 1
If lRow_2 > lRow_1 Then Exit Sub
With worksheet_
Me.Caption = .Cells(lRow_1, 1).Value
Me.lbl_Artikel1.Caption = "Artikel " & .Cells(lRow_2, 2).Value
Me.lbl_Artikel2.Caption = "Artikel " & .Cells(lRow_2, 3).Value
Me.lbl_Artikel3.Caption = "Artikel " & .Cells(lRow_2, 4).Value
Me.lbl_Artikel4.Caption = "Artikel " & .Cells(lRow_2, 5).Value
Me.lbl_Artikel5.Caption = "Artikel " & .Cells(lRow_2, 6).Value
End With
Me.lbl_DoneWork.Caption = lRow_2 - 1 & " erledigt von " & lRow_1 - 1
Me.lbl_Todo.Caption = "Ausstehend: " & (lRow_1 - 1) - (lRow_2)
End Sub
'//Was passiert beim Initialisieren der Form
Private Sub UserForm_Initialize()
Dim i, lRow As Long
Dim currentRow As Long
'//Nur Zahlen zulassen
For i = 0 To 5
Set InputRestriction(i) = New cls_Input_Restrictions
Set InputRestriction(i).tbInput = Me.Controls("tb_Input" & i + 1)
Next i
Set worksheet_ = ThisWorkbook.Sheets("Auftrag")
'//Starte bei Auftrag ohne Zeit
currentRow = LastRow(7) + 1
With worksheet_
Me.Caption = .Cells(currentRow, 1).Value
'//Label Texte Initialisieren
Me.lbl_Artikel1.Caption = "Artikel " & .Cells(currentRow, 2).Value
Me.lbl_Artikel2.Caption = "Artikel " & .Cells(currentRow, 3).Value
Me.lbl_Artikel3.Caption = "Artikel " & .Cells(currentRow, 4).Value
Me.lbl_Artikel4.Caption = "Artikel " & .Cells(currentRow, 5).Value
Me.lbl_Artikel5.Caption = "Artikel " & .Cells(currentRow, 6).Value
End With
lRow = LastRow(1)
PrivateCounter = LastRow(7) - 1
Me.lbl_DoneWork.Caption = PrivateCounter & " erledigt von " & lRow - 1
Me.lbl_Todo.Caption = "Ausstehend: " & lRow - 1 - PrivateCounter
End Sub
'//Letzte Zeile v. gegebener Spalte
Private Function LastRow(ByVal column_ As Long) As Long
With worksheet_
LastRow = .Cells(.Rows.Count, column_).End(xlUp).Row
End With
End Function
Klassen Modul Code:
(Modul Name: cls_Input_Restrictions)

Option Explicit
Public WithEvents tbInput As MSForms.TextBox
Private Sub tbInput_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 44, 48 To 57
Case Else: KeyAscii = 0
End Select
End Sub

Anzeige
AW: VBA Dauer berechnen
18.09.2017 12:15:23
victoria
Hallo Peter(silie),
ich habe mir den Quellcode angeschaut und festgestellt, dass man für jeden Artikel selber die Zeit eintragen muss und anschließend werden die eingetragenen Zahlen addiert und in der Spalte Dauer eingetragen.
Das ist natürlich eine Möglichkeit, aber das Problem muss etwas anders angegangen werden.
Wenn ich auf den Button "Dauer" klicke, dann muss ich die Zeit der Artikel eingeben, die ich in den Bereichen zum aufladen der Artikel benötige. Dabei ist die erste Zeit für den ersten Artikel und dem auswählen des Auftrags. Die Zweite Zeit, die der User eintragen muss ist die durchschnittliche Dauer pro Artikel in seinem jeweiligen Bereich. und die letzte Zeit ist dafür, wie lange man braucht den gesamten Auftrag im Kommissionierlager versandfertig zu machen. Auch muss ich hier eintragen wie schnell mein Gabelstapler fährt.
Dies war die 1. Aufgabe in dem Aufgabenblatt.
Wobei ich Probleme habe ist:
Ich möchte einen Button haben, der wenn ich darauf drücke, mir die Spalte "Dauer" in worksheet "Auftraege" ausfüllt.
Dabei wird die Dauer berechnet, indem das Programm schauen muss, wie viele Artikel im Auftrag sind, diese müssen mit dem worksheet "Artikel" verglichen werden.
Dabei muss das Programm herausfinden, wo die Artikel zu finden sind (Bereich A-F). Anschließend muss die zurückzulegende Strecke berechnet werden, welche im worksheet "Entfernungen" zu ermitteln ist. Und zum Schluss wird die Gabelstaplergeschwindikeit genutzt, um die Zeit für die insgesamt zurückzulegende Strecke zu errechnen. Wenn das Programm all diese Werte hat, dann müssen die Zeiten nur zusammengerechnet werden.
(Dauer für den ersten Artikel + (durchschnittliche Dauer für jeden weiteren Artikel x Anzahl weiterer Artikel) + Dauer im Kommissionierlager + Zeit für die gesamte zurückgelegte Strecke).
Ich hoffe das ist einigermaßen gut erklärt, ich habe auch lange gebraucht, bis ich alle Faktoren, die benötigt werden zusammen hatte.
Vielen Dank nochmnal für den Quellcode oben, der hat mir auch weitergeholfen.
Lg Victoria
Anzeige
AW: VBA Dauer berechnen
18.09.2017 14:57:14
Peter(silie)
Hallo,
weitere eingaben als die kmh musst du noch hinzufügen.
hier Mappe: https://www.herber.de/bbs/user/116332.xlsm
Hier der Code:

Option Explicit
Private articel_ As Worksheet
Private distance_ As Worksheet
Private order_ As Worksheet
Public Sub GetDurations()
Dim IDs_(), region_() As Variant
Dim definedDistance As Long
Dim speedInput As Long
Dim lRow, i As Long
Dim time_ As Double
speedInput = Application.InputBox("Gabelstapler geschwindigkeit in kmh:", Type:=1)
Set articel_ = ThisWorkbook.Sheets("Artikel")
Set distance_ = ThisWorkbook.Sheets("Entfernungen")
Set order_ = ThisWorkbook.Sheets("Auftrag")
lRow = LastRow(order_, 1)
With order_
For i = 2 To lRow
IDs_ = GetArticels(i)
region_ = DefineRegion(IDs_)
definedDistance = DefineDistance(region_)
time_ = EvaluateTime(definedDistance, speedInput)
.Cells(i, 7).Value = time_
Next i
End With
End Sub
'//Get last cell of given sheet and column
Private Function LastRow(ByVal refSheet As Worksheet, ByVal column_ As Long) As Long
With refSheet
LastRow = .Cells(.Rows.Count, column_).End(xlUp).Row
End With
End Function
'//Get Articels of Row
Private Function GetArticels(ByVal row_ As Long) As Variant
Dim array_() As Variant
Dim i, counter As Long
With order_
For i = 2 To 6
If .Cells(row_, i).Value  "" Then
ReDim Preserve array_(counter)
array_(counter) = .Cells(row_, i).Value
counter = counter + 1
End If
Next i
End With
GetArticels = array_
End Function
'//Get the Komm-Ber. of the Articels
Private Function DefineRegion(ByRef ID_ As Variant) As Variant
Dim counter, iter As Long
Dim array_() As Variant
Dim rng, c As Range
Dim lRow As Long
ReDim array_(UBound(ID_))
lRow = LastRow(articel_, 1)
With articel_
Set rng = .Range(.Cells(1, 1), .Cells(lRow, 1))
For iter = 0 To UBound(ID_)
Set c = rng.Find(ID_(iter), LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then array_(iter) = c.Offset(, 1).Value
Next iter
End With
DefineRegion = array_
End Function
'//Distance in m
Private Function DefineDistance(ByRef region_ As Variant) As Long
Dim rng_1, rng_2, c As Range
Dim parentNode_ As Variant
Dim nodeRow As Long
Dim iter As Long
Dim tmp As Long
parentNode_ = region_(0)
With distance_
Set rng_1 = .Range(.Cells(1, 1), .Cells(8, 1))
Set rng_2 = .Range(.Cells(1, 1), .Cells(1, 8))
Set c = rng_1.Find(parentNode_, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then tmp = tmp + c.Offset(, 1).Value: nodeRow = c.Row
For iter = 1 To UBound(region_)
Set c = rng_2.Find(region_(iter), LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then tmp = tmp + .Cells(nodeRow, c.Column).Value
Next iter
End With
DefineDistance = tmp
End Function
Private Function EvaluateTime(ByVal meters_ As Long, ByVal speed_ As Long) As Double
'//speed in km/h
'//meters in meter
'//meter per minute
speed_ = speed_ * 16.6667
'//Time = 1m * time
'//Example: (300m / (10kmh * 16.6667)) = 1.796 Minutes
EvaluateTime = (meters_ / speed_) * 60
End Function

Anzeige
AW: VBA Dauer berechnen
18.09.2017 15:12:20
victoria
:O ich liebe dich
Genau das, was ich brauche! Der Quellcode ist super!
AW: VBA Dauer berechnen
18.09.2017 15:26:09
Peter(silie)
Kein Problem, freut mich wenn es klappt.
Solltest du was beim Code nicht verstehen oder sollte es Probleme geben, dann melde dich.
AW: VBA Dauer berechnen
18.09.2017 15:42:15
Piet
Hallo victoria
ich habe eine Beispieldatei für dich, weiss nicht ob ich vielleicht win wenig am Thema vorbei gegangen bin, liebe Übersicht über Daten (Fahrzeiten). Meine Tabellen "Normalzeit", Verbesserungen, Optimierungen werden dich wahrscheinlich verblüffen. Ich habe mich aber ausschliesslich um die Staplerzeiten gekümmert.
Die Geschwindigkeit wird beim ersten mal wenn du Normalzeit startest in einer Zelle gespeichert und alle Tabellen greifen per Formel auf diesen Wert zu. Weil ich bald in Urlaub gehe kann ich nicht mehr viel helfen und auch nicht mehr gross prüfen ob mein Programm einwandfrei laeuft. Ich habe in der Tabelle Verbesserung noch "Kom" hinten angehaengt, denn der Stapler muss ja vom letzen Lager aus auch zurückfahren! Den Rückweg sollte man nicht vergessen.
Bei der Optimierung habe ich es bei einer Schleife belassen, normalerweis müsste man alle Möglichkeiten durchspielen.
Dafür habe ich keine Zeit mehr. Im Urlaıub bin ich nicht erreichbar! - Viel Glück für deine Prüfung ...
mfg Piet
https://www.herber.de/bbs/user/116337.xlsm
Anzeige
AW: VBA Dauer berechnen
18.09.2017 19:38:51
victoria
:O ich liebe dich
Genau das, was ich brauche! Der Quellcode ist super!

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige