Modifier les cellules d'une formule somme en VBA

Bonjour à tous,

Je bloque sur le problème suivant:

En VBA, je copie / colle par exemple cette formule d'un onglet vers un autre (somme de taille variable)

=E34+E57+E80+E103+E126

Seulement je réorganise un peu mes données dans ce nouvel onglet et la formule devrait devenir

=E77+E123+E169+E215+E261

J'ai d'abord essayé de coller ma formule somme puis d'insérer des lignes pour que Excel ajuste automatiquement,

Malheureusement mon fichier est relativement important et ça me prends 5 secondes par ligne...

J'ai ensuite décidé d'ouvrir un nouveau fichier et d'insérer ces lignes dans le nouveau fichier puis de déplacer le tout dans mon onglet et fichier

-> ça fonctionne, mais je ne trouve pas ça propre

L'idéal serait un code, qui balaie la formule (de taille variable)

=E34+E57+E80+E103+E126

et qui ajoute 46 à chaque nombre rencontrés (le nombre peut être sur 1, 2, 3, ou 4 digit)

J'espère avoir été clair mais n'hésitez pas à me demander des précisions,

Merci de votre aide,

Julien

Salut,

Le mieux serait de recoder la formule en VBA en se basant sur les intitulés de colonnes et pas sur leur position (qui risque de changer) puis de boucler sur toutes les lignes du fichier.

Du coup, il faudrait que tu mettes à dispo un fichier exemple en indiquant la colonne de référence (sur laquelle il faut se baser pour compter le nombre de lignes) et ta méthode de somme.

Bonjour,

S'il s'agissait d'ajouter une valeur constante à chaque numéro de ligne des références incluses dans ta formule (mais ton exemple ne l'indique pas... !!!), tu prélèves ta formule, tu opères la transformation, tu affectes la formule transformée. Le prélèvement et l'affectation doivent utiliser la propriété Formula.

Exemple de transformation : nf est une variable (non typée, donc type Variant) à laquelle tu as affectée la formule).

Tu la traites :

    nf = Split(nf, "E")
    For i = 0 To UBound(nf)
        n = Val(nf(i))
        If n > 0 Then nf(i) = Replace(nf(i), CStr(n), CStr(n + 46))
    Next i
    nf = Join(nf, "E")

Et il ne te reste plus qu'à affecter la nouvelle formule où toutes les lignes ont été incrémentées de 46 à l'emplacement prévu...

Ceci n'est qu'un exemple particulier, mais la méthode consistant à prendre la formule et la transformer avant de la réaffecter ailleur est, elle, générale. Evidemment, selon la transformation à opérer les traitements peuvent être fort différents...

Mais tu peux tester ce bout de code : si nf contient au départ : "=E34+E57+E80+E103+E126" tu obtiendras à l'arrivée : "=E80+E103+E126+E149+E172"

Cordialement.

Hello MFerrand,

Un grand merci,

Je pensais bien aux tableaux mais sans split, je comptais tester caractère par caractère s'il était numérique afin de reconstruire les nombres, un peu lent..

Ta solution me facilite grandement la tache,

En comparaison avec mon astuce d'ouvrir un fichier temp et d'y insérer des lignes, je gagne en moyenne 1,5 seconde et c'est bien plus propre,

Je mets mon code adapté ici qui prend la formule en F5, ajoute 46 lignes a chaque "cellule rencontrée" et met la formule à jour dans la cellule initiale

    nf = Range("F" & j + 5).Formula
        nf = Split(nf, "F")
        For i = 0 To UBound(nf)
            n = Val(nf(i))
            If n > 0 Then nf(i) = Replace(nf(i), CStr(n), CStr(n + 46))
        Next i
        nf = Join(nf, "F")
    Range("F" & j + 5).Formula = nf

Julien

Rechercher des sujets similaires à "modifier formule somme vba"