Visual Basic - Datas e o ano 2000.
"Time is on my side...", este é um refrão de uma música tocada pelos Rolling Stones,
que significa mais o menos o seguinte "O tempo esta do meu lado". O que significa isto? 
alguém pode pensar ao ler estas linhas. 

Calma , isto é apenas uma chamada para alertar que os desenvolvedores de aplicações 
não podem cantar o refrão sem pensar que na verdade "Time is against me...", i.e, o
tempo está contra mim. Sabe porque ?  Por que nos aproximamos do século XXI e o 
"Bug do Milênio" está cada vez mais perto.

Vamos procurar entender a razão do problema e de como tratá-lo para evitar frustações
futuras. Iremos nos ater apenas aos seguintes aplicativos da Microsoft utilizados em 
aplicaçoes desktop: Visual Basic e  Access.

Um Pouco de história

Para todas as versões do Visual Basic ate a versão 3.0 , datas informadas com dois 
digitos (dd/mm/yy) , são consideradas como pertencentes ao seculo XX , i.e, 1900. 
12/01/09 -----> 12/01/1909
01/01/00 -----> 01/01/1900
30/02/40 -----> 30/02/1940.
O código que implementa este tratamento está , neste caso, embutido no run-time de cada versão , e não depende da versão do sistema operacional utilizado nem do formato da data usada. Com o surgimento da Automação OLE e do VBA (Visual Basic for Applications) o código responsável pela conversão dos dois dígitos usados em datas (dd/mm/yy) para quatro dígitos (dd/mm/yyyy) passou a ser responsabilidade das livrarias de AUTOMAÇÃO OLE. Então a VBA não mais implementa este código , apenas chama a livraria responsável pela conversão. A partir da versão 4.0 do Visual Basic foi definida um novo comportamento para as datas informadas com dois digitos no ano (dd/mm/yy). Elas são convertidas para o século utilizado na data do sistema. Assim se a data do sistema é o presente século (1900) 01/01/00 será interpretada como 01/01/1900 , porém se a data do sistema for o século XXI (2000), a data será interpretada como 01/01/2000. Esta regra foi implementada na livraria de Automação OLE usada pelo Visual Basic 4.0 e pelo VBA. Acontece que a Microsoft alterou a interpretação dada aos dois digitos para o ano a partir da versão 2.20.4049 da biblioteca OLEAUT32.DLL. Para as aplicações que usam esta biblioteca datas com dois dígitos para o ano cujo dígitos sejam de 00 a 29, são interpretadas como sendo do século XXI e as demais como sendo do século XX.
12/01/09 -----> 12/01/2009
01/01/29 -----> 01/01/2029
30/02/40 -----> 30/02/1940.
30/02/72 -----> 30/02/1972.
Tentando Arrumar a Casa. Meu Deus, que confusão !!!. Vamos tentar por as coisas nos seus lugares.
Aplicativo Regra
Aplicações de 16 bits: Access 2.0 , VB 3.0 Todos os anos com dois dígitos são automaticamente considerados como do século 20
VB 4.0 16 bits Todos os anos com dois dígitos são do século corrente (definido pelo relógio do sistema).
Access 95 (com a nova biblioteca), VB 4.0 32 bits, VB5 , Access 97 Todos os anos com dois dígitos entre 00 e 29 são do século XXI e os demais do século XX
Já deu para perceber que é importante saber com qual versão de biblioteca OLEAUT32.DLL seu sistema esta trabalhando. Para isso faça o seguinte:
1-abra o Explorer e no diretório System;
2-localize o arquivo OLEAUT32.DLL;
3-Clique com o botão direito do mouse sobre o arquivo;
4-Selecione propriedades;
5-Selecione a ficha Versão e clique em Versão do Produto;
6-Se o número da versão for igual ou superior a 2.20.4049 a nova regra esta sendo usada.
Criando a sua própria interpretação. Você pode querer implementar as suas próprias regras, como por exemplo: - datas com dois dígitos no ano entre 00 e 49 serão interpretadas como do século XXI (2000 e 2049), - e datas entre 50 e 99 como do século XX.(1950 e 1999). Para isto basta criar uma procedure com o seguinte código:

  Private Sub cmdConvertDate_Click()
       Dim strYear As String
       Dim intSlash As Integer

       If IsDate(txtDate) or txtDate = "2/29/00" Then
           'procura primeiro separador
           intSlash = InStr(txtDate, "/")
           If intSlash > 0 Then
               'procura segundo separador
               intSlash = InStr(intSlash + 1, txtDate, "/")
               If intSlash > 0 Then
                   'Extrai ano da data
                   strYear = Mid(txtDate, intSlash + 1)
                   If Len(strYear) = 2 Then
                       If CInt(strYear) < 50 Then
                       ' Menor que 50: ano = 20XX.
                           strYear = "20" & strYear
                       Else
                       ' Maior que 50: ano = 19XX.
                           strYear = "19" & strYear
                       End If
                   End If
                   MsgBox "Data Informada: " & txtDate
                   MsgBox "ANO (Sua Regra): " & strYear
                   MsgBox "ANO (Regra do VB): " & Year(txtDate)
               Else
                   MsgBox "Data no formato não esperado!"
               End If
           Else
               MsgBox "Data no formato não esperado!"
           End If
       Else
           MsgBox "Data inválida !"
       End If
       '  Limpando a data no texto
       txtDate.Text = Left(txtDate.Text, intSlash) & strYear
   End Sub

Bem , espero não ter criado mais confusão com as datas. Até mais...
(Referência: Article ID:Q162718 - Microsoft )
Retorna