2016-06-06 2 views
5

이것은 내가 발견 한 다음 해결 된 문제이며 주제에 대한 의문점을 찾지 못했기 때문에 나중에 참조 할 수 있도록 만들 것이라고 생각했습니다.왜 Day()가 잘못된 입력에서 30을 반환합니까?

debug.Print day(ow) 
30 

왜 아무튼 '

내가 실수 놀랍게도

debug.Print day(ow) 

대신

debug.Print day(now) 

을 작성, 오히려 오류를 던지는 것보다, 내가 대신 다음과 같은 결과를 얻었다 초기화되지 않은 변수가 입력으로 주어지면 오류가 발생합니까?

+0

어쩌면 설명하겠습니까? 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

답변

6

간단한 대답은 입니다. 기본값은입니다.

다음 결과는 예시 :

debug.Print day(0) 
30 

이유는 무엇입니까? VBA 달력의 Day(0)은 날짜가 30/12/1899이므로 다음에 의해 설명 : 당신이 당신의 모듈의 상단에 Option Explicit 쓰기하지 않는 한, VBA 사용의 첫 번째 점에서 (Variant 유형으로) 당신이 자발적으로 변수를 만들 수 있습니다

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

.

변수가 생성되었지만 설정되지 않은 경우 변수는 '기본값'으로 설정됩니다. 샘플 기본값 :

Long --- 0Date, Integer을 포함한 다른 수치에 대해 (동일 Byte, Double 등VBA의 허용 형 시스템에서 0 강제 변환 할 수 있습니다)
Boolean --- False()
Variant ---도) 0 강제 변환 할 수 있습니다 Empty (
String --- Zero-Length-String ("") (이 실제로, 는 0에 강제 할 수 없다, 당신은) Day("")를 인쇄하려고하면
Any Object --- 오류가 발생합니다 Nothing

,536,

따라서 Debug.Print Day(Var)Var을 숫자 데이터 유형 또는 부울 또는 변형 (또는 처음에는 선언하지 않은 문자)이라고 쓰면 Day(0)으로 강제 변환되며 위의 결과는 30입니다. 문제의 특정 상황에서


:

VBA이 선언되지 않은 변수로 ow 인식하므로 그것을 생성 (및 Variant 데이터 형식으로 초기화한다) 및 Day()로 전달. Variant이므로 초기 값은 Empty이며이 값은 0으로 강제 변환되어 Day(0)이되며 30을 반환합니다.

+4

이것은 특히 Option Explicit을 언급 할 때 포괄적 인 대답이 될 가능성이 있습니다 (신호등 세트에서 iPhone으로 도청 될 수있는 광산과는 다릅니다). 저의 대답에서 자유롭게 느끼십시오. – Bathsheba

+0

때때로 Stack Overflow의 FGITW 현실 ^^을 잊어 버립니다. 그럴거야. – Kaz

7

모듈의 맨 위에 Option Explicit을 쓰지 않는 한 VBA를 사용하면 첫 번째 사용 시점에 자발적으로 변수를 만들 수 있습니다 (Variant 유형).

이러한 변수는 효과적으로 0으로 초기화됩니다.

따라서 day(ow)day(0)과 같으며 30으로 평가됩니다 (1899 년 12 월 30 일에 해당).

관련 문제