Allouer une formule à une cellule EN DUR via VB

Bonjour,

J'ai un petit souci. J'aimerai, après un copier-coller sous conditions, allouer à une cellule une formule. Je m'explique :

En fait, je mets en page des tables pour saisir des dimensions. Pour un cas particulier, lorsque la forme choisie est un rectangle je colle une table 2x2 demandant la longueur et la largeur. Sur une autre feuille j'ai une cellule qui contient la surface et la cellule est nommée Surface. Alors j'aimerai qu'après ce copier coller je puisse allouer aux deux cellules un test qui permet, lorsque que l'utilisateur saisi une des deux valeurs (longueur ou largeur), de déterminer l'autre valeur par la formule :

En C56 : SI(C58 = "";;Surface/C58) ou En C58 : SI(C56 = "";;Surface/C56)

- Mon premier problème est qu'Excel signal une référence circulaire que j'aimerai ignorer.

- Mon deuxième problème est que je n'arrive pas à le coder.

J'ai essayé :

En codant en anglais :

Cells(56, "C").Formula = "IF(C58 = "";;Surface/C58)"
Cells(58, "C").Formula = "IF(C56 = "";;Surface/C56)"

Résultat : Ca m'écrit la formule comme texte dans la cellule

En codant en français :

Cells(56, "C").Formula = "SI(C58 = "";;Surface/C58)"
Cells(58, "C").Formula = "SI(C56 = "";;Surface/C56)"

Résultat : Idem

En rajoutant un "=" en anglais et en français avec ou sans R1C1:

Cells(56, "C").FormulaR1C1 = "" = "SI(C58 = "";;Surface/C58)"
Cells(58, "C").FormulaR1C1 = "" = "SI(C56 = "";;Surface/C56)"

Résultat : Me renvoie la valeur FAUX (normal) mais la formule n'est pas gardée dans la cellule car lorsque je saisie une valeur dans une des deux cellules l'autre ne me donne pas le résultat attendu mais reste sur FAUX

NB: Il faut savoir que mon fichier Excel est en mode Calcul Automatique et c'est absolument nécessaire.

Si vous avez une idée ou si vous avez besoin de plus d'informations n'hésitez pas !

Merci d'avance.

Bonjour,

Alors j'aimerai qu'après ce copier coller je puisse allouer aux deux cellules un test qui permet, lorsque que l'utilisateur saisi une des deux valeurs (longueur ou largeur), de déterminer l'autre valeur par la formule :

Les deux valeurs sont saisies en C56 ou en C58 ?

Amicalement

Oui, la saisie peut être faite soit en C56 soit en C58.

Re,

Utilise ce code :

Private Sub Worksheet_Change(ByVal Target As Range)
'Macro Dan le 21/09/10 - Askolein
'http://forum.excel-pratique.com/excel/allouer-une-formule-a-une-cellule-en-dur-via-vb-t19093.html
Dim i As Integer
Dim ok As Boolean
If ok = True Then Exit Sub
If Not Intersect(Target, Range("C56", "C58")) Is Nothing Then
ok = True
Select Case Range(Target.Address)
Case Is = Range("C56"): i = 2
Case Is = Range("C58"): i = -2
End Select
Range(Target.Address).Offset(i, 0) = Sheets("Feuil1").Range("surface") / Range(Target.Address)
ok = False
End If
End Sub

Avec "Feuil1" la feuille où se trouve la cellule nommée "surface". Donc à adapter dans le code ci-avant.

Pour placer le code :

  • Clique droite sur l'onglet et choisis "visualiser le code"
  • Colle le code ci-dessus dans la fenêtre puis OK

Amicalement

En fait mon problème est plus compliqué que cela.

Je te remercie pour la fonction elle a l'air de répondre en partie à mon problème.

alors je précise :

J'aimerai qu'après le copier coller je puisse donner une formule à deux cellules. Mais pour ça je ne veux pas devoir recreer un bouton ou quelconque interface avec l'utilisateur. J'ai un bouton "create/reset tables" qui fait la mise en page et après cette mise en page j'aimerai coder qlq lignes qui alloueraient mes formules à ces deux cellules.

Un partie du problème est que je veux juste que ces cellules soient implémentées de cette formule (qui ne pourra pas donner de résultat sans la saisie dans une des deux cellules concernées). Il faut donc que la macro se termine sans effectuer aucun calcul. Puis l'utilisateur choisi de saisir une valeur (soit Longueur soit largeur) et automatiquement l'autre cellule donne le résultat correcpondant.....

En gros:

Cell C56 et Cell C58 vide après avoir cliqué sur le bouton Create/Reset

Si l'utilisateur saisi une valeur en C56, après avoir taper sur Entrée ou cliqué sur une autre cellule la Cell C58 se calcule automatiquement.

