XL 2019 Remplacement de valeurs tres long avec grosse base de données

  • Initiateur de la discussion Initiateur de la discussion carlos
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour,
J'ai une feuille excel avec 25 000 lignes et environ 60 colonnes.
Il y a 2 soucis dans cette base :
1 - Les valeurs sont écrites avec un point au lieu d'une virgule.
2 - Beaucoup de cellule ont des nombres en format TEXTE.

Auriez vous une solution rapide sous vba pour remplacer les . en , et les nombre-texte en nombre.
Merci et bonne journée
 
Solution
Bonjour le forum,

Téléchargez le fichier déposé sur cjoint.com :

https://www.cjoint.com/c/NFehaWhtEP7

et lancez la macro :
VB:
Sub Conversion()
Dim t, ds$, tablo, ub%, i&, j%, x$
t = Timer
ds = Application.DecimalSeparator
With [A1:BH25000] 'à adapter
    tablo = .Formula 'au cas où il y aurait des formules
    ub = UBound(tablo, 2)
    For i = 1 To UBound(tablo)
        For j = 1 To ub
            x = Replace(tablo(i, j), ".", ds)
            If IsNumeric(x) Then tablo(i, j) = CDbl(x) 'conversion
    Next j, i
    .Value = tablo 'restitution
End With
MsgBox Timer - t
End Sub
Chez moi elle s'exécute en 2,6 secondes.

A+
BonjourGBinforme,
J'ai deja fait cela mais ca rame quand meme
Private Sub CommandButton2_Click()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Remplacer
MAJTexteParNb
Application.ScreenUpdating = True
MsgBox "Calcul automatique des formules désactivé"
End Sub
Sub MAJTexteParNb()
Dim Rng As Range
Application.ScreenUpdating = False
Set Rng = ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants)
' Inscrie la valeur 1 dans une cellule après la plage utilisée
Cells(1, Rng.Columns.Count + 1).Value = 1
Cells(1, Rng.Columns.Count + 1).Copy
' Collage spécial valeur par multiplication
Rng.PasteSpecial xlPasteValues, xlPasteSpecialOperationMultiply

End Sub
Sub Remplacer()
Dim plage As Range
Application.ScreenUpdating = False
Set plage = Range(ActiveSheet.UsedRange.Address)

'pour chaque cellule de ma plage
For Each c In plage
'je remplace le . par une ,
c.Value = Replace(c.Value, ".", ",")
Next c
Application.ScreenUpdating = True
End Sub
,
 
Bonjour Chris,
Désolé mais je n'ai pas pu te répondre aussitot.
C'est un fichier Excel.
Les colonnes contiennent des nombres, du texte, des Nombre en format texte.
Oui il y a 2 lignes de titre.
Merci
 
Dernière édition:
Avec cette macro l'exécution se fait en 35 secondes :
VB:
Sub Conversion()
Dim t, i
t = Timer
On Error Resume Next 'si aucune SpecialCell
For i = 0 To 9
    Cells.SpecialCells(xlCellTypeConstants, 2).Replace i, i, xlPart
Next
MsgBox Timer - t
End Sub
 
Salut à tous ... de passage rapide après une longue absence 🙂

Et pourquoi ne pas utiliser la fonction intégré
Remplacement de "." par "," dans 60col x 60 000 lignes = 12 secondes sur mon PC

VB:
    Range("A2:BI6040").Select
    Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
 
RE

PowerQuery charge 25000 lignes sur 60 colonnes de nombres avec un point quasi instantanément (moins de 2 secondes) mais un exemple de quelques lignes représentatives permettrait de vérifier la véritable nature du contenu.
On parle 3 types de données mais on ne sait si c'est mélangé dans une même colonne...
 
Bonjour le forum,

Téléchargez le fichier déposé sur cjoint.com :

https://www.cjoint.com/c/NFehaWhtEP7

et lancez la macro :
VB:
Sub Conversion()
Dim t, ds$, tablo, ub%, i&, j%, x$
t = Timer
ds = Application.DecimalSeparator
With [A1:BH25000] 'à adapter
    tablo = .Formula 'au cas où il y aurait des formules
    ub = UBound(tablo, 2)
    For i = 1 To UBound(tablo)
        For j = 1 To ub
            x = Replace(tablo(i, j), ".", ds)
            If IsNumeric(x) Then tablo(i, j) = CDbl(x) 'conversion
    Next j, i
    .Value = tablo 'restitution
End With
MsgBox Timer - t
End Sub
Chez moi elle s'exécute en 2,6 secondes.

A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
704
  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
482
Réponses
14
Affichages
501
  • Question Question
Microsoft 365 Formule avec OU ?
Réponses
5
Affichages
389
Réponses
3
Affichages
485
Réponses
5
Affichages
474
Retour