Discussion:
Macro additionner 0 ou multiplier par 1 format date
(trop ancien pour répondre)
Captainglouglou
2020-04-19 13:56:43 UTC
Permalink
Bonjour,

J’ai essayé de faire une macro sous Excel à partir de l’enregistreu
automatique. Elle doit mettre en forme un tableau provenant de l’exploitatio
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 no
comme des dates.

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

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

Je vous soumets ma macro ci-dessous. Accessoirement, je pense qu’elle pourrai
gagner en rapidité s’il était possible de n’appliquer les opérations que sur l
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 forma
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, SkipBlank
_

:=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 e
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
MichD
2020-04-19 15:14:37 UTC
Permalink
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
captainglouglou
2020-04-19 20:21:40 UTC
Permalink
Post by 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
- 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
Post by Captainglouglou
_
:=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
Merci à toi, simplement j'ai l'impression que cela fait la même chose que m
macro, en mieux écrit.
Mon objectif était vraiment de faire dans la macro ce petit calcul (additionne
0 ou multiplier par 1) de manière à ce que les dates soient toutes reconnues pa
Excel.
Le choix de la macro vient du fait qu'elle est destinée à être lancée pa
d'autres utilisateurs, d'où l'idée d'automatiser...
captainglouglou
2020-04-20 17:12:23 UTC
Permalink
Post by 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
- 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
Post by Captainglouglou
_
:=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
En cherchant, je viens de comprendre où est le problème sans l'avoir réglé pou
le moment : en traitant mes données avec vba, Excel transforme mon format d
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 l
forme 05/01/2013 mais là où je crois lire 5 janvier, Excel l'a changé en 1e
mai !! Je m'en rends compte en demandant un format date longue ou lorsqu
j'additionne des jours.
A l'inverse, un 16.02.2015 devient 16/02/2015 mais Excel ne sait pas le lir
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 le
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 m
permet pas de forcer le sens de la lecture jj/mm/aaaa.
MichD
2020-04-20 19:20:06 UTC
Permalink
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.
Je me demande bien quel débutant t'a proposé cela, il ferait mieux de
bien cuver son vin avant de répondre...;-))

Tout le monde sait ça, VBA ne connaît qu'un format de date, le format
américain Mois / jour / année

Je te propose plutôt ceci :

Pour une plage de cellules sur une colonne

(Attention, certaines lignes de code peuvent être coupées par le service
de messagerie)

'---------------------------------------------------------
Sub test()
Application.EnableEvents = False
Application.ScreenUpdating = False

With Worksheets("Feuil1") 'Nom Onglet à adapter
With Range("A1:A8") 'Plage de cellules à adapter
.TextToColumns Destination:=.Cells(1, 1), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False,
Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False,
FieldInfo _
:=Array(1, 4), TrailingMinusNumbers:=True
.NumberFormat = "DD/MM/YYYY"
End With
End With
Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

'---------------------------------------------------------


Pour plusieurs colonnes :
'---------------------------------------------------------
Sub test1()
Dim C As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
With Worksheets("Feuil1") 'Nom onglet à adapter
With Range("A1:C8") 'Plage de cellules à adapter
For Each C In .Columns
With C
.TextToColumns Destination:=.Cells(1, 1),
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote,
ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False,
Other:=False, FieldInfo _
:=Array(1, 4), TrailingMinusNumbers:=True
.NumberFormat = "DD/MM/YYYY"
End With
Next
End With
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'---------------------------------------------------------

MichD
captainglouglou
2020-04-22 15:00:29 UTC
Permalink
Post by 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
- 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
Post by Captainglouglou
_
:=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
J'ai finalement trouvé comment faire à force de recherches (solution trouvée su
un fil de discussion sur un thème similaire, merci aux contributeurs !). Dan
le cas de données importées et transformées en dates par macro, le fait qu
certaines dates soient à droite de la cellule (format date) et d'autres à gauch
de la cellule (format texte) peut résulter d'une mauvaise interprétation de
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 l
reconnaissance du format date, dans une macro, n'est pas d'additionner zéro o
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 e
choisir le format de date proposé JMA. La macro enregistrée peut être modifié
et fonctionne très bien!
MichD
2020-04-22 15:25:32 UTC
Permalink
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
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
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
captainglouglou
2020-04-22 15:59:33 UTC
Permalink
Post by 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
- 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
Post by Captainglouglou
_
:=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
Oui, je l'avais testé et j'avais de bons espoirs mais le format DD/MM/yyyy n'
pas suffi à forcer le format date sur mon ordinateur. En tous cas, mille foi
merci pour ton aide précieuse sur mes questions ces derniers jours, ça m'a sauv
une paire de fois!!
MichD
2020-04-22 16:14:43 UTC
Permalink
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!


Ces 2 procédures font ce que tu as écrit comme solution.

'---------------------------------------------------------
Sub test()
Application.EnableEvents = False
Application.ScreenUpdating = False

With Worksheets("Feuil1") 'Nom Onglet à adapter
With Range("A1:A8") 'Plage de cellules à adapter
.TextToColumns Destination:=.Cells(1, 1), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False,
Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False,
FieldInfo _
:=Array(1, 4), TrailingMinusNumbers:=True
.NumberFormat = "DD/MM/YYYY"
End With
End With
Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

'---------------------------------------------------------


Pour plusieurs colonnes :
'---------------------------------------------------------
Sub test1()
Dim C As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
With Worksheets("Feuil1") 'Nom onglet à adapter
With Range("A1:C8") 'Plage de cellules à adapter
For Each C In .Columns
With C
.TextToColumns Destination:=.Cells(1, 1),
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote,
ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False,
Other:=False, FieldInfo _
:=Array(1, 4), TrailingMinusNumbers:=True
.NumberFormat = "DD/MM/YYYY"
End With
Next
End With
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'---------------------------------------------------------

MichD

Loading...