UserForm rechnet nicht richtig.?

7 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Bilder waren hilfreich...

Der Inhalt der Textbox wird bei der Übernahme nicht als Datum formatiert, daher kommen die merkwürdigen Ergebnisse beim Rechnen.

Versuch mal
Activecell.offset(0,2).value = CDATE(.textbox3.value) und das gleiche mit der 2. Textbox.

Oder statt Textfeld ein DTPicker (also Kalenderauswahlfeld)
Das musst Du meist allerdings noch in die Werkzeugsammlung der Userform aufnehmen: Im VBA Editior unter Extras -> Weitere Werkzeuge und dort den Microsoft Date and Time Picker Control auswählen. Damit können nur gültige Datumswerte erfasst werden und das CDATE entfällt.


Meinst du mit UserForm ein VBA-Macro mit grafischer Oberfläche? Dann musst du die Berechnung der Differenzzeiten in deinem Macro vornehmen und dabei berücksichtigen, dass Excel immer mit Tagen rechnet. Eine Stunde sind für Excel 0,0416666667 Tage.

Genau so meine ich das allerdings ist doch in den Zellen der Spalte "I" eine Kombibox....die müsste mit runter genommen werden. Und auch das Format soll mit runter genommen weden. siehe Anhang 

Excel - (Microsoft Excel, VBA, UserForm) VBA - (Microsoft Excel, VBA, UserForm)

Ninombre  26.04.2016, 14:53

ich hab im Moment keine konkrete Idee. Mein erster Ansatz einfach aus der Zeile darüber zu kopieren geht nicht, weil die Kombibox ja ein Steuerelement ist und es zudem ja sein kann, dass hier schon ein Eintrag drin steht.

Ich muss bei nächster Gelegenheit mal nachdenken

0
Ninombre  27.04.2016, 10:55
@Ninombre

Wenn Du statt den Comboboxen für den Status auf die Variante umsteigen kannst / willst, die Datenprüfung zu nutzen (Daten > Datengültigkeit prüfen > Liste: Dort wie bei den Comboboxen A4:A7 als Liste):

Dann die beiden Zeilen mit activecell.offset(0,6) bzw. 0,7, die bisher drin stehen ersetzen durch die folgenden. Das geht evtl. noch besser, sollte aber zumindest funktionieren:

With ActiveCell.Offset(0, 6)
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
End With
ActiveCell.Offset(0, 7) = "offen"
ActiveCell.Offset(0, 7).Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=$A$4:$A$7"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
0

Wie gesagt, bei mir funktioniert das.
Mir fällt auf, das bei 18.04/ 20.04 die Berechnung in der Spalte G richtig ist.
Versuche mal heraus zu bekommen, WAS da anders ist als in den anderen Zeilen.
Wie sind die Formatierungen der Zellen?
Schreib mal in H1: =E1, zieh das runter und formatiere die Spalte H danach als Zahl. Das gleich mit I1/ F1.
Fällt da etwas auf?
Ninombres Hinweise könnten auch sehr hilfreich sein.

Notfalls lade doch mal eine Beispieltabelle hoch.

Woher ich das weiß:Berufserfahrung – IT-Administrator (i.R.)

Deine Formel verstehe ich noch nicht so ganz.

In F3 steht ein Endtermin, z. B. 01.05.2016. In H3 die Differenz von heute zum Endtermin (=ABS(HEUTE()-F3)). 

In G3 soll die Differenz zwischen Endtermin und Anfangstermin stehen (=F3-E3). Du rechnest aber G=F3-H3.

Deine Formel passt nicht zu deiner Beschreibung.

In VBA kannst du auf Zellwerte mittels Range("G3").Value und auf die Formel mittels Range("G3").Formula / .FormulaR1C1 / ... zugreifen.


Monkee 
Beitragsersteller
 25.04.2016, 13:23

Das ist richtig, nur weiß ich eben nicht wie ich das in der UserForme berechne. Anfangstermin=22.04.2016 Endtermin =30.04.2016. ergibt eine Dauer von 8 Tagen. Und mit deiner Formel Abs(Heute()- F3 verbleiben noch 5 Tage.Hier mal den Code

Private Sub CommandButton1_Click()
Set frm = UserForm1
Application.ScreenUpdating = False
Sheets("Tabelle3").Activate
'letzte belegte Zelle in Tabelle finden
Range("c65536").End(xlUp).Offset(1, 0).Select

With frm

ActiveCell.Offset(0, 0).Value = .ComboBox1.Value 'Aufgabe
ActiveCell.Offset(0, 1).Value = .ComboBox2.Value 'Mitarbeiter
ActiveCell.Offset(0, 2).Value = .TextBox3.Value 'Anfangstermin
ActiveCell.Offset(0, 3).Value = .TextBox4.Value 'Endtermin
ActiveCell.Offset(0, 4).Value = ActiveCell.Offset(0, 3) - ActiveCell.Offset(0, 2)
ActiveCell.Offset(0, 5).Value = Abs(HEUTE() - F3)

End With
Unload Me
'UserForm1.Hide....abbrechen
Sheets("Tabelle3").Activate
End Sub

Ich hoffe das es jetzt verständlich ist.

Gruß Monkee

0
Suboptimierer  25.04.2016, 13:31
@Monkee

Das kann natürlich nicht funktionieren:

ActiveCell.Offset(0, 5).Value = Abs(HEUTE() - F3) 

Du musst den rechten Teil noch in VBA-Syntax umwandeln.

ActiveCell.Offset(0, 5).Value = Abs(Date() - ActiveCell.Offset(0, 3).Value)

Du schreibst übrigens nicht einheitlich .Value hinter das Offset.

0
Suboptimierer  25.04.2016, 13:36
@Monkee

Alternative:

ActiveCell.Offset(0, 5).FormulaR1C1 = "=ABS(TODAY()-RC[-2])"
0