Boucle trop longue

Adeus33

XLDnaute Occasionnel
Bonjour le forum.

Dans mon fichier je dois mettre en forme certaine valeur.

Dans une de mes colonnes je dois transformer les . par des /
J'ai donc le code suivant:
Code:
ligne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count
Range('K2' & ':K' & ligne - 1).Select
    
For Each c In Selection
c.Value = CDate(Replace(c, '.', '/'))
Next c

Le probleme est que ce code mais beaucoup de temps à s'exécuter.
Est il possible de tous les transformer en meme temps au lieu de faire ligne par ligne .


Merci pour votre aide.

Cordialement.

Adeus 33
 

Jacques87

XLDnaute Accro
Bonjour

A première vue je ne vois pas comment accélérer cette procédure
Sinon tu peux en simplifier l'écriture comme ceci

ligne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count -1

For Each c In Range('K2:K' & ligne)
CDate(Replace(c, '.', '/'))
Next c

Bon courage
 

ziopizza

XLDnaute Occasionnel
Bonjour Adeus33,Jacques87.
Code avec l'enregistreur de macro peut etre plus rapide ?. A voir

Columns('K:K').Select
Selection.Replace What:='.', Replacement:='/', LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Yves
 

Adeus33

XLDnaute Occasionnel
Bonjour ziopizza, Jacques87

En effet l'enregistreur de macro est beaucoup plus rapide mais il me fait une erreur voir apres.

13.02.2006
10.03.2006
20.12.2005
20.12.2005
20.12.2005
20.12.2005

par

13/02/2006
03/10/2006
20/12/2005
20/12/2005
20/12/2005
20/12/2005

Alors qu'avec la fonction remplacer Edition --> remplacer il me la fait pas.

Voila si quelqu'un a une autre solution


Adeus33
 

excalibur

XLDnaute Impliqué
bonjour tous le monde tu peus faire comme cela aussi Sub M()
Application.ScreenUpdating = False
Dim patente As Variant
Application.Calculation = xlCalculationManual
For Each patente In Range('c2', Range('c65536').End(xlUp))
patente.Replace What:='.', Replacement:='/'
Next
Application.Calculation = xlCalculationAutomatic
End Sub'salutations

Message édité par: excalibur, à: 07/03/2006 11:25
 

jp14

XLDnaute Barbatruc
Bonjour le fil

Une autre solution en passant par des instructions plus basique et sans test.
Les données doivent avoir la même structure.

date=c.value
d1=mid(date,1,2) ' extraction des deux premiers chiffres

d2=mid(date,4,2)
d3=mid(date,7,4)
c.value=d1 & '/' & d2 & '/' & d3

JP
 

Adeus33

XLDnaute Occasionnel
Alors tous d'abord merci pour vos réponses mais malheureusement cela ne fonctionne pas.

excalibur, ca me fais le meme probleme que precedemment

13.02.2006
10.03.2006
20.12.2005
20.12.2005
20.12.2005
20.12.2005

par

13/02/2006
03/10/2006
20/12/2005
20/12/2005
20/12/2005
20/12/2005


jp14 le débogueur se place sur le
date=c.value


Voila si vous avez d'autres solutions je suis preneur

Adeus33
 

Charly2

Nous a quittés en 2006
Repose en paix
Bonsoir Adeus33, Jacques, ziopizza, excalibur et jp14 :)

Je n'ai aucun souci avec le code suivant :

Code:
Sub TransformeDate()
'
Dim Tableau
Dim i&, Ligne&
Dim Plage As Range
'
  Ligne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
  Set Plage = Range('K2:K' & Ligne)
  Tableau = Plage
  For i = 1 To UBound(Tableau)
    Tableau(i, 1) = Replace(Tableau(i, 1), '.', '/')
  Next i
  Plage = Tableau
  Erase Tableau
End Sub

A+ ;)
 

Adeus33

XLDnaute Occasionnel
Bonjour tous le monde et merci pour votre aide:

Charly2, j'ai essayé ton code et c'est vrai qu'il est très rapide (exactement le temps que j'espérais) mais j'ai toujours le probleme:

