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
,
 

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+
 

Discussions similaires

Réponses
5
Affichages
384
Réponses
7
Affichages
686

Statistiques des forums

Discussions
315 089
Messages
2 116 098
Membres
112 661
dernier inscrit
ceucri