OVH Cloud OVH Cloud

Macro additionner 0 ou multiplier par 1 format date

6 réponses
Avatar
Captainglouglou
Bonjour,

J’ai essayé de faire une macro sous Excel à partir de l’enregistreur automatique. Elle doit mettre en forme un tableau provenant de l’exploitation d’un fichier source en faisant les 2 opérations suivantes :

- Enlever toutes les formules et les remplacer par des valeurs,

- Mettre en forme les dates (transformer le format initial « jj.mm.aaaa » en jj/mm/aaaa).

Mon souci, c’est qu’il reste des dates perçues par Excel comme du texte et non comme des dates.

J’ai lu qu’il fallait appliquer une opération simple sur ces dates (additionner zéro ou multiplier par un) pour forcer Excel à les interpréter comme des dates (ou des nombres) mais le bout de macro que j’ai ajouté pour cela ne fonctionne pas.

Si quelqu’un sait comment écrire la formule qui consiste à ajouter zéro sur des colonnes ou les multiplier par un, cela m’aiderait beaucoup !

Je vous soumets ma macro ci-dessous. Accessoirement, je pense qu’elle pourrait gagner en rapidité s’il était possible de n’appliquer les opérations que sur la partie utile du classeur (les cellules non vides).

Merci pour vos aides !





Sub Mise_en_forme_tableau()

'

' Remplace les formules du tableau par leur valeur et met les dates au format Excel.

'



'Copier coller toutes les lignes de A9 à fin et remplacer par les valeurs

Range("A9", Range("A9").End(xlDown).End(xlToRight)).Select

Selection.Copy

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False



'Sélectionner les colonnes dates, remplacer . par / et mettre au format date

Range("F:F,G:G,K:K,S:S,T:T,U:U,V:V,W:W,AH:AH,AJ:AJ,AM:AM").Select

Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _

SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _

ReplaceFormat:=False

Application.CutCopyMode = False

Selection.NumberFormat = "m/d/yyyy"



'Obliger Excel à identifier les formats dates avec copier-collage spécial et addition d'une valeur nulle

Range("XFD1").Select

Selection.Copy

Range("F:F,G:G,K:K,S:S,T:T,U:U,V:V,W:W,AH:AH,AJ:AJ,AM:AM").Select

Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _

False, Transpose:=False



Range("A1").Select



End Sub

6 réponses

