Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

formules reciproques dans 4 cellules

7 réponses
Avatar
Florent149
Bonjour a tous,

J'espere que cette question n'a pas ete deja posee, mais mes recherches sur
le forum ne m'ont rien donne donc je me decide a vous poser la question.
J'utilise Excel 2003.

Je dispose de quatre cellules qui vont "de paire", B11-B12 et B15-B16.
B11 se calcule a partir de B15 et B16
B12 se calcule a partir de B15 et B16
B15 se calcule a partir de B11 et B12
B16 se calcule a partir de B11 et B12

J'aimerais que l'utilisateur puisse soit rentrer B11 et B12 pour calculer
B15 et B16, soit faire le contraire.

Le probleme se complique puisqu'il y a des valeurs qui posent probleme donc
il faut faire des cas particuliers. (principalement lorsque la valeur d'une
ou plusieurs des cellules est nulle)

Voici ce que j'ai essaye de faire, et qui me donne des problemes d'overflow
quelle que soit la valeur que je donne: (dans le code de la page)


Code :
Private Sub Worksheet_Change(ByVal Target As Range)


If Not Intersect(Target, [B11]) Is Nothing Then
If [B11] = 0 Then [B15] = 0
Else: [B15] = Atn(Cos(WorksheetFunction.Radians([B12])) *
Tan(WorksheetFunction.Radians([B11]))) * Application.Pi() / 180
End If
If Not Intersect(Target, [B15]) Is Nothing Then
If [B15] = 0 Then [B11] = 0
Else: [B11] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Sin(Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))))) * Application.Pi() / 180
End If


If Not Intersect(Target, [B12]) Is Nothing Then
If [B12] = 0 Then [B16] = 0
Else: [B16] = Atn(Sin(WorksheetFunction.Radians([B12])) *
Tan(WorksheetFunction.Radians([B11]))) * Application.Pi() / 180
End If
If Not Intersect(Target, [B16]) Is Nothing Then
If [B16] = 0 Then [B12] = 0
Else: [B12] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))) * Application.Pi() / 180
End If

End Sub


Cette methode semble tourner en boucle, l'affichage des cellules change a
toute vitesse, avant de me dire que je divise par 0.

Si vous avez des idees, suggestions, merci de votre aide!
--
Flo

7 réponses

Avatar
Quetzalcoatl
"Florent149" a écrit ...
J'aimerais que l'utilisateur puisse soit rentrer B11 et B12 pour calculer
B15 et B16, soit faire le contraire.


Bonjour,

Voir peut-être aussi du côté du "solveur" ?

Avatar
Florent149
Bonjour et merci de ta reponse si rapide, mais peut tu preciser tes pensees
s'il te plait?
Je ne connais pas le solveur en question. (j'avoue que mes connaissances
sont assez limitees...)


--
Flo


"Quetzalcoatl" wrote:


"Florent149" a écrit ...
J'aimerais que l'utilisateur puisse soit rentrer B11 et B12 pour calculer
B15 et B16, soit faire le contraire.


Bonjour,

Voir peut-être aussi du côté du "solveur" ?






Avatar
tissot.emmanuel
Bonjour,

Cette methode semble tourner en boucle, l'affichage des cellules change a
toute vitesse, avant de me dire que je divise par 0.


Il faut modifier ta procédure pour éviter les appels récursifs:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEventsúlse
'code
Application.EnableEvents=True
End Sub

Cordialement,

Manu/

"Florent149" a écrit dans le message de
news:
Bonjour a tous,

J'espere que cette question n'a pas ete deja posee, mais mes recherches
sur
le forum ne m'ont rien donne donc je me decide a vous poser la question.
J'utilise Excel 2003.

Je dispose de quatre cellules qui vont "de paire", B11-B12 et B15-B16.
B11 se calcule a partir de B15 et B16
B12 se calcule a partir de B15 et B16
B15 se calcule a partir de B11 et B12
B16 se calcule a partir de B11 et B12

J'aimerais que l'utilisateur puisse soit rentrer B11 et B12 pour calculer
B15 et B16, soit faire le contraire.

