Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

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+

carlos

XLDnaute Impliqué
Supporter XLD
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
,
 

chris

XLDnaute Barbatruc
Bonjour

Ton fichier à la base c'est un Excel ou un CSV ?

C'est sûr qu'une boucle n'est pas la meilleure approche

Les 60 colonnes contiennent des nombres ?

Il y a une ligne de titre ?
 

carlos

XLDnaute Impliqué
Supporter XLD
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:

job75

XLDnaute Barbatruc
J'ai testé sur un tableau 25000 x 60 contenant des nombres aléatoires avec le point comme séparateur.

Le code précédent s'exécute chez moi en 5 minutes, ce n'est pas fameux.
 

job75

XLDnaute Barbatruc
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
 

Deadpool_CC

XLDnaute Accro
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
 

chris

XLDnaute Barbatruc
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...
 

job75

XLDnaute Barbatruc
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+
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…