Remplacer formules pars valeurs sur plage filtrée VBA

Bonjour,

Je recherche un sub qui me permette de remplacer les formules de toutes les lignes (+1000 lignes) par leur valeur dans la condition que la colonne BV contienne un texte.

La plage a traitée est celle-ci => A10:CP

Novice que je suis, j'ai tenté ce code mais sans succés :(

Sub formuleByValue()
Dim dl As Integer, i As Integer
Dim rng As Range

With Sheets("Carnet de commande ")
    dl = .Range("A10").CurrentRegion.Rows.Count
    For i = 10 To dl
        'Vérifie si texte en BV
        If .Range("BV" & i) <> vbNullString Then 
       'Copie la ligne entière
        Else: .Range("BV" & i).EntireRow.Copy 
      'Colle l aligne
        Selection.PasteSpecial Paste:=xlPasteValues 
        End If 
'ligne suivante
    Next i 
End With
End Sub

Merci d'avance pour l'aide que je pourrais recevoir :)

Bonne journée

incomplet...

Bonjour,

C'est un bon début !

La principale erreur que vous faites est:

If .Range("BV" & i) <> vbNullString

L'objet Range dispose de nombreuses propriétés, et l'interpréteur VBA ne sait pas que vous souhaitez regarder sa Valeur, il serait donc plus correct d'utiliser

If .Range("BV" & i).Value <> vbNullString

Ensuite quitte à utiliser le VBA, au lieu d'utiliser la fonction copier/coller valeurs, je vous conseille d'utiliser ceci:

Comme je vous le disait l'objet Range dispose de plusieurs propriétés, dont une qui contient sa formule. Ainsi en appliquant:

.Range(blablabla).Formula = .Range(blablabla).Valeur

Vous remplacez la Formule de la cellule (ou du groupe de cellules, puisque range renvoie une liste de cellules) blablabla par sa valeur en une étape.

Ci-après une proposition de code

Sub formuleByValue()
    Dim dl As Integer, i As Integer
    Dim rng As Range

    With Sheets("Carnet de commande ")
        dl = .Range("A10").CurrentRegion.Rows.Count
        For i = 10 To dl
            'Vérifie si texte en BV
            If .Range("BV" & i).Value2 <> vbNullString Then
              'Remplacement de la formule par son résultat
              .Range("BV" & i).EntireRow.Formula = .Range("BV" & i).EntireRow.Value2
            End If
        'ligne suivante
        Next i
    End With
End Sub

Si le code met trop de temps à s'exécuter vous pouvez désactiver ScreenUpdating et/ou le calcul automatique. Je vous renvoi vers le sujet traité récemment sur ce forum "Temps d'execution d'une macro demesure".

Bonjour,

C'est tout bon avec la solution de Saboh12617, ça fonctionne parfaitement, le traitement est un peu long mais logique vu le nombre de lignes.

Merci

Rechercher des sujets similaires à "remplacer formules pars valeurs plage filtree vba"