Ajout d'une variable à la formule d'une cellule

Bonjour à tous !

J'ai un problème, sur lequel je planche depuis ce midi, et je commence à être à bout de nerfs.. Le PC est en sursis, là.

J'ai cherché, sur le net, sur excel-pratique, mais le cas est tellement spécifique que je n'ai pas trouvé de réponse.

J'explique :

J'ai un tableau prévisionnel annuel, décliné quotidiennement. Ces prévisions doivent être pondérées hebdomadairement en fonction d'un ratio, défini par l'utilisateur. Sur le papier, no soucy, fingers in da noze.

Sur le côté technique, du coup :

J'ai mis en place 2 Application.InputBox(es) qui permettent :

  • De spécifier le ratio que l'on veut appliquer (Variable Ratio)
  • De spécifier la plage de données (donc les jours, en fait) à laquelle on veut appliquer le ratio spécifié précédemment (Variable Plage)

Elles marchent bien, mais le souci supplémentaire, c'est que, au 10/01/2014 par exemple, nous avons la formule suivante :

=(Previsionnel!$C$5/NB(Feuil2!$C$3:$C$25))

Les parenthèses au début et à la fin sont mises là exprès, car je cherche à ce que ma variable Ratio vienne se greffer à la fin de cette formule. Ce qui nous donnerait donc, pour Ratio = 0.67

=(Previsionnel!$C$5/NB(Feuil2!$C$3:$C$25))*0.67

J'ai donc essayé avec ceci.

Static Sub SelectionRatio()

Dim Ratio As Variant
Dim Plage As Range

Ratio = Application.InputBox("Indiquez le ratio que vous souhaitez appliquer", "Concaténer")

Set Plage = Application.InputBox("Sélectionnez une plage à laquelle vous souhaitez appliquer le ratio !", "Sélection de cellules", Type:=8)

'Module de séléction de plage à la souris

Plage.Select
'Selection de la plage (moche mais utile pour la suite)

MsgBox ("La plage que vous avez séléctionnée est : " & Plage.Address)
'Boîte de dialogue pour informer de la selection

For Each Cell In Selection
Cell.Formula = Cell.Formula & Ratio
Next
End Sub

Comme vous vous en doutez, ça plante : erreur 1004 à la ligne surlignée. J'me suis donc dit, c'est peut-être le fait d'avoir un opérateur logique (*) dans ma variable qui fait planter le bouzin. J'ai donc tenté autre chose : j'ai modifié la ligne incriminée par la suivante :

Cell.Formula = Cell.Formula & "*" & Ratio

Encore une fois, of course, ça plante.

Donc, en attendant, j'ai remplacé le tout par le code qui suit, mais ça m'embête de ne plus avoir de visibilité sur la formule originelle.

Quelqu'un aurait-il une idée ? Je vous joins le fichier source (mais duquel j'ai retiré toutes les informations, les chiffres sont bidons etc..)

Static Sub SelectionRatio()

Dim Ratio As Variant
Dim Plage As Range

Ratio = Application.InputBox("Indiquez le ratio que vous souhaitez appliquer", "Concaténer", Type:=1)

Set Plage = Application.InputBox("Sélectionnez une plage à laquelle vous souhaitez appliquer le ratio !", "Sélection de cellules", Type:=8)

'Module de séléction de plage à la souris

Plage.Select
'Selection de la plage (moche mais utile pour la suite)

MsgBox ("La plage que vous avez séléctionnée est : " & Plage.Address)
'Boîte de dialogue pour informer de la selection

For Each Cell In Selection
Cell.Value = Cell.Value * Ratio
Next

End Sub

Merci d'avance !

Toto

10classeur-vide.xlsm (90.06 Ko)

Bonjour,

As-tu essayé avec :

Dim Ratio As Double

Alors, merci d'avoir répondu, déjà

Sinon oui, j'ai essayé tous les types de variables, seuls Variant et Integer fonctionnent.

Alors pour Integer, je dois modifier comme suit :

Cell.Formula = Cell.Formula & "*" & Ratio

