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 ?
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
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
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
Re,
ravi que tu aies trouvé la solution ... et, par la même occasion, évité de voir ton PC passer par la fenêtre ...