Si l'utilisateur saisi une valeur en C58, idem que ci-dessus pour C56

Si l'utilisateur ne saisi rien, ne rien faire C56 et C58 restent vides.

car quand j'applique ta fonction après ma mise en page VB plante car "division par 0 impossible" !!

Plus je décris ce que je veux faire moins je trouve ça réalisable....

Est-ce une cause perdu ? Dans ce cas je vais devoir songer à une alternative qui sera acceptée par les utilisateurs (plutôt réfractaires.....)

re,

car quand j'applique ta fonction après ma mise en page VB plante car "division par 0 impossible" !!

Tu ne m'as pas dit que tu avais un autre code. Le mieux eu été de voir ton fichier.

Le souci vient de ton code Reset et il est normal que tu reçoives ce message.

  • Le code RESET se trouve dans un module VBA ??
  • Y a-t-il d'autres macros dans ton fichier ?

A te relire

Bonjour,

Effectivement il y a plusieurs macros dans mon fichier. Malheuresement, je ne peux pas le transmettre (boulot).

C'est un fichier contenant plus d'une dizaine de feuilles (toutes contenant des macros) plus 3 modules...

Je ne sais pas ce qu'est le code RESET. Peux-tu m'expliquer ?

Je pense que je vais, en attendant de voir si on trouve une solution proposer une alternative le délai devient trop juste). Mais ce serait intéressant de solutionner ce problème pour la culture et la communauté.

re,

Je ne sais pas ce qu'est le code RESET. Peux-tu m'expliquer ?

C'est toi qui m'a parlé d'un bouton "create reset" avant. J'ai supposé que le code associé s'appellait "Reset".

Bon fais ceci :

  • Dans le code que je t'ai donné supprime cette instruction --> Dim ok As Boolean
  • Dans un module au choix, en entête de ce module (donc avant toutes tes macros SUB) mets cette instruction --> Public ok As Boolean

Refais un test

A te relire

Ok désolé pour le malentendu. Le code du bouton reset se trouve dans la feuille de Microsoft Excel Objects.

J'ai réalisé ta manip' mais le problème est toujours là. Car en fait lorsque j'appelle cette fonction l'utilisateur ne peux pas encore saisir quoi que ce soit.

Je t'explique : lorsque ton programme s'exécute il calcul la cellule comme demandée (enfin il faut lui mettre en argument quand même). Mais le problème c'est quand lancer le programme. Car la mise en page se fait mais près l'utilisateur peut saisir une information nécessaire 5 minutes plus tard comme 2 jours plus tard en ayant fermer le fichier.

Je pense que je vais créer un modèle de tablea à copier qui sera unique et j'implémenterai les formules dans les cellules. Ensuite je ferai un copier-coller avec formule et forme de ce modèle dans le cas précis où il devra être fait.

Maintenant mon problème sera de supprimer l'avertissement de référence circulaire.

-- 22 Sep 2010, 14:52 --

C'est bon mon alternative fonctionne. Je fais donc un copier-coller d'un modèle (situé sur un autre onglet). Ce modèle comporte les formules avec des variables flottante (le choix des cellules s'adapte au nouvel emplacement -> F18 devient C56). Dès la saisie de l'utilisateur dans une de ces deux cellules, l'autre cellule donne le résultat attendu.

Effectivement après cette saisie, la formule a disparue mais comme il y a une bouton RESET les formules reviennent. Et l'avertissement de références circulaires n'apparaît que sur le modèle. Toutes mes exigences sont respectées.

Je pense que ce doit quand même être possible de gérer ce problème via VB. Si jamais tu veux toujours chercher je suis toujours partant ça allègera mon code et mon fichier ! Sinon je classe le sujet RESOLU =)

re,

j'appelle cette fonction l'utilisateur ne peux pas encore saisir quoi que ce soit.

Quelle fonction ??

En fait j'ai omis quelque chose. Comme je ne vois pas tes codes fait ceci en debut et à la fin de chaque macro dans tes modules.

Juste après SUB....., mets --> OK = TRUE

Juste avant END SUB, mets --> OK = FALSE

Encore désolé.

Amicalement

la fonction que tu m'as donnée : Private Sub Worksheet_Change(ByVal Target As Range)

le booléen OK est correctement initialisé ce n'est pas le problème.

Mais sincèrement, je pense qu'au vu de l'architecture de mon code, du fichier des macros ...etc c'est trop complexe.

Mon alternative fonctionne je la garde sur mon fichier.

merci

re,

Ok.

Si ton souci est terminé n'oublie pas de cloturer le fil en cliquant sur le V vert

A bientôt

Rechercher des sujets similaires à "allouer formule dur via"