Car il ne prend bien entendu pas l'opérateur logique. Le problème cependant, c'est qu'Integer ne prend pas les décimales, donc pour un ratio..Je l'ai dans l'os

J'ai aussi essayé un truc moche, du genre

Dim Ratio as Variant
Dim Ratio2 as Double
Ratio = Application.inputbox. etc...
Ratio2 = Ratio
Cell.Formula = Cell.Formula & "*" & Ratio2

Pas plus de résultats.

Encore plus moche :

Dim Ratio as Variant
Range("AA1").Value = Ratio
Cell.Formula = Cell.Formula & Range("AA1").Value

Pareil

Re,

Bizarre ...

Je viens d'essayer avec Dim Ratio as Double ...et çà fonctionne ...

N'oublie pas que le type 1 de ton inputbox stocke un nombre ...

Ben...pourquoi que ça marche pas chez moi ?! Encore ma guigne ça

Ou alors peut-être que je n'ai pas compris...

Re,

Je n'avais pas noté que tu voulais intervenir sur la colonne E ... qui contient une formule ...

Du coup, le code suivant devrait fonctionner :

Cell.Formula = Cell.Formula & "*" & CStr(Ratio)

à la place de

Cell.Formula = Cell.Formula & "*" & Ratio

Il veut pas toujours pas marcher le salopiaud... Encore cette horrible erreur 1004

Ça me rend fou de bloquer sur un truc comme ça, c'est totalement opaque pour moi

En tout cas, merci de m'aider, c'est cool !

Re,

Je te redonne le code complet :

Sub SelectionRatio()
' Code pour modifier la colonne E qui contient déjà une formule '''''''''''''''''''''''''''''''''''''''''''''''''
' Pour une autre colonne, il faudra une autre instruction ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim Ratio As Double
Dim Plage As Range

Ratio = Application.InputBox("Indiquez le ratio que vous souhaitez appliquer", "Concaténer", Type:=1)

Set Plage = Application.InputBox("Sélectionnez une plage à laquelle vous souhaitez appliquer le ratio !", "Sélection de cellules", Type:=8)

'Module de séléction de plage à la souris

Plage.Select
'Selection de la plage (moche mais utile pour la suite)

MsgBox ("La plage que vous avez séléctionnée est : " & Plage.Address)
'Boîte de dialogue pour informer de la selection

For Each Cell In Selection
  Cell.Formula = Cell.Formula & "*" & CStr(Ratio)
Next

End Sub

Je viens de tester, ça ne marche pas plus

Par contre, je ne comprends pas vraiment le fait que le code ne concerne que la colonne E :

La plage concernée par le code est désignée par l'utilisateur via la variable "Plage", définie grâce à l'inputbox en début de code.

Set Plage = Application.InputBox("Sélectionnez une plage à laquelle vous souhaitez appliquer le ratio !", "Sélection de cellules", Type:=8)

Après que l'utilisateur a défini cette variable "Plage", cette dernière est sélectionnée

Plage.Select

Du coup, la ligne qui nous enquiquine fait référence à la sélection en cours, donc à la suite variable de cellules "Plage" (qui peut être de type E1:E6 ou C1:G6) définie par l'user, grâce à l' "encadrement" qui suit :

For Each Cell In Selection
...
Next

J'vais finir chauve avec cette histoire

bonsoir,

une proposition de correction qui fonctionne avec ma version UK mais ligne à tester en version FR

    For Each c In Selection
        f = c.Formula
        If f <> "" Then ' si la cellule n'est pas vide
            If Left(f, 1) <> "=" Then f = "=0" & f ' si la cellule ne contient pas une formule, mais seulement un nombre
            f = f & "*" & ratio ' on ajoute la multiplication par le ratio
            c.Formula = Replace(f, ",", ".")  'tester si ceci est nécessaire en version FR, on remplace les virgules décimales par des points décimaux dans la formule
        End If
    Next

Bonsoir

une autre proposition de correction, en passant ratio à variant et le inputbox sans critère = lors de l'entrée de donnée type 0,67 le "textbox" affiche 0.67 !

