Das letzte Clever-Excel-Forum.de - Treffen
fand vom 15. - 17. September 2017 in Friedrichroda /
Thüringen / Region Großer Inselsberg statt.

Datumsformat
#1
Hallo,

ich habe in einem Tabellenblatt eine (per STRG-L formatierte) Tabelle, in die ich diverse Daten per Makro übertrage, dabei wird beim letzten Eintrag das Datum in Spalte B immer anders rum (MM.TT.JJJJ) angezeigt. Wenn ich das Format aus der Zeile drüber übertrage, passt es, aber beim nächsten Makrolauf wird das Folgedatum dann wieder verkehrt formatiert.
Ich habe verschiedene Sachen versucht:
- die Tabelle in einen Bereich umgewandelt und wieder in eine Tabelle,
- ich habe den Bereich unterhalb der Tabelle richtig formatiert
trotzdem wird das neue Datum immer so komisch formatiert.

Was mache ich falsch?

Hier ist der Ausschnitt der letzten Zeilen der Liste:

Datenbank
ABCDEFGHIJKL
7041070517.12.20140,2512_2014201412Offen17.12.2014offen
7051070617.12.20140,2512_2014201412Offen17.12.2014offen
706107071.13.20150,251_201520151Offen13.01.2015offen
707

verwendete Formeln
Zelle Formel Bereich N/A
E704:E706=WENN(B704="";"";MONAT(B704)&"_"&JAHR(B704))
F704:F706=WENN(D704="";"";MONAT(D704)&"_"&JAHR(D704))
G704:G706=WENN(B704="";"";JAHR(B704))
H704:H706=WENN(B704="";"";MONAT(B704))
J704:J706=WENN(B704="";"";WENN(C704<1;"Offen";"Abgeschlossen"))
K704:K706=B704
L704:L706=WENN(C704="";"";WENN(C704=1;"abgeschlossen";WENN(C704=0,875;"fertig";"offen")))

Zahlenformate
Zelle Format Wert
B704:B705, K704:K705 'TT.MM.JJJJ 41990
B706 'M.T.JJJJ 42017
B707, D704: D705, D707, K707 'TT.MM.JJJJ
C704:C706 '0,000 0,25
D706 'M.T.JJJJ
E704:E705 'M.T.JJJJ h:mm 12_2014
E706 'M.T.JJJJ h:mm 1_2015
F704:F706 'M.T.JJJJ h:mm
K706 'TT.MM.JJJJ 42017
Zellen mit Format Standard werden nicht dargestellt
Excel-Inn.de
Hajo-Excel.de
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 18.19 einschl. 64 Bit



Hier ist das Makro, wobei ich nicht davon ausgehe, daß es am Makro liegt.
PHP-Code:
Sub prcÜbertragen_in_Datenbank()
   
   
Application.ScreenUpdating False
   Set wsSource 
Workbooks("Übersicht.xlsb").Worksheets("offen")
   
Set wbGoal Workbooks.Open(Filename:="T:\...\Dateiname.xlsb")
   
Set wsGoal wbGoal.Worksheets("Datenbank")
   
   
lngLastRow wsGoal.Range("B" wsGoal.Rows.Count).End(xlUp).Row '- 1        ' letzte belegte Zeile in Spalte B
   Set rngGoal 
wsGoal.Range("A" lngLastRow)                                 'definierte Zelle für weitere Aktionen setzen
   With rngGoal
      .ListObject.ListRows.Add
      .Offset(1, 0).Value = strReportNr
      lngLastRow = wsSource.Range("U" & wsSource.Rows.Count).End(xlUp).Row    ' 
letzte belegte in Spalte U
      
.Offset(11).Value dteStartDatum ' wsSource.Range("U" & lngLastRow).Value            ' Datum kopieren und einfügen
      
.Offset(12).Value 0.25                                              '.FormulaLocal = "=0,250"
   End With
   
   ' 
loLetzte wsGoal.Range("B" wsGoal.Rows.Count).End(xlUp).Row           ' letzte belegte Zeile in Spalte B
   
   ' 
Reportnummer-10000 neue Zeilennummer in COMPLAINT_Datenbank
   Zielzeile 
