[VBA] Convertir format texte en nombre sans boucle ?

Int0x

XLDnaute Occasionnel
Bonjour à tous,

Je cherche à convertir, via VBA, la range

Code:
Range("C2:C" & Range("D65536").End(xlUp).Row)

de format texte en format nombre.

J'avais trouvé une formule

Code:
Range("C2:C" & Range("D65536").End(xlUp).Row).select
For Each c In Selection
x = Val(c)
Range(c.Address) = CDbl(x)
Next
mais depuis ce matin, celle-ci est devenue très longue.
Jusqu'à présent, c'était fait presque "instantanément" (cela prennait 2-3s pour tout convertir) alors que maintenant, cela descend sur chaque cellule puis fait la conversion. A coup de 0.5s par cellule, c'est impossible de tenir comme ça.

D'où ma question. Existe-t-il une formule permettant de convertir une range de texte en nombre, sans passer par une boucle ? Si je poussais le vice plus loin, je chercherai à comprendre pourquoi un tel changement dans le déroulement de ctte opération, mais je dois reconnaitre que la flemme vient se greffer à mon incompétence en la matière :eek:

Par avance merci ;)
 

fluidz91

XLDnaute Nouveau
Re : [VBA] Convertir format texte en nombre sans boucle ?

Bonjour et Merci Patrick. Je vous pique votre code car il fonctionne parfaitement, contrairement à celui que j'ai posté précédemment car j'ai laissé trainer un Range("I9:I17").Select qui ne modifiait que cette zone et lorsque je remplace cette ligne par mon rng.Select j'ai une erreur sur cette ligne If IsNumeric(arrData(i, j)) du style : "l'index n'est pas dans la sélection"
Du coup, voici le nouveau code utilisé pour ceux que cela interessera :

dans ThisWorkBook :

Code:
Private Sub Workbook_Open()
    'Execution automatique à l'ouverture du fichier
    Call Macro1
End Sub

dans Module1 :

Code:
Public Sub Macro1()
    Application.ScreenUpdating = False
    Set rngXVal = Range("F9:" & Range("F9").End(xlDown).Address)
    If Not IsEmpty(ActiveSheet.Range("F9").Value) Then
        rngXVal.Select
        TXT2NUM "0"
    End If
    
    Set rngXVal = Range("I9:" & Range("I9").End(xlDown).Address)
    If Not IsEmpty(ActiveSheet.Range("I9").Value) Then
        rngXVal.Select
        TXT2NUM "1"
    End If
        
    Set rngXVal = Range("J9:" & Range("J9").End(xlDown).Address)
    If Not IsEmpty(ActiveSheet.Range("J9").Value) Then
        rngXVal.Select
        TXT2NUM "1"
    End If
End Sub

Sub TXT2NUM(FMT)
    'MsgBox "Execute conversion"
    Dim R As Range
    Dim var
    Dim i&
    Dim j&
    Set R = Selection
    var = R
    For i& = 1 To UBound(var, 1)
      For j& = 1 To UBound(var, 2)
        If IsNumeric(var(i&, j&)) Then
          var(i&, j&) = CDbl(var(i&, j&))
        End If
      Next j&
    Next i&
    R = var
    If FMT = "1" Then
        R.NumberFormat = "0.00"
    Else
        R.NumberFormat = "0"
    End If
    Range("A1").Select
    Application.ScreenUpdating = True
End Sub

Merci aussi MJ13 pour les infos et le temps passé pour m'aider.
 

fluidz91

XLDnaute Nouveau
Re : [VBA] Convertir format texte en nombre sans boucle ?

Pfff ! C'est comme le produit vaisselle : "Quand y'en a plus, y'en a encore !"
Désolé de vous déranger encore mais je viens de voir que dans le fichier Excel à traiter il y a une ligne contenant des pourcentages.
Sauriez-vous ce qu'il faut faire pour transformer ces % en mode texte en % en mode pourcentage ?
La ligne étant toujours au même endroit de longueur fixe je peux aisément faire un Range("B24:M24").Select avant d'appeler la fonction.
Merci.
 

Discussions similaires

Réponses
1
Affichages
1 K

Statistiques des forums

Discussions
312 278
Messages
2 086 717
Membres
103 378
dernier inscrit
phdrouart