Sub SelectionRatio()
' Code pour modifier la colonne E qui contient déjà une formule '''''''''''''''''''''''''''''''''''''''''''''''''
' Pour une autre colonne, il faudra une autre instruction ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim Ratio As Variant
Dim Plage As Range

Ratio = InputBox("Indiquez le ratio que vous souhaitez appliquer")

Set Plage = Application.InputBox("Sélectionnez une plage à laquelle vous souhaitez appliquer le ratio !", "Sélection de cellules", Type:=8)

'Module de séléction de plage à la souris

Plage.Select
'Selection de la plage (moche mais utile pour la suite)

MsgBox ("La plage que vous avez séléctionnée est : " & Plage.Address)
'Boîte de dialogue pour informer de la selection

For Each Cell In Selection
  Cell.Formula = Cell.Formula & "*" & Ratio
Next

End Sub

Ensuite la modification de formule est acceptée... enfin chez moi...

@ bientôt

Loureed

Bonjour,

Ci-joint ... le code testé ...

Option Explicit

Sub SelectionRatio()
' Module pour appliquer un ratio à la plage définie par l'utilisateur
Dim Ratio As Double
Dim Plage As Range
Dim Cell As Range

' Boîte de dialogue pour la saisie du nombre avec décimales
Ratio = Application.InputBox("Indiquez le ratio que vous souhaitez appliquer", "Concaténer", Type:=1)

' Boîte de dialogue pour la sélection de Plage à la souris
Set Plage = Application.InputBox("Sélectionnez une plage à laquelle vous souhaitez appliquer le ratio !", "Sélection de cellules", Type:=8)

' Boucle pour différencier les cellules avec/sans Formule
For Each Cell In Plage
  If AFormule(Cell) = True Then
    Cell.Formula = Cell.Formula & "*" & CStr(Ratio)
  Else
    Cell.Value = Cell.Value * Ratio
  End If
Next

End Sub

Function AFormule(rng As Range)
' Fonction pour tester si cellule contient ou pas une Formule
  If rng.HasFormula Then AFormule = True
End Function
James007 a écrit :

Bonjour,

Ci-joint ... le code testé ...

Alors ! Il ne marche malheureusement pas, mais je pense que le problème vient de moi :

En supprimant le type de l'app.inputbox, et en remettant "Ratio" en Variant, je peux desormais entrer comme ratio : 0.67 à la place de 0,67. Du coup, ça marche !

Peut-être un problème de langage ?

En tout cas, merci beaucoup !

LouReeD a écrit :

Bonsoir

une autre proposition de correction, en passant ratio à variant et le inputbox sans critère = lors de l'entrée de donnée type 0,67 le "textbox" affiche 0.67 !

Ensuite la modification de formule est acceptée... enfin chez moi...

@ bientôt

Loureed

Ton code marche tout autant ! C'est magnifique

h2so4 a écrit :

bonsoir,

une proposition de correction qui fonctionne avec ma version UK mais ligne à tester en version FR

    For Each c In Selection
        f = c.Formula
        If f <> "" Then ' si la cellule n'est pas vide
            If Left(f, 1) <> "=" Then f = "=0" & f ' si la cellule ne contient pas une formule, mais seulement un nombre
            f = f & "*" & ratio ' on ajoute la multiplication par le ratio
            c.Formula = Replace(f, ",", ".")  'tester si ceci est nécessaire en version FR, on remplace les virgules décimales par des points décimaux dans la formule
        End If
    Next

Sûrement à cause de ma version, mais il n'y a aucun changement sur les cellules visées

Quoi qu'il en soit merci beaucoup à tous, j'ai eu ma réponse Je ne peux malheureusement sélectionner qu'une réponse à mon problème sur le fil, mais je vous suis à tous reconnaissant hein

Re,

ravi que tu aies trouvé la solution ... et, par la même occasion, évité de voir ton PC passer par la fenêtre ...

rdi: Il a déjà fui, il a du m'entendre

Rechercher des sujets similaires à "ajout variable formule"