2017-08-24 4 views
0

Ich experimentiere gerade mit der Verwendung von Formel in VBA, in dem ich ein Blatt mit 3 Spalten habe. Eins für Jahr, Monat und Tag. Gemeinsam werden sie ein pseudo-Datum in einer anderen Spalte unter Verwendung der Formel bilden:Warum ist mein Spaltenformat inkonsistent?

=I4& "/" &H4& "/" &G4 

Dann in einem anderen Blatt ich eine Spalte, die die Pseudo-date und kopieren Sie sich über Vlookup in VBA erhalten.

Bevor ich VBA verwendet habe, legte ich die Formel in die Spalte selbst und es funktioniert gut. Nur wenn ich versuchte, es in VBA zu platzieren, passiert Seltsamkeit.

Einige Zellen haben das richtige Format, während einige standardmäßig eine Folge von Zahlen sind. Bei genauerer Betrachtung enden Datumsangaben mit Tagen, die kleiner als 13 sind, standardmäßig auf Zahlenfolgen

Beispiel: Einige Zellen haben die Nummern 42741 usw., während andere das richtige Format 20/6/2017 haben.

Ich habe sichergestellt, dass die Vlookup-Spalte das gleiche Format wie die Pseudo-Datumspalte verwendet, die allgemein ist und das Problem weiterhin besteht.

Wenn ich das Format in ein Datum änderte, enden diejenigen, deren Datum standardmäßig auf Zahlenfolgen festgelegt wurde, mit den Tagen und Monaten, die umgekehrt wurden. (1/8/2017 wird 8/1/2017 und so weiter). Wiederum sind diejenigen mit Tagen 13 und älter nicht betroffen.

Ich habe sogar versucht, das Zahlenformat auf der Vlookup-Spalte aber noch einmal kein Glück zu setzen. Hier ist der Code als Referenz.

Private Sub Worksheet_Change(ByVal Target As Range) 

    If Not Intersect(Target, Range("a4:a9999")) Is Nothing Then 
     With Me.Range("d4:d9999") 
      .Formula = "=IF(ISNA(VLOOKUP(A4,ProjectEntry,10,FALSE)),"""",VLOOKUP(A4,ProjectEntry,10,FALSE))" 
      .Value = .Value 
      .NumberFormat = "dd/mm/yyyy" 
     End With 

Die Frage ist jetzt, warum ist Excel alle Bonkers über dieses Datum Problem?

Bearbeiten: Ich habe einen Weg gefunden, um sicherzustellen, dass das Datumsformat an beiden Enden ähnlich ist.

Der Code verwendet jetzt Kopieren und Einfügen als Werte, um die gewünschten Daten zu erhalten.

With Me.Range("d4:d9999") 
    .Formula = "=IF(ISNA(INDEX(ProjectEntry,MATCH(A4,ProjectEntry[Project No],FALSE),10)),"""",INDEX(ProjectEntry,MATCH(A4,ProjectEntry[Project No],FALSE),10))" 
    .Copy 
    .PasteSpecial Paste:=xlPasteValuesAndNumberFormats 
End With 

jedoch das Problem, das ich mit diesem ist, dass es hinter dem Kopierfeld verlässt (das sich bewegende Feld gepunkteten Linien, die angezeigt wird, wenn Sie kopieren Zelle (n)) und es immer auf die erste Zeile springe ich in die deklarierte Code (Zeile 4). Ich möchte nicht jedes Mal bis zum Ende scrollen, wenn ich meine Daten eintrage. Gibt es eine Möglichkeit, dies in meinem Code zu entfernen?

+0

Excel ist verwirrt über das Format (sind die Tage zuerst oder die Monate)?Versuchen Sie es mit ISO 8601 zu füttern, da es eindeutig ist ('yyyy-MM-dd'), unabhängig davon, wie Sie das Datum visuell formatieren. –

Antwort

0

In Excel ist ein Datum eine Zahl. Excel zählt die Tage seit dem 31. Dezember 1899. Dann zeigt es diese Nummer in einer Weise an, die Ihnen wie ein Datum aussieht. Excel macht das auch im Rückwärtsgang. Wenn Sie etwas eingeben, das wie ein Datum aussieht, wird Ihr Eintrag in eine Zahl umgewandelt, die dieses Datum darstellt. Ich werde nicht auf etwas eingehen, das wie ein Datum aussieht, sondern als Hinweis, es hat mit Ihren regionalen Einstellungen zu tun.

Nun sollte Ihr "Pseudodatum" '= Datum (G4, H4, I4)' sein (Reihenfolge ist Jahr, Monat, Tag). Das Ergebnis ist eine Zahl. Angenommen, Sie haben die Funktion Date() in K4, und Sie könnten K4 als "TT/MM/JJJJ" (ohne die Anführungszeichen) formatieren, und das ist, was die Zelle zeigen wird. Währenddessen ist der Wert eine Zahl, die das angezeigte Datum darstellt.

Jetzt, da Sie die richtigen Werte haben, können Sie VLookup oder andere Funktionen verwenden. Das ist ein anderes Thema - wenn Sie Probleme damit haben.

+0

Ich verstehe nicht ... Ich habe versucht, die Formel in VBA zu verwenden und sogar versucht, mit dem, was ich habe, zu kombinieren. Aber alles, was ich bekomme, ist nur #NAME? Kannst du mehr ausarbeiten oder ein Beispiel geben, weil ich verloren bin? – hjh93

+0

Ich apoligise! 'DateSerial()' ist eine VBA-Funktion. Das Arbeitsblatt-Äquivalent ist einfach "Date()", wobei die drei Argumente, Year, Month, Day - in dieser Reihenfolge verwendet werden. Ich habe das in meinem obigen Beitrag korrigiert. – Variatus

+0

alles ist gut. Endlich ist dieses Problem erledigt. Danke vielmals. – hjh93

Verwandte Themen