Formule variable

Bonjour à tous et désolé pour ce titre peu clair...

Voici mon problème :

J'ai un tableau, mettons de 5 colonnes et nombre de lignes sans importance.

Pour une ligne données, les 5 valeurs sont liées par des relations connues. Dès que je connais deux valeurs quelconques parmi les 5, je peux calculer les 3 autres.

Je voudrais que mon tableau calcule, sans connaître les deux colonnes que l'utilisateur va saisir, les 3 autres...

Je n'y arrive pas... J'ai bien conscience qu'il faut que je fabrique un tableau annexe : mon tableau de départ ne peut pas contenir de formules qui seraient effacées par la saisie d'une valeur...

Merci de votre aide

Millevaches

Bonjour,

A quoi ça sert ! puisque tant qu'il n'a pas saisi 2 valeurs, tu ne peux afficher les 3 autres !

Tu attends la saisie des deux valeurs et tu mets automatiquement les 3 autres dès saisie effectuée.

Cordialement.

C'est un excellent résumé de mon problème...

Merci quand même.


Parmi mes pistes de recherche, générer un nombre binaire en fonction des deux valeurs saisies, par exemple 10010, si l'utilisateur remplit les colonnes 1 et 4, mais comment remplir les colonnes 2,3 et 5 en fonction des valeurs saisies et des relations liant les grandeurs ?

Ouille ! Ouille ! Tu réfléchis trop !

D'abord tu as une plage de 5 colonne (sur une ligne), un test classique te permet de savoir lesquelles sont servies, et lesquelles sont vides (que tu dois servir à partir des 2 valeurs saisies).

(Si tes cellules sont éparpillées, tu mets les numéros de colonnes dans un tableau et on pourra les parcourir en boucle de la même façon...).

Si tu veux sophistiquer et utiliser la fonction And (test au niveau du bit), voilà comment procéder :

With Me.Range(taplagede5cellules)
    For i = 1 To 5
        If .Cells(1, i) <> "" Then
            If v1 = 0 Then v1 = .Cells(1, i) Else v2 = .Cells(1, i) 'interceptant chaque saisie, tu intercepteras la seconde...
        Else
            n = n + 2 ^ (i - 1)
        End If
    Next i
    If v2 > 0 Then 'si tu n'as qu'une valeur faut attendre la saisie suivante
        v345(0) = fonctiondev1~v2
        v345(1) = fonctiondev1~v2
        v345(2) = fonctiondev1~v2
        For i = 1 to 5
            If 2 ^ (i - 1) And n Then
                .Cells(1, i) = v345(j)
                j = j + 1
            End If
        Next i
    End If
End With

Je n'ai pas mis les déclarations mais ça tu peux faire, ni le démarrage de procédure, mais évidemment c'est une évènementielle Change...

J'ai utilisé : une variable i avec laquelle tu parcours ta plage.

Une variable n servant pour ton test binaire : si la cellule est vide, tu ajoutes à n : 2^(i-1), soit respectivement pour les cellules 1 à 5 de ta plage, les valeurs 1, 2, 4, 8, ou 16.

J'ai considéré que tu récupérais tes valeurs saisies dans 2 variables : v1 et v2, et que tu affectais tes 3 valeurs calculées à un tableau v345 [déclaré donc : Dim v345(2)]. Mais tu peux faire autrement...

Au 2e parcours de la plage, tu sers les cellule vide si le test avec And est vérifié.

Une variable j est utilisée pour affecter successivement les 3 valeurs. D'après tes indications, la position paraît indifférente... sinon c'est toi qui voit.

L'objectif était le mécanisme d'un test au niveau binaire... Tu peux écrire n en binaire et tu visualises comment ça se joue avec les valeurs binaires de 1, 2, 4, 8, 16 (correspondant chacune à un bit).

Cordialement.


NB- Je n'ai pas non plus intégré : Application.EnableEvents = False, nécessaire pour écrire sur la feuille (et à remettre à True ensuite)...

OK merci, je souhaitais trouver une solution sans écrire du code VBA..J'avais peu d'espoir et vous me le confirmez...

Je vais devoir me mettre au travail.

Merci pour votre bout de code, j'espère qu'il va m'inspirer...

Cordialement,

Millevaches

Dès lors que tu ne peux pas mettre de formule... le recours à VBA s'impose.

Tu seras sur une procédure particulière, qu'on appelle évènementielle, qui devra se trouver dans le module de la feuille concernée (pour l'atteindre directement, clic doit sur l'onglet et Visualiser le code). Dans ce module, tu fais un clic sur Worksheet dans la liste déroulante de gauche. S'affichera la déclaration de la proc. SelectionChange (déplacement du curseur dans la feuille, qui est l'évènement par défaut pour une feuille de calcul). Tu t'y positionnes, déroules la liste de gauche, y cherche l'évènement Change, et tu cliques pour que VBA affiche la déclaration de la proc. Change...

Ton code macro doit se situer entre le Sub et le End Sub de cette proc. comme tu ne surveilles qu'un changement précis, il faut cadrer la procédure par une condition générale, dans ton cas :

If Not Intersect(Target, TaPlageSurveillée) Is Nothing Then

Target étant la cellule modifiée par l'utilisateur, si elle n'est pas dans la plage voulue, tu n'exécutes rien !

Ensuite, il faut veiller à ce que lorsque toi tu interviens sur les cellules qui sont dans la plage, tu aies interrompu la réaction aux évènements pour la rétablir une fois ton intervention finie. Sans cela l'évènement se déclenchant à répétition produirait des résultats pour le coup inattendus !

Et tu reviens si tu ne t"en dépatouilles pas tout seul.

Cordialement.

Rechercher des sujets similaires à "formule variable"