2016-06-06 14 views
5

To jest problem, który odkryłem, a następnie rozwiązałem, sam i ponieważ nie mogłem znaleźć odpowiedzi na pytanie dotyczące tego tematu, pomyślałem, że utworzę go na przyszłość.Dlaczego funkcja Day() zwraca 30 w przypadku nieprawidłowych danych wejściowych?

przypadkowo napisał

debug.Print day(ow) 

zamiast

debug.Print day(now) 

Ku mojemu zaskoczeniu, zamiast rzucać się błąd, zamiast tego dostaliśmy następujący wynik:

debug.Print day(ow) 
30 

Dlaczego nie robi” t generuje błąd, gdy jako zmienną wejściową podano zmienną nie zainicjowaną?

+0

Może to wyjaśni to? https://social.msdn.microsoft.com/Forums/office/en-US/f1eef5fe-ef5e-4ab6-9d92-0998d3fa6e14/what-is-story-behind-december-30-1899-as-base-date? forum = accessdev – tjb1

Odpowiedz

6

Prosta odpowiedź to wartości domyślne.

następujący wynik ma charakter przykładowy:

debug.Print day(0) 
30 

Dlaczego? Ponieważ Day(0) w kalendarzu VBA to data 30/12/1899. Wykazano brzmienie:

debug.Print format(Cdate(0), "dd/mm/yyyy") 
30/12/1899 

ile piszesz Option Explicit na górze modułu VBA pozwala na tworzenie zmiennych spontanicznie (jak Variant typów) w pierwszym punkcie obsługi.

Gdy zmienna jest tworzona (ale nie ustawiona), jest ustawiana na jej "wartość domyślną. Przykładowe domyślne wartości:

Long --- 0 (tak samo dla innych, w tym Date numerycznych, Integer, Byte, Double etc.)
Boolean --- False (który w zezwalającego układu typu Vba, mogą być zmuszany do 0)
Variant --- Empty (który może być przekonwertowany na 0)
String --- Zero-Length-String ("") (co właściwie, nie może być zmuszany do 0 i wygeneruje błąd, jeśli próby drukowania Day(""))
Any Object --- Nothing

Więc jeśli piszesz Debug.Print Day(Var) i Var jest dowolny numeryczny typ danych lub logiczna albo wariant (lub nigdy ogłoszony w pierwszej kolejności), to zostanie zmuszony do Day(0) co daje wyjście 30 jak widać powyżej.


W konkretnej sytuacji na pytanie:

VBA rozpoznaje ow jako zmienna nierejestrowanej, więc tworzy go (i inicjalizuje go do typu Variant danych) i przekazuje ją do Day(). Ponieważ jest to wariant, ma on wartość początkową Empty, która następnie jest wymuszana na 0, co daje Day(0), która zwraca 30.

+4

Może to być kompleksowa odpowiedź (w przeciwieństwie do mojej, którą można było wykorzystać na iPhonie na zestawie światłach), szczególnie jeśli wspomniano o 'Option Explicit'. Proszę, weź to z mojej odpowiedzi. – Bathsheba

+0

Czasami zapominam o przepełnieniu stosu FGITW reality ^^. Zrobi to. – Kaz

7

Jeśli nie napiszesz Option Explicit u góry modułu, VBA pozwala tworzyć spontanicznie zmienne (jako typy Variant) w pierwszym punkcie użycia.

Takie zmienne są skutecznie inicjalizowane zerowo.

Tak więc jest odpowiednikiem day(0), który ocenia na 30. (odpowiada 30-Dec-1899).

Powiązane problemy