Avatar
MichD
Bonjour,
Si tu veux le faire par macro, adapte le nom de l'onglet "Feuil1" dans
la procédure et l'adresse de la plage où sont les dates.
'---------------------------------------------
Sub test()
With Worksheets("Feuil1")
With .Range("A1:A8")
.NumberFormat = "DD/MM/yyyy"
.Replace ".", "/", LookAt:=xlPart
End With
End With
End Sub
'---------------------------------------------
C'est aussi possible de le faire sans macro.
A ) sélectionne la plage de cellules (colonne) représentant les dates
B ) un clic sur le menu "données" / "Convertir" /
Étape I : Délimité
Étape 2 : Rien à faire ... suivant
Étape 3 : active le bouton radio "Date" et choisis le format date que tu
désires, et tu cliques sur le bouton "terminer".
MichD
Avatar
captainglouglou
Le dimanche 19 Avril 2020 à 15:56 par Captainglouglou :
Bonjour,
J’ai essayé de faire une macro sous Excel à partir de
l’enregistreur automatique. Elle doit mettre en forme un tableau
provenant de l’exploitation d’un fichier source en faisant les 2
opérations suivantes :
- Enlever toutes les formules et les remplacer par des valeurs,
- Mettre en forme les dates (transformer le format initial «
jj.mm.aaaa » en jj/mm/aaaa).
Mon souci, c’est qu’il reste des dates perçues par Excel
comme du texte et non comme des dates.
J’ai lu qu’il fallait appliquer une opération simple sur ces
dates (additionner zéro ou multiplier par un) pour forcer Excel à
les interpréter comme des dates (ou des nombres) mais le bout de macro
que j’ai ajouté pour cela ne fonctionne pas.
Si quelqu’un sait comment écrire la formule qui consiste à
ajouter zéro sur des colonnes ou les multiplier par un, cela
m’aiderait beaucoup !
Je vous soumets ma macro ci-dessous. Accessoirement, je pense qu’elle
pourrait gagner en rapidité s’il était possible de
n’appliquer les opérations que sur la partie utile du classeur
(les cellules non vides).
Merci pour vos aides !
Sub Mise_en_forme_tableau()
'
' Remplace les formules du tableau par leur valeur et met les dates au format
Excel.
'
'Copier coller toutes les lignes de A9 à fin et remplacer par les
valeurs
Range("A9",
Range("A9").End(xlDown).End(xlToRight)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks
_
:úlse, Transpose:úlse
'Sélectionner les colonnes dates, remplacer . par / et mettre au
format date
Range("F:F,G:G,K:K,S:S,T:T,U:U,V:V,W:W,AH:AH,AJ:AJ,AM:AM").Select
Selection.Replace What:=".", Replacement:="/",
LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:úlse, SearchFormat:úlse, _
ReplaceFormat:úlse
Application.CutCopyMode = False
Selection.NumberFormat = "m/d/yyyy"
'Obliger Excel à identifier les formats dates avec copier-collage
spécial et addition d'une valeur nulle
Range("XFD1").Select
Selection.Copy
Range("F:F,G:G,K:K,S:S,T:T,U:U,V:V,W:W,AH:AH,AJ:AJ,AM:AM").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd,
SkipBlanks:= _
False, Transpose:úlse
Range("A1").Select
End Sub
Merci à toi, simplement j'ai l'impression que cela fait la même chose que ma macro, en mieux écrit.
Mon objectif était vraiment de faire dans la macro ce petit calcul (additionner 0 ou multiplier par 1) de manière à ce que les dates soient toutes reconnues par Excel.
Le choix de la macro vient du fait qu'elle est destinée à être lancée par d'autres utilisateurs, d'où l'idée d'automatiser...
Avatar
captainglouglou
Le dimanche 19 Avril 2020 à 15:56 par Captainglouglou :
Bonjour,
J’ai essayé de faire une macro sous Excel à partir de
l’enregistreur automatique. Elle doit mettre en forme un tableau
provenant de l’exploitation d’un fichier source en faisant les 2
opérations suivantes :
- Enlever toutes les formules et les remplacer par des valeurs,
- Mettre en forme les dates (transformer le format initial «
jj.mm.aaaa » en jj/mm/aaaa).
Mon souci, c’est qu’il reste des dates perçues par Excel
comme du texte et non comme des dates.
J’ai lu qu’il fallait appliquer une opération simple sur ces
dates (additionner zéro ou multiplier par un) pour forcer Excel à
les interpréter comme des dates (ou des nombres) mais le bout de macro
que j’ai ajouté pour cela ne fonctionne pas.
Si quelqu’un sait comment écrire la formule qui consiste à
ajouter zéro sur des colonnes ou les multiplier par un, cela
m’aiderait beaucoup !
Je vous soumets ma macro ci-dessous. Accessoirement, je pense qu’elle
pourrait gagner en rapidité s’il était possible de
n’appliquer les opérations que sur la partie utile du classeur
(les cellules non vides).
Merci pour vos aides !
Sub Mise_en_forme_tableau()
'
' Remplace les formules du tableau par leur valeur et met les dates au format
Excel.
'
'Copier coller toutes les lignes de A9 à fin et remplacer par les
valeurs
Range("A9",
Range("A9").End(xlDown).End(xlToRight)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks
_
:úlse, Transpose:úlse
'Sélectionner les colonnes dates, remplacer . par / et mettre au
format date
Range("F:F,G:G,K:K,S:S,T:T,U:U,V:V,W:W,AH:AH,AJ:AJ,AM:AM").Select
Selection.Replace What:=".", Replacement:="/",
LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:úlse, SearchFormat:úlse, _
ReplaceFormat:úlse
Application.CutCopyMode = False
Selection.NumberFormat = "m/d/yyyy"
'Obliger Excel à identifier les formats dates avec copier-collage
spécial et addition d'une valeur nulle
Range("XFD1").Select
Selection.Copy
Range("F:F,G:G,K:K,S:S,T:T,U:U,V:V,W:W,AH:AH,AJ:AJ,AM:AM").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd,
SkipBlanks:= _
False, Transpose:úlse
Range("A1").Select
End Sub
En cherchant, je viens de comprendre où est le problème sans l'avoir réglé pour le moment : en traitant mes données avec vba, Excel transforme mon format de dates à l'anglaise et lit des mois puis des jours puis les années. Par exemple, le 05 janvier 2013 qui était avant sous la forme 05.01.2013 apparaît sous la forme 05/01/2013 mais là où je crois lire 5 janvier, Excel l'a changé en 1er mai !! Je m'en rends compte en demandant un format date longue ou lorsque j'additionne des jours.
A l'inverse, un 16.02.2015 devient 16/02/2015 mais Excel ne sait pas le lire comme une date (pas de 16ème mois) et le transforme en texte !
Mon problème consiste en réalité à dire à Excel où sont les jours et où sont les mois !
J'ai essayé de ne rien spécifier (aucun format, juste remplacer les . par /) mais ça ne marche pas, ainsi que ta formule Mich qui malheureusement ne me permet pas de forcer le sens de la lecture jj/mm/aaaa.
Avatar
captainglouglou
Le dimanche 19 Avril 2020 à 15:56 par Captainglouglou :
Bonjour,
J’ai essayé de faire une macro sous Excel à partir de
l’enregistreur automatique. Elle doit mettre en forme un tableau
provenant de l’exploitation d’un fichier source en faisant les 2
opérations suivantes :
- Enlever toutes les formules et les remplacer par des valeurs,
- Mettre en forme les dates (transformer le format initial «
jj.mm.aaaa » en jj/mm/aaaa).
Mon souci, c’est qu’il reste des dates perçues par Excel
comme du texte et non comme des dates.
J’ai lu qu’il fallait appliquer une opération simple sur ces
dates (additionner zéro ou multiplier par un) pour forcer Excel à
les interpréter comme des dates (ou des nombres) mais le bout de macro
que j’ai ajouté pour cela ne fonctionne pas.
Si quelqu’un sait comment écrire la formule qui consiste à
ajouter zéro sur des colonnes ou les multiplier par un, cela
m’aiderait beaucoup !
Je vous soumets ma macro ci-dessous. Accessoirement, je pense qu’elle
pourrait gagner en rapidité s’il était possible de
n’appliquer les opérations que sur la partie utile du classeur
(les cellules non vides).
Merci pour vos aides !
Sub Mise_en_forme_tableau()
'
' Remplace les formules du tableau par leur valeur et met les dates au format
Excel.
'
'Copier coller toutes les lignes de A9 à fin et remplacer par les
valeurs
Range("A9",
Range("A9").End(xlDown).End(xlToRight)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks
_
:úlse, Transpose:úlse
'Sélectionner les colonnes dates, remplacer . par / et mettre au
format date
Range("F:F,G:G,K:K,S:S,T:T,U:U,V:V,W:W,AH:AH,AJ:AJ,AM:AM").Select
Selection.Replace What:=".", Replacement:="/",
LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:úlse, SearchFormat:úlse, _
ReplaceFormat:úlse
Application.CutCopyMode = False
Selection.NumberFormat = "m/d/yyyy"
'Obliger Excel à identifier les formats dates avec copier-collage
spécial et addition d'une valeur nulle
Range("XFD1").Select
Selection.Copy
Range("F:F,G:G,K:K,S:S,T:T,U:U,V:V,W:W,AH:AH,AJ:AJ,AM:AM").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd,
SkipBlanks:= _
False, Transpose:úlse
Range("A1").Select
End Sub
J'ai finalement trouvé comment faire à force de recherches (solution trouvée sur un fil de discussion sur un thème similaire, merci aux contributeurs !). Dans le cas de données importées et transformées en dates par macro, le fait que certaines dates soient à droite de la cellule (format date) et d'autres à gauche de la cellule (format texte) peut résulter d'une mauvaise interprétation des dates par Excel qui inverse les jours et les mois dans la programmation en VBA: le format américain est appliqué par défaut. Le plus simple pour forcer la reconnaissance du format date, dans une macro, n'est pas d'additionner zéro ou de multiplier par un. Il suffit en fait d'enregistrer la macro qui correspond à: sélection de la plage à identifier, puis onglet données, bouton convertir et choisir le format de date proposé JMA. La macro enregistrée peut être modifiée et fonctionne très bien!
Avatar
MichD
J'ai finalement trouvé comment faire à force de recherches (solution trouvée sur
un fil de discussion sur un thème similaire, merci aux contributeurs !). Dans
le cas de données importées et transformées en dates par macro, le fait que
certaines dates soient à droite de la cellule (format date) et d'autres à gauche
de la cellule (format texte) peut résulter d'une mauvaise interprétation des
dates par Excel qui inverse les jours et les mois dans la programmation en VBA:
le format américain est appliqué par défaut. Le plus simple pour forcer la
reconnaissance du format date, dans une macro, n'est pas d'additionner zéro ou
de multiplier par un. Il suffit en fait d'enregistrer la macro qui correspond à:
sélection de la plage à identifier, puis onglet données, bouton convertir et
choisir le format de date proposé JMA. La macro enregistrée peut être modifiée
et fonctionne très bien!

Je t'avais donné le code il y a quelques jours déjà!
MichD
Avatar
captainglouglou
Le dimanche 19 Avril 2020 à 15:56 par Captainglouglou :
Bonjour,
J’ai essayé de faire une macro sous Excel à partir de
l’enregistreur automatique. Elle doit mettre en forme un tableau
provenant de l’exploitation d’un fichier source en faisant les 2
opérations suivantes :
- Enlever toutes les formules et les remplacer par des valeurs,
- Mettre en forme les dates (transformer le format initial «
jj.mm.aaaa » en jj/mm/aaaa).
Mon souci, c’est qu’il reste des dates perçues par Excel
comme du texte et non comme des dates.
J’ai lu qu’il fallait appliquer une opération simple sur ces
dates (additionner zéro ou multiplier par un) pour forcer Excel à
les interpréter comme des dates (ou des nombres) mais le bout de macro
que j’ai ajouté pour cela ne fonctionne pas.
Si quelqu’un sait comment écrire la formule qui consiste à
ajouter zéro sur des colonnes ou les multiplier par un, cela
m’aiderait beaucoup !
Je vous soumets ma macro ci-dessous. Accessoirement, je pense qu’elle
pourrait gagner en rapidité s’il était possible de
n’appliquer les opérations que sur la partie utile du classeur
(les cellules non vides).
Merci pour vos aides !
Sub Mise_en_forme_tableau()
'
' Remplace les formules du tableau par leur valeur et met les dates au format
Excel.
'
'Copier coller toutes les lignes de A9 à fin et remplacer par les
valeurs
Range("A9",
Range("A9").End(xlDown).End(xlToRight)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks
_
:úlse, Transpose:úlse
'Sélectionner les colonnes dates, remplacer . par / et mettre au
format date
Range("F:F,G:G,K:K,S:S,T:T,U:U,V:V,W:W,AH:AH,AJ:AJ,AM:AM").Select
Selection.Replace What:=".", Replacement:="/",
LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:úlse, SearchFormat:úlse, _
ReplaceFormat:úlse
Application.CutCopyMode = False
Selection.NumberFormat = "m/d/yyyy"
'Obliger Excel à identifier les formats dates avec copier-collage
spécial et addition d'une valeur nulle
Range("XFD1").Select
Selection.Copy
Range("F:F,G:G,K:K,S:S,T:T,U:U,V:V,W:W,AH:AH,AJ:AJ,AM:AM").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd,
SkipBlanks:= _
False, Transpose:úlse
Range("A1").Select
End Sub
Oui, je l'avais testé et j'avais de bons espoirs mais le format DD/MM/yyyy n'a pas suffi à forcer le format date sur mon ordinateur. En tous cas, mille fois merci pour ton aide précieuse sur mes questions ces derniers jours, ça m'a sauvé une paire de fois!!