Le probleme se complique puisqu'il y a des valeurs qui posent probleme
donc
il faut faire des cas particuliers. (principalement lorsque la valeur
d'une
ou plusieurs des cellules est nulle)

Voici ce que j'ai essaye de faire, et qui me donne des problemes
d'overflow
quelle que soit la valeur que je donne: (dans le code de la page)


Code :
Private Sub Worksheet_Change(ByVal Target As Range)


If Not Intersect(Target, [B11]) Is Nothing Then
If [B11] = 0 Then [B15] = 0
Else: [B15] = Atn(Cos(WorksheetFunction.Radians([B12])) *
Tan(WorksheetFunction.Radians([B11]))) * Application.Pi() / 180
End If
If Not Intersect(Target, [B15]) Is Nothing Then
If [B15] = 0 Then [B11] = 0
Else: [B11] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Sin(Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))))) * Application.Pi() / 180
End If


If Not Intersect(Target, [B12]) Is Nothing Then
If [B12] = 0 Then [B16] = 0
Else: [B16] = Atn(Sin(WorksheetFunction.Radians([B12])) *
Tan(WorksheetFunction.Radians([B11]))) * Application.Pi() / 180
End If
If Not Intersect(Target, [B16]) Is Nothing Then
If [B16] = 0 Then [B12] = 0
Else: [B12] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))) * Application.Pi() / 180
End If

End Sub


Cette methode semble tourner en boucle, l'affichage des cellules change a
toute vitesse, avant de me dire que je divise par 0.

Si vous avez des idees, suggestions, merci de votre aide!
--
Flo


Avatar
Florent149
Merci Emmanuel, il y a deja une petite avancee dans le sens ou ca ne plante
plus a chaque fois. Par contre ca ne marche pas puisque le changement d'une
cellule ne declenche pas le changement de celle qui est supposee recevoir la
formule adequat...

Les cellules semblent donc etre completement independantes, etrange!
--
Flo


"tissot.emmanuel" wrote:

Bonjour,

Cette methode semble tourner en boucle, l'affichage des cellules change a
toute vitesse, avant de me dire que je divise par 0.


Il faut modifier ta procédure pour éviter les appels récursifs:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEventsúlse
'code
Application.EnableEvents=True
End Sub

Cordialement,

Manu/

"Florent149" a écrit dans le message de
news:
Bonjour a tous,

J'espere que cette question n'a pas ete deja posee, mais mes recherches
sur
le forum ne m'ont rien donne donc je me decide a vous poser la question.
J'utilise Excel 2003.

Je dispose de quatre cellules qui vont "de paire", B11-B12 et B15-B16.
B11 se calcule a partir de B15 et B16
B12 se calcule a partir de B15 et B16
B15 se calcule a partir de B11 et B12
B16 se calcule a partir de B11 et B12

J'aimerais que l'utilisateur puisse soit rentrer B11 et B12 pour calculer
B15 et B16, soit faire le contraire.

Le probleme se complique puisqu'il y a des valeurs qui posent probleme
donc
il faut faire des cas particuliers. (principalement lorsque la valeur
d'une
ou plusieurs des cellules est nulle)

Voici ce que j'ai essaye de faire, et qui me donne des problemes
d'overflow
quelle que soit la valeur que je donne: (dans le code de la page)


Code :
Private Sub Worksheet_Change(ByVal Target As Range)


If Not Intersect(Target, [B11]) Is Nothing Then
If [B11] = 0 Then [B15] = 0
Else: [B15] = Atn(Cos(WorksheetFunction.Radians([B12])) *
Tan(WorksheetFunction.Radians([B11]))) * Application.Pi() / 180
End If
If Not Intersect(Target, [B15]) Is Nothing Then
If [B15] = 0 Then [B11] = 0
Else: [B11] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Sin(Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))))) * Application.Pi() / 180
End If


If Not Intersect(Target, [B12]) Is Nothing Then
If [B12] = 0 Then [B16] = 0
Else: [B16] = Atn(Sin(WorksheetFunction.Radians([B12])) *
Tan(WorksheetFunction.Radians([B11]))) * Application.Pi() / 180
End If
If Not Intersect(Target, [B16]) Is Nothing Then
If [B16] = 0 Then [B12] = 0
Else: [B12] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))) * Application.Pi() / 180
End If

End Sub


Cette methode semble tourner en boucle, l'affichage des cellules change a
toute vitesse, avant de me dire que je divise par 0.

Si vous avez des idees, suggestions, merci de votre aide!
--
Flo







Avatar
tissot.emmanuel
Re-bonjour,

Peut etre comme ceci:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, Range("B11:B16")) Is Nothing And Target.Count =
1 Then
Select Case Target.Address
Case "$B$11"
'Tes calculs
Case "$B$12"
'Tes calculs
Case "$B$15"
'Tes calculs
Case "$B$16"
'Tes calculs
Case Else
'rien
End Select
End If
Application.EnableEvents = True
End Sub

Cordialement,

Manu/

"Florent149" a écrit dans le message de
news:
Merci Emmanuel, il y a deja une petite avancee dans le sens ou ca ne
plante
plus a chaque fois. Par contre ca ne marche pas puisque le changement
d'une
cellule ne declenche pas le changement de celle qui est supposee recevoir
la
formule adequat...

Les cellules semblent donc etre completement independantes, etrange!
--
Flo


"tissot.emmanuel" wrote:

Bonjour,

Cette methode semble tourner en boucle, l'affichage des cellules change
a
toute vitesse, avant de me dire que je divise par 0.


Il faut modifier ta procédure pour éviter les appels récursifs:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEventsúlse
'code
Application.EnableEvents=True
End Sub

Cordialement,

Manu/

"Florent149" a écrit dans le message de
news:
Bonjour a tous,

J'espere que cette question n'a pas ete deja posee, mais mes recherches
sur
le forum ne m'ont rien donne donc je me decide a vous poser la
question.
J'utilise Excel 2003.

Je dispose de quatre cellules qui vont "de paire", B11-B12 et B15-B16.
B11 se calcule a partir de B15 et B16
B12 se calcule a partir de B15 et B16
B15 se calcule a partir de B11 et B12
B16 se calcule a partir de B11 et B12

J'aimerais que l'utilisateur puisse soit rentrer B11 et B12 pour
calculer
B15 et B16, soit faire le contraire.

Le probleme se complique puisqu'il y a des valeurs qui posent probleme
donc
il faut faire des cas particuliers. (principalement lorsque la valeur
d'une
ou plusieurs des cellules est nulle)

Voici ce que j'ai essaye de faire, et qui me donne des problemes
d'overflow
quelle que soit la valeur que je donne: (dans le code de la page)


Code :
Private Sub Worksheet_Change(ByVal Target As Range)


If Not Intersect(Target, [B11]) Is Nothing Then
If [B11] = 0 Then [B15] = 0
Else: [B15] = Atn(Cos(WorksheetFunction.Radians([B12])) *
Tan(WorksheetFunction.Radians([B11]))) * Application.Pi() / 180
End If
If Not Intersect(Target, [B15]) Is Nothing Then
If [B15] = 0 Then [B11] = 0
Else: [B11] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Sin(Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))))) * Application.Pi() / 180
End If


If Not Intersect(Target, [B12]) Is Nothing Then
If [B12] = 0 Then [B16] = 0
Else: [B16] = Atn(Sin(WorksheetFunction.Radians([B12])) *
Tan(WorksheetFunction.Radians([B11]))) * Application.Pi() / 180
End If
If Not Intersect(Target, [B16]) Is Nothing Then
If [B16] = 0 Then [B12] = 0
Else: [B12] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))) * Application.Pi() / 180
End If

End Sub


Cette methode semble tourner en boucle, l'affichage des cellules change
a
toute vitesse, avant de me dire que je divise par 0.

Si vous avez des idees, suggestions, merci de votre aide!
--
Flo









