Compreender a função Excel VBA IsDate

função IsDate do VBA supostamente informa se uma cadeia de texto pode ser interpretado como uma data. Por exemplo, todas as seguintes expressões são avaliadas como True:

IsDate (# 147-5 / 25/2015 # 148-) IsDate (# 147-January 16 # 148-) IsDate (# 147-12-1 # 148-) IsDate (# 147-12/1/15 # 148- ) IsDate (# 147-2 / 30 # 148-) IsDate (# 147-30 / 2 # 148-)

Nos dois últimos exemplos, observe que IsDate não é exigente sobre a ordem do dia e mês. Ambas estas cordas poderia ser interpretado como uma data, então IsDate retorna True (independentemente de suas configurações de formato de data do sistema).

Aqui estão algumas informações a partir de um Artigo de suporte da Microsoft:

A VBA funções de data IsDate, formato, CDate e CVDate utilizam uma função encontrada na automação OLE (OleAut32.dll). Esta função procura todos os possíveis formatos de data por tokenizing cada um dos valores separados na cadeia que representa a data e retorna um valor booleano que indica se a entrada pode ser representada como uma data.

Isto é importante para lembrar ao usar a função de interpretar uma data que contém um ano de 2 dígitos. Locais diferentes usar vários formatos de data (isto é, mm / dd / aa, aa / mm / dd, # 147-DD MMM AA# 148-, # 147-YY MMM DD# 148-, e assim por diante) e, portanto, a função tenta os dígitos em todas as posições até que a função tenha encontrado uma data válida ou esgotado todas as possibilidades.

Só porque IsDate reconhece uma string como uma data não significa que a cadeia pode ser confiavelmente convertido para uma data. Em alguns casos, o resultado é ambígua. Por exemplo, o que acontece com esta expressão?

IsDate (# 147-29-Feb-01 # 148-)

29 de fevereiro de 2001 não é uma data válida. No entanto, esta expressão retorna True porque 01 de fevereiro de 1929 (e 2 de Janeiro, 1929) são datas válidas. E assim são as mesmas datas em 2029.

A busca de documentação IsDate veio vazio. Com base em testes, IsDate aceita qualquer dos seguintes como caracteres de separação: uma barra (/), um hífen (-), uma vírgula (,), um ponto e um espaço (.).

Portanto, as seguintes expressões todas retornar True:

IsDate (# 147-5.1 # 148-) IsDate (# 147-30 6 # 148-) IsDate (# 147-30,6 # 148-) IsDate (# 147-1 / 2 # 148-)

Mas depois há esta anomalia: As expressões a seguir retorna True:

IsDate (# 147-5.1.5 # 148-) IsDate (# 147-5.1.05 # 148-)

No entanto, inexplicitly, esta expressão devolve Falso:

IsDate (# 147-5.1.2005 # 148-)

Suponha que você criou um formulário de usuário com um InputBox onde o usuário insere uma data. Deve ficar claro que o uso de ÉData para validar a entrada não é muito fiável.

As coisas ficam ainda mais confuso quando você percebe que IsDate abrange também os valores de tempo. (Não há nenhuma função ISTIME correspondente.) Então, as seguintes expressões todas retornar True:

IsDate (# 147-4: 45 # 148-) IsDate (# 147-4.45 # 148-) IsDate (# 147-4 45 # 148-) IsDate (# 147-4 / 45 # 148-) IsDate (# 147- 23: 59 # 148-)

Estas expressões retornar False:

IsDate (# 147-4: 60 # 148-) IsDate (# 147-24.45 # 148-)

É importante salientar que IsDate não apresentar todas estas peculiaridades quando você passa um argumento intervalo. Por exemplo:

IsDate (Range (# 147-A1 # 148-))

Parece que ÉData é perfeitamente fiável a identificação de células que contém uma data ou uma hora. Não se trata, por exemplo, identificar uma célula que contém 5.1 como uma data. Se o seu código precisa para determinar se uma cadeia pode ser interpretado como uma data, a melhor solução é colocar essa string em uma célula e, em seguida, escrever código para verificar o conteúdo da célula.

menu