Vba excel transforme une date enregistrée au format anglais (bogue d'inversion mois / jour)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 36 746 fois - Téléchargée 28 fois

Contenu du snippet

A ma grande surprise, je constate qu'il existe encore des fichiers Excel contenant l'anomalie liée au format date anglais(cf. pièce jointe). Notez l'inversion entre le format affiché (01/02/2006) et le format enregistré (02/01/2006).

Source / Exemple :


Sub setRegionalDate(ByVal FirstLineIndex As Long, ByVal LastLineIndex As Long, ByVal ColIndex As Long)
'Version 1 : corrige pour l'intervalle spécifié toutes les dates 
'enregistrées au format anglais (bogue d'inversion)

'Variables de traitement
Dim myDate As Date
Dim i As Long

'  Paramètres à définir pour chaque traitement :
'  - FirstLineIndex               N° de la première ligne à traiter
'  - LastLineIndex                N° de la dernière ligne à traiter
'  - ColIndex                     N° de la colonne à traiter
'  Exemple d'utilisation :
'   call setRegionalDate(1, 253, 2)   Vérifie et corrige le format date pour l'intervalle
'                                     de lignes [1, 253] de la colonne 2.

'Gestionnaire d'erreur
On Error GoTo Except

   For i = FirstLineIndex To LastLineIndex
      'Sélectionne la cellule
      Cells(i, ColIndex).Select
      With Selection
         If IsDate(.Value) Then
          'Condition d'inversion
            If .NumberFormat = "mm/dd/yyyy" Then
               'Mémorise la date
               myDate = .Value
               'Transforme le type du format date
               .NumberFormat = "dd/mm/yyyy"
               'Transforme la date en inversant les valeurs du mois et du jour
               .Value = CDate(Month(myDate) & "/" & Day(myDate) & "/" & Year(myDate))
            End If
         End If
      End With
   Next i
   
   Exit Sub
Except:
   Call MsgBox(vbCr & "Erreur n° " & Err.Number & vbCr & vbCr & _
                       Err.Description & Space(6), vbCritical + vbOKOnly, " Fonction de correction du type date")
End Sub
-----------------------------------------------------------------------------------------
Sub setRegionalDate()
'Version 2 : corrige pour la plage sélectionnée toutes les dates
'enregistrées au format anglais (bogue d'inversion)

'Variables de traitement
Dim myDate As Date
Dim myRange As Range
Dim i As Long, j As Long

   'Gestionnaire d'erreur
   On Error GoTo Except
   
   'Boîte de dialogue : demande de confirmation
   i = Selection.Cells.Count
   If i = 1 Then
      If MsgBox(vbCr & "Demande de confirmation" & vbCr & vbCr & _
                       "Une seule cellule est sélectionnée. Confirmez votre sélection ?" & Space(6), vbQuestion + vbYesNo, _
                       " Fonction de correction du type date") = vbNo Then Exit Sub
   End If
   
   For Each myRange In Selection
      If IsDate(myRange) Then
         With myRange
            'Condition d'inversion
            If .NumberFormat = "mm/dd/yyyy" Then
               'Mémorise la date
               myDate = .Value
               'Transforme le type du format date
               .NumberFormat = "dd/mm/yyyy"
               'Transforme la date en inversant les valeurs du mois et du jour
               .Value = CDate(Month(myDate) & "/" & Day(myDate) & "/" & Year(myDate))
               If Month(.Value) <> Month(myDate) Then j = j + 1
            End If
         End With
      End If
   Next
   
   'Boîte de dialogue : nbre de dates corrigées sur nbre de cellules vérifiées
   Call MsgBox(vbCr & "Résultat du traitement :" & vbCr & vbCr & _
                  j & " date(s) corrigée(s) sur " & i & " cellule(s) sélectionnée(s)." & Space(6), vbInformation + vbOKOnly, _
                      " Fonction de correction du type date")
      
   Exit Sub
Except:
   'Boîte de dialogue : message d'erreur
   Call MsgBox(vbCr & "Erreur n° " & Err.Number & vbCr & vbCr & _
                       Err.Description & Space(6), vbCritical + vbOKOnly, " Fonction de correction du type date")
End Sub
-----------------------------------------------------------------------------------------

Conclusion :


catégorie : VBA Excel
voir la capture d'écran pour comprend le type d'anomalie

A voir également

Ajouter un commentaire

Commentaires

FENETRES
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009
-
Autres problèmes liés à l'import de fichier :
Sur ce site, à l'adresse ci-dessous, vous trouverez le moyen de convertir en nombre une page de cellules sélectionnées ainsi que la possibilité d'appliquer un format monétaire ou de pourcentage.

http://www.vbfrance.com/codes/VBA-EXCEL-CONVERTIR-NOMBRE-APPLIQUER-FORMAT-MONETAIRE-OU_41270.aspx
FENETRES
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009
-
'Pour ceux qui souhaite récupérer le format déclaré dans les paramètres régionaux

Option Explicit

Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCTYPE As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long

Private Function getRegDateType() As String
'Retourne, pour l'utilisateur actuel, le type de date spécifié dans
'les paramètres régionaux du panneau de configuration de Windows.

Const LOCALE_SSHORTDATE = &H1F

Dim Symbol As String
Dim RetVal1 As Long
Dim RetVal2 As Long
Dim lpLCDataVar As String
Dim Pos As Integer
Dim Locale As Long

Locale = GetUserDefaultLCID()
RetVal1 = GetLocaleInfo(Locale, LOCALE_SSHORTDATE, lpLCDataVar, 0)
Symbol = String$(RetVal1, 0)
RetVal2 = GetLocaleInfo(Locale, LOCALE_SSHORTDATE, Symbol, RetVal1)
Pos = InStr(Symbol, Chr$(0))
If Pos > 0 Then
getRegDateType = LCase(Left$(Symbol, Pos - 1))
End If

End Function
cs_jacquito
Messages postés
7
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
22 juillet 2006
-
Bravo et tres bien ecris
FENETRES
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009
-
C'était le but recherché. Comme tout le monde, j'ai profité des sources éditées sur Internet alors... il faut savoir renvoyer l'ascenseur et rendre service à son tour !
koaladv
Messages postés
2
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
10 juin 2006
-
Un grand merci de ma part egalement car ce code est très bien fait et surtout tres bien commenté.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.