strReportNr 10000 1                                        ' Zielzeile = neue Reportnummer - 1
   MsgBox ("Eintrag in Zeile: " & Zielzeile)
   wsGoal.Range("K" & Zielzeile - 1 & ":AC" & Zielzeile - 1).Copy wsGoal.Range("K" & Zielzeile & ":AC" & Zielzeile)
   
   Set wsGoal = Nothing
   wbGoal.Close savechanges:=True
   Application.ScreenUpdating = True 
Gruß Ralf

?mage

Die deutsche Rechtschreibung ist Freeware, d.h. du kannst sie kostenlos nutzen.
Allerdings ist sie nicht Open Source, deswegen darfst du sie nicht verändern oder in veränderter Form veröffentlichen.
to top
#2
Hallo Ralf,

dann nimm doch die PasteSpecial Methode.

Diese Zeile:

Code:
wsGoal.Range("K" & Zielzeile - 1 & ":AC" & Zielzeile - 1).Copy wsGoal.Range("K" & Zielzeile & ":AC" & Zielzeile)

so:

Code:
wsGoal.Range("K" & Zielzeile - 1 & ":AC" & Zielzeile - 1).Copy
   wsGoal.Range("K" & Zielzeile & ":AC" & Zielzeile).PasteSpecial xlValues
Gruß Atilla
to top
#3
Hi,

ohne die Mappe jetzt zu kennen....
aber da du ja ohnehin VBA verwendest könntest du doch gleich das Format deiner Datumszelle über VBA zuweisen(erzwingen).

.Offset(1, 1).numberformat = "dein_gew_Format"

Ich kenne dieses Verhalten von Tabellen eigentlich nur in Verbindung mit "Leerzeilen" zwischen den Daten
Oder/Und unterschiedlichen Formeln in den einzelnen Spalten.
Oder/Und wenn Daten von anderen Sheets in das Listopject kopiert werden.

Warum es sich bei Dir ändert, keine Ahnung....
lg Chris
Feedback nicht vergessen.
3a2920576572206973742064656e20646120736f206e65756769657269672e
 ?mage

to top
#4
Hallo Ralf,

so sollte es klappen.

Arbeitsblatt mit dem Namen 'Tabelle1'
 ABC
1107071.13.20150,25
2 13.01.2015 

Code:
Sub DatumFormatieren()
Dim d As Variant

d = Tabelle1.Range("B1").Value
Tabelle1.Range("B2").Value = Format(d, "dd/mm/yyyy")

End Sub

Das hängt, wenn ich das noch richtig im Kopf habe, damit zusammen,
dass Excel im Grunden seiner Programmierung Englisch spricht und dann
auch das Datum schon mal etwas fremdländisch für uns formatiert wird.

Gruß
Max
to top
#5
Hi Atilla,

(13.01.2015, 10:38)atilla schrieb: dann nimm doch die PasteSpecial Methode.

so habe ich es jetzt mal getestet: komischerweise ist jetzt nicht nur in Spalte B sondern zusätzlich auch in Spalte K der Tabelle (STRG-T) das Datum verdreht.
Ich hatte die Bereiche ab Zeile 708 sowohl unformatiert, als auch vorformatiert getestet. Die Tabelle wurde auch automatisch durch Excel verlängert (kleines blaues Dreieck).

Die anderen zwei Lösungen teste ich nachher, aber verstehen möchte ich es trotzdem, warum es bei Tabelle/Listobjekt mit Formeln und Format und auch bei schon vorformatierten Zellen und einfügen als Werte das Datum verdreht.

[später]
Ok, ich habe mir das Makro nochmal angeschaut:

das Datum in Spalte B wird nicht in der Makro-Zeile eingetragen:
Code:
wsGoal.Range("K" & Zielzeile - 1 & ":AC" & Zielzeile - 1).Copy wsGoal.Range("K" & Zielzeile & ":AC" & Zielzeile)

sondern in der Zeile:
Code:
.Offset(1, 1).Value = dteStartDatum ' wsSource.Range("U" & lngLastRow).Value            ' Datum kopieren und einfügen

