Appliquer une macro à toute une colonne
Mais pour quoi F9 auparavant elle dépend de la colonne E9
Il s'agit juste d'une conversion mais on ne se preoccupe pas de E9, simplement des valeurs en F9.
Je ne comprends pas pourquoi faire une recherche ? Comment fonctionne-t-elle selon tes notations ?
Supposons que tu a une règle :
A= (b*c)/d et tu doit changer "C" a condition que "A" ne pas dépasse pas 50
tu a donc C = (A *D) /B
Alors tu mettre A=50 et comme ça tu va avoir le C idéal mais cette valeur ne existe pas dans la liste de la table usuel donc la fonction recherche va te rechercher la valeur la plus proche de l idéal:
Dans cet exemple la valeur idéal de C est 33.333 mais la fonction recherche va trouver 27,2 comme valeur réel:
Ce chemin n'est pas possible car dans mon cas le diamètre intervient dans les formules intermédiaires afin de determiner d'autre facteurs, j'y avais pensé en effet.
Il faut que je procede par itérations comme expliqué précédement et je pense que dans ce cas le VBA est la solution la plus adequate
perso je pense que c’est possible !
mais même avec le VBA tu dois nous donner les cellules concernés et la formule qui les attaches
tu veux qu on utilise =SI(K9=0;0;1000*J9*PUISSANCE(G9;2)*$G$4/(2*F9))
noter qu'il y a déjà une relation de F9 AVEC J9 OU G9 qui amène a une référence circulaire
Non malheureusement nous ne pouvons pas isoler la valeur de diamètre en partant des formules de fin, il est impliqué dans des formules trop compliquées.
De quelle cellule as tu besoin pour le vba ? J'ai l'impression d'avoir expliqué au mieux ma demande je ne sais plus quoi faire :(
Bonjour à tous,
Je suis arrivé, en étudiant le fichier, sur la même conclusion qu'AMIR. Il est très complexe de s'y retrouver car les cellules sont toutes interdépendantes. Je suis d'ailleurs étonné de ne pas rencontrer de références circulaires.
Cependant, comme je n'arrive pas à passer par un application.evaluate du fait de ce premier point et que je suis une bille en mathématique imbriquée, un test qui n'est pas beau en matière de développement de par le calculate, mais fonctionnel selon moi si j'ai bien compris :
Sub CALC()
Dim DIAMS(), I As Byte, LR&, L&
Application.Calculation = xlCalculationManual
With Worksheets("CH Pertes de charge")
LR = .Cells(.Rows.Count, 2).End(xlUp).Row
DIAMS = Array("1/2''", "3/4''", "1''", "DN32", "DN40", "DN50", "DN65", "DN80", "DN100", "DN125", "DN150", "DN200", "DN225", "DN250", "DN300")
For L = 9 To LR
If Not IsEmpty(.Cells(L, 3)) Then
For I = LBound(DIAMS) To UBound(DIAMS)
.Cells(L, 5) = DIAMS(I)
.Rows(L).Calculate
If .Cells(L, 12) < .Range("R2") Then Exit For
Next I
End If
Next L
End With
Application.Calculation = xlCalculationAutomatic
End SubCdlt,
Merci je vais essayer de comprendre comment se compose ton code !
Effectivement la complexité vient de la, mais à partir du moment où l'on fixe une valeur en F9, les calculs sont censés se faire tout seul. l'idée est de lire la valeur en L9 afin de vérifier la condition L9<50. SI elle ne l'est pas je voulais pouvoir incrémenter les valeurs de 16 à 131.7
Bonjour,
C'est ce que la macro fait. A vrai dire je n'incrémente pas par les valeurs numériques mais par les noms de diamètres. Mais l'inverse est possible, il faudrait que j'ajoute une ligne de code, à vous de me dire. En attendant le code commenté :
Sub CALC()
Dim DIAMS(), I As Byte, LR&, L&
Application.Calculation = xlCalculationManual 'On désactive le calcul auto pour ne pas ralentir la macro
With Worksheets("CH Pertes de charge") 'Avec la feuille
LR = .Cells(.Rows.Count, 2).End(xlUp).Row 'On défini la dernière ligne de la feuille en se basant sur la colonne B
DIAMS = Array("1/2''", "3/4''", "1''", "DN32", "DN40", "DN50", "DN65", "DN80", "DN100", "DN125", "DN150", "DN200", "DN225", "DN250", "DN300") 'On charge les différents diamètres
For L = 9 To LR 'Pour chaque ligne
If Not IsEmpty(.Cells(L, 3)) Then 'Si la colonne C (3) la ligne L n'est pas vide alors
For I = LBound(DIAMS) To UBound(DIAMS) 'Pour chaque valeur des diamètres
.Cells(L, 5) = DIAMS(I) 'On place le diamètre dans la 5ème colonne, ligne L
.Rows(L).Calculate 'On calcule la ligne L
If .Cells(L, 12) < .Range("R2") Then Exit For 'Si la valeur de la 12ème colonne, ligne L est inférieure a R2 alors on sort de la boucle (donc on ne met pas d'autre diamètre, donc on saute le Next I)
Next I 'On passe au diamètre suivant
End If
Next L 'On passe à la ligne suivante
End With
Application.Calculation = xlCalculationAutomatic 'On réactive la macro
End SubSi vous souhaitez ne pas passer par une formule en E9 (le code est sensiblement les mêmes que précédemment, on a juste une corrélation entre les deux tableaux VALS et DIAMS) :
Sub CALC()
Dim VALS(), DIAMS(), I As Byte, LR&, L&
Application.Calculation = xlCalculationManual
With Worksheets("CH Pertes de charge")
LR = .Cells(.Rows.Count, 2).End(xlUp).Row
VALS = Array(16, 21.6, 27.2, 37.2, 43.1, 54.5, 70.3, 82.5, 107.1, 131.7, 156.1, 206.5, 231.9, 260.4, 309.7)
DIAMS = Array("1/2''", "3/4''", "1''", "DN32", "DN40", "DN50", "DN65", "DN80", "DN100", "DN125", "DN150", "DN200", "DN225", "DN250", "DN300")
For L = 9 To LR
If Not IsEmpty(.Cells(L, 3)) Then
For I = LBound(DIAMS) To UBound(DIAMS)
.Cells(L, 6) = VALS(I)
.Rows(L).Calculate
If .Cells(L, 12) < .Range("R2") Then .Cells(L, 5) = DIAMS(I): Exit For
Next I
End If
Next L
End With
Application.Calculation = xlCalculationAutomatic
End SubCdlt,
Salut Ergotamine
# Ergotamine j espère bien que tu l aide
Noter qu'il y a déjà une relation de F9 AVEC J9 OU G9 qui amène à une référence circulaire
Je veux dire quand j ai essayé d appliquer la fonction de recherche décrite en haut j’ai découvert que tout est lier comme une toile d'araignée qu’i m a amené a une référence circulaire
# Yannouuu Perso je vois que tu dois refaire tous, étape par étape, et surtout si tu commence a gâcher les formules comme tu veux faire avec F9 !
Perso C’est vrai qu’on peut faire de propre travail avec le VBA mais je voix que tu te débrouilles seule avec les formules
Cdlt,
Ergotamine tu as visé juste, c'est incroyable cela répond tout à fait à ce que je pensais.
J'ai encore du mal à comprendre certaines notations de ton code sous VBA, je vais essayer de voir si tout fonctionne pour l'utilisation que je veux en faire et je te tiens au courant en mp
C'est tellement frustrant d'avoir tout le schéma en tête mais de ne rien pouvoir faire car il y a tellement de fonctions à connaitre pour appeler les valeurs etc... En tout cas tes explications du codes sont limpides ca va m'aider à comprendre.