Avatar
Quetzalcoatl
"Florent149" a écrit ...
Bonjour et merci de ta reponse si rapide, mais peut tu preciser tes pensees
s'il te plait?
Je ne connais pas le solveur en question. (j'avoue que mes connaissances
sont assez limitees...)


Bonsoir,

Le solveur est un utilitaire intégré à Excel. Accès par le menu Outils > Solveur.
Il permet, par exemple, de résoudre une équation. Tu précises la cellule à définir (celle qui contient l'équation sous forme de
formule), sa valeur cible, la ou les cellules variables et le solveur trouve la solution par itération (on peut préciser le nombre
d'itérations, la précision, ...)
Voir l'aide en ligne EXCEL ou VBA pour plus de détails.

Dans ton cas, tu places une formule en B15 et B16 seulement, par exemple.
Si tu entres une valeur en B11 et B12, B15 et B16 sont classiquement calculées en fonction de B11 et B12.
Si tu cherches à entrer une valeur en B15 ou B16, une macro VBA prend le relais, te permet de saisir les valeurs et calcule B11 et
B12 en fonction des valeurs cibles souhaitées de B15 et B16, grâce au solveur.

APPLICATION :

En B15, tu places la formule :
=ATAN(COS(RADIANS(B12))*TAN(RADIANS(B11)))*PI()/180
En B16, tu places la formule :
=ATAN(SIN(RADIANS(B12))*TAN(RADIANS(B11)))*PI()/180

En B11 et B12, tu mets n'importe quoi : 22,6167105525561 et 45, par exemple ;-)

Ensuite, dans le menu VBA, Outils > Références > cocher la case SOLVER.xls.

Enfin, dans le code VBA de ta feuille :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim CIBLE_B15, CIBLE_B16

Application.EnableEvents = False

If Target.Address = "$B$15" Or Target.Address = "$B$16" Then

CIBLE_B15 = InputBox("Entrer valeur cible pour B15") + 0
CIBLE_B16 = InputBox("Entrer valeur cible pour B16") + 0

SolverReset
SolverOptions MaxTime:0, Iterations:00, precision:=0.000000001, _
AssumeLinear:úlse, StepThru:úlse, Estimates:=1, Derivatives:=1, _
SearchOption:=1, IntTolerance:=5, Scaling:úlse, Convergence:=0.001, _
AssumeNonNeg:úlse
SolverOK setCell:=Range("B15"), maxMinVal:=3, ValueOf:=CIBLE_B15, byChange:= _
Range("B11:B12")
SolverAdd cellRef:=Range("B16"), relation:=2, formulaText:=CIBLE_B16
SolverSolve UserFinish:=True
SolverFinish keepFinal:=1

End If

Application.EnableEvents = True

End Sub

Avatar
Florent149
Hey hey! ca roule, merci beaucoup Emmanuel je me suis inspire de ton idee
pour reformuler le code, et au passage j'ai re reflechi aux cas particuliers,
et maintenant ca marche nickel! Allez je vous met le code pour ceux que ca
interesserait:


Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False

If Not Intersect(Target, Range("B11:B16")) Is Nothing And Target.Count =
1 Then
Select Case Target.Address

Case "$B$11"

[B15] = Atn(Cos(WorksheetFunction.Radians(270 - [B12]))
* Tan(WorksheetFunction.Radians([B11]))) * 180 / Application.Pi()
[B16] = Atn(Sin(WorksheetFunction.Radians(270 - [B12]))
* Tan(WorksheetFunction.Radians([B11]))) * 180 / Application.Pi()

Case "$B$12"

[B15] = Atn(Cos(WorksheetFunction.Radians(270 - [B12]))
* Tan(WorksheetFunction.Radians([B11]))) * 180 / Application.Pi()
[B16] = Atn(Sin(WorksheetFunction.Radians(270 - [B12]))
* Tan(WorksheetFunction.Radians([B11]))) * 180 / Application.Pi()

Case "$B$15"

If [B15] = 0 Then
[B11] = [B16]
[B12] = 270 - 90
Else
[B11] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Sin(Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))))) * 180 / Application.Pi()
[B12] = (3 * Pi / 2 -
Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15])))) * 180 / Application.Pi()
End If

Case "$B$16"

If [B16] = 0 Then
[B11] = [B15]
[B12] = 270 - 0
Else
[B11] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Sin(Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))))) * 180 / Application.Pi()
[B12] = (3 * Pi / 2 -
Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15])))) * 180 / Application.Pi()
End If

Case Else

'nothing

End Select

End If

Application.EnableEvents = True

End Sub
--
Flo


"tissot.emmanuel" wrote:

Re-bonjour,

Peut etre comme ceci:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Not Intersect(Target, Range("B11:B16")) Is Nothing And Target.Count =
1 Then
Select Case Target.Address
Case "$B$11"
'Tes calculs
Case "$B$12"
'Tes calculs
Case "$B$15"
'Tes calculs
Case "$B$16"
'Tes calculs
Case Else
'rien
End Select
End If
Application.EnableEvents = True
End Sub

Cordialement,

Manu/

"Florent149" a écrit dans le message de
news:
Merci Emmanuel, il y a deja une petite avancee dans le sens ou ca ne
plante
plus a chaque fois. Par contre ca ne marche pas puisque le changement
d'une
cellule ne declenche pas le changement de celle qui est supposee recevoir
la
formule adequat...

Les cellules semblent donc etre completement independantes, etrange!
--
Flo


"tissot.emmanuel" wrote:

Bonjour,

Cette methode semble tourner en boucle, l'affichage des cellules change
a
toute vitesse, avant de me dire que je divise par 0.


Il faut modifier ta procédure pour éviter les appels récursifs:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEventsúlse
'code
Application.EnableEvents=True
End Sub

Cordialement,

Manu/

"Florent149" a écrit dans le message de
news:
Bonjour a tous,

J'espere que cette question n'a pas ete deja posee, mais mes recherches
sur
le forum ne m'ont rien donne donc je me decide a vous poser la
question.
J'utilise Excel 2003.

Je dispose de quatre cellules qui vont "de paire", B11-B12 et B15-B16.
B11 se calcule a partir de B15 et B16
B12 se calcule a partir de B15 et B16
B15 se calcule a partir de B11 et B12
B16 se calcule a partir de B11 et B12

J'aimerais que l'utilisateur puisse soit rentrer B11 et B12 pour
calculer
B15 et B16, soit faire le contraire.

Le probleme se complique puisqu'il y a des valeurs qui posent probleme
donc
il faut faire des cas particuliers. (principalement lorsque la valeur
d'une
ou plusieurs des cellules est nulle)

Voici ce que j'ai essaye de faire, et qui me donne des problemes
d'overflow
quelle que soit la valeur que je donne: (dans le code de la page)


Code :
Private Sub Worksheet_Change(ByVal Target As Range)


If Not Intersect(Target, [B11]) Is Nothing Then
If [B11] = 0 Then [B15] = 0
Else: [B15] = Atn(Cos(WorksheetFunction.Radians([B12])) *
Tan(WorksheetFunction.Radians([B11]))) * Application.Pi() / 180
End If
If Not Intersect(Target, [B15]) Is Nothing Then
If [B15] = 0 Then [B11] = 0
Else: [B11] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Sin(Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))))) * Application.Pi() / 180
End If


If Not Intersect(Target, [B12]) Is Nothing Then
If [B12] = 0 Then [B16] = 0
Else: [B16] = Atn(Sin(WorksheetFunction.Radians([B12])) *
Tan(WorksheetFunction.Radians([B11]))) * Application.Pi() / 180
End If
If Not Intersect(Target, [B16]) Is Nothing Then
If [B16] = 0 Then [B12] = 0
Else: [B12] = Atn(Tan(WorksheetFunction.Radians([B16])) /
Tan(WorksheetFunction.Radians([B15]))) * Application.Pi() / 180
End If

End Sub


Cette methode semble tourner en boucle, l'affichage des cellules change
a
toute vitesse, avant de me dire que je divise par 0.

Si vous avez des idees, suggestions, merci de votre aide!
--
Flo