10.03.2006 --> 03/10/2006


jp14, comme tout a l'heure le débogueur se place sur la ligne

date1=c.value
Comment déclares tu la variable date1? (j'ai essayé de plusieurs facon mais rien a faire)

En tout cas merci pour votre aide.

Et si vous avez encore une solution, je suis toujours preneur :)

Adeus33
 

jp14

XLDnaute Barbatruc
Bonsoir

Voici la macro
Sub transforme()
ligne = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count
Range('a1' & ':a' & ligne - 1).Select

For Each c In Selection
Date1 = c
d1 = Mid(Date1, 1, 2) ' extraction des deux premiers chiffres
d2 = Mid(Date1, 4, 2)
d3 = Mid(Date1, 7, 4)
c.Value = d1 & '/' & d2 & '/' & d3
Next c
End Sub
Les valeurs obtenues
01/02/2006
10/03/2006
02/12/2005
03/12/2005
04/12/2005
Il est impératif de déclarer les cellule avec le format texte et non pas en standard sinon ... toutes les dates comprises entre le 1 et le 12 (cf mois) sont transformées.


A+
 

Charly2

Nous a quittés en 2006
Repose en paix
re,

Je t'envoie un classeur exemple de ce que j'ai codé (étant sur XL97, j'ai créé une fonction Replace).

Peux-tu l'essayer sur le classeur joint et dire si la conversion est correctement effectuée avec le peu de données que j'ai entrées ?

[file name=Adeus33_Conversion.zip size=8992]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Adeus33_Conversion.zip[/file]

A+ ;)
 

Pièces jointes

  • Adeus33_Conversion.zip
    8.8 KB · Affichages: 18

Adeus33

XLDnaute Occasionnel
Bonjour le fil, désolé de mettre autant de temps pour répondre mais j'ai pas eu le temps hier soir.

jp14 le problème est que je dois faire des calculs après sur ces dates alors a moins que je le transforme en texte pour ensuite le retransformer en date. (mais est ce que ca va pas prendre beaucoup de temps?)
J'ai près de 9000 lignes dans mon tableau

Charly2, quand j'essai ton code, je clique sur le bouton et ca déconne mais quand je clique dessus une deuxième fois c'est bon, tout rentre dans l'ordre.(a ceci près qu'il me met une partie des valeurs en format date et les autres en standard lol).

Voir je fichier joint (c'est le meme que le tien mais avec plus de valeur)

Est ce que quelqu'un a une explication parce que la j'avoue que j'ai du mal à comprendre.

[file name=Adeus33_ConversionV1.zip size=21211]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Adeus33_ConversionV1.zip[/file]

Merci ;)

Adeus33
 

Pièces jointes

  • Adeus33_ConversionV1.zip
    20.7 KB · Affichages: 18

Charly2

Nous a quittés en 2006
Repose en paix
re à tout le monde :)

J'avoue que je n'ai pas d'explication et d'autant moins que tout fonctionne parfaitement sur mon PC !

La seule différence réside dans le fait que j'utilise une fonction Replace perso.

J'ai quand même fait quelques tests et je me sui rendu compte qu'en marquant :

Tableau(i, 1) = CDate(Replace(Tableau(i, 1), '.', '/'))

j'obtenais ce que tu as écrit (mélange de formats standard et date).

Par contre, en écrivant :

Tableau(i, 1) = Format(Replace(Tableau(i, 1), '.', '/'), 'dd/mm/yyyy')

tout fonctionne correctement.

Je ne peux pas t'en dire plus, sorry :S

A+ ;)
 

ziopizza

XLDnaute Occasionnel
Bonjour à tous,

Je posséde excel 2003 et jai exactement le méme probléme que Adeus33,le 03.10.2006 se stranforme en 10/03/2006 Bizzare ?.
(j'ai essyé toutes les solutions proposés)
Yves

Message édité par: ziopizza, à: 08/03/2006 10:40
 

Discussions similaires

Réponses
7
Affichages
435

Statistiques des forums

Discussions
312 338
Messages
2 087 398
Membres
103 536
dernier inscrit
komivi