ich gehe jetzt davon aus, daß vielleicht die Variable dteStartDatum das falsche Format (es ist: dteStartDatum As Date) hat?

Wenn ich es so mache, dann passt es:
Code:
MsgBox (dteStartDatum)
      .Offset(1, 1).Value = dteStartDatum ' wsSource.Range("U" & lngLastRow).Value            ' Datum kopieren und einfügen
     d = .Offset(1, 1).Value                                                  ' Datum formatieren
     .Offset(1, 1).Value = Format(d, "dd/mm/yyyy")

in der MsgBox wird aber ein richtiges Datum angezeigt!
Gruß Ralf

?mage

Die deutsche Rechtschreibung ist Freeware, d.h. du kannst sie kostenlos nutzen.
Allerdings ist sie nicht Open Source, deswegen darfst du sie nicht verändern oder in veränderter Form veröffentlichen.
to top
#6
Hi,

Dir ist aber schon klar das Format eine Textfunktion ist?

Auszug aus der OH
Gibt einen Wert vom Typ Variant (String) zurück, der einen Ausdruck enthält, der laut den in einem Formatausdruck enthaltenen Anweisungen formatiert wird.

Format wird immer das gewählte Format als Text ausgeben. Smile
Nur ist dies so gewünscht?
lg Chris
Feedback nicht vergessen.
3a2920576572206973742064656e20646120736f206e65756769657269672e
 ?mage

to top
#7
Hallo Ralf,

aufgrund chris' Einlassung würde ich es dann so lösen:

Code:
.Offset(1, 1).Value = dteStartDatum ' wsSource.Range("U" & lngLastRow).Value            ' Datum kopieren und einfügen
.Offset(1, 1).NumberFormat = .Offset(-1, 1).NumberFormat  'Format von Zelle(eine Zeile hoch, eine Spalte weiter)
Gruß Atilla
to top
#8
Hi Chris,

(13.01.2015, 13:03)chris-ka schrieb: Dir ist aber schon klar das Format eine Textfunktion ist?

nein, war im ersten Moment nicht klar. Ist mir auch nicht aufgefallen, wäre es aber bei Auswertungen bestimmt.

Ich habe nun die Änderung von Atilla eingebaut.
Danke an alle.
Gruß Ralf

?mage

Die deutsche Rechtschreibung ist Freeware, d.h. du kannst sie kostenlos nutzen.
Allerdings ist sie nicht Open Source, deswegen darfst du sie nicht verändern oder in veränderter Form veröffentlichen.
to top
#9
Hallo zusammen,

so geht es aber auch.

Arbeitsblatt mit dem Namen 'Tabelle1'
 ABC
1107071.13.20150,25
2 13.01.2015 

ZelleFormatWert
B2TT.MM.JJJJ13.01.2015

Code:
Sub DatumFormatieren()
Dim dteStartDatum As Date

dteStartDatum = Tabelle1.Range("B1").Value
Tabelle1.Range("B2").Value = CDate(dteStartDatum)

End Sub

Sorry wegen des String-Formates. Das war mir so nicht bewusst.

Gruß
Max
to top
#10
Hi Max,

(13.01.2015, 23:31)Max schrieb: so geht es aber auch.

ja, das ist sogar noch einfacher und kürzer, da kann ich die anderen Zeilen komplett weglassen:
Code:
'      lngLastRow = wsSource.Range("U" & wsSource.Rows.Count).End(xlUp).Row    ' letzte belegte in Spalte U in Quell-Tabelle
      .Offset(1, 0).Value = strReportNr
      .Offset(1, 1).Value = CDate(dteStartDatum)                              ' Datum einfügen mit Format "Datum"
'      .Offset(1, 1).NumberFormat = .Offset(-1, 1).NumberFormat                ' Format von Zelle (eine Zeile hoch, eine Spalte weiter)
      .Offset(1, 2).Value = 0.25                                              '.FormulaLocal = "=0,250" statt Value...
Gruß Ralf

?mage

Die deutsche Rechtschreibung ist Freeware, d.h. du kannst sie kostenlos nutzen.
Allerdings ist sie nicht Open Source, deswegen darfst du sie nicht verändern oder in veränderter Form veröffentlichen.
to top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste