1 pièce(s) jointe(s)
Macro Condition sans rupture de liaison
Bonjour à tous.
Voilà une application de DEVIS.
J’ai 3 feuilles dans mon classeur pour cette situation
‘’BD ‘’
‘’SAISIE’’
‘’DEVIS’’
Dans ma feuille de saisie je vais chercher les articles par une menu déroulant (validation de données liste) => Menu Formule/Définir un nom => fonction DECLALER dans la gestion des noms.
C’a pour la désignation des produits. Pour mon exemple il s’agit d’une poutre. Par la fonction RECHERCHEV j’affiche dans les colonnes suivantes la largeur / la hauteur / le poids etc…
Bon voilà pour le principe.
Ma feuille DEVIS contient par liaison relative une copie conforme de ma feuille de SAISIE. Pourquoi parce que dans la feuille DEVIS il s’y trouve des calculs complexes et dans la feuille DEVIS les derniers calculs commerciaux. Bon c’est comme cela que bosse la boîte dans laquelle je viens d’arriver.
Mon but je prends un exemple
Col A Col B Col C Col D Col E
Désignation Type Largeur x Hauteur
Poutre IC 40x75 IC 40 x 75
Bon et bien dans ma feuille SAISIE la hauteur qui sert à calculer le volume du produit est une valeur du fait de sa géométrie.
Poutre IC 40x75 IC 40 x 45.4 (ce sera la valeur à changer dans la feuille DEVIS)
Et c’est dans ma feuille de DEVIS que je dois faire la conversion
Poutre IC 40x75 IC 40 x 75
Mais sans casser le lien relatif pour des questions de manipulations des opérateurs car sans cela il faudrait refaire toute la structure de ce soft et ce n’est pas au programme, donc je souhaite l’améliorer et le rendre plus souple.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
Private Sub Worksheet_Change(ByVal Target As Range)
'Dim Note As Integer 'on va s'en passer, on fera directement appelle a Target.value il est la pour ça
Dim Mention As String
'On vérifie que target correspond bien a une des cellules que l'on souhaite contrôler
'Je suppose que tout les nom des élèves sont en colonne A et les note en B, ca donne donc
If Not Intersect(Target, Range("A:A")) Is Nothing Then 'rempalce le B par la colonne qui contient les notes
'B:B represente toute la colonne
'Note = Target
Select Case Target.Value
' Case "TEST": Mention = "TEST OK"
' Case "Poutre IC 40x75": Mention = "BASE DE 40"
' Case 6 To 10: Mention = "Passable"
' Case 11 To 15: Mention = "Bien"
' Case 16 To 19: Mention = "Très Bien"
' Case 20: Mention = "Excellent"
'
Case "Poutre IC 40x75": Mention = "75"
Case "Poutre IC 40x80": Mention = "80"
Case "Poutre IC 40x95": Mention = "95"
Case "Poutre IC 40x100": Mention = "100"
Case "Poutre IC 40x105": Mention = "105"
Case "Poutre IC 40x110": Mention = "110"
Case "Poutre IC 40x115": Mention = "115"
Case "Poutre IC 40x120": Mention = "120"
Case "Poutre IC 40x125": Mention = "125"
Case "Poutre IC 40x130": Mention = "130"
Case "Poutre IC 40x145": Mention = "145"
Case "Poutre IC 40x150": Mention = "150"
End Select
'Cells(Target.Row, 3) = Mention 'remplace le 3 par le numéro de colonne que tu veux
'ici on va utiliser la notion d'offset, qui permet de décaler la celui "pointé" de y lignes et de x colonne,
'y positif on descend, négatif... on remonte dans le tableau
'x >0 on va vers la droite, x<0 on va vers la gauche
'dans les 2 cas attention de ne pas sortir du tableau excel ;)
'On va également éviter de re-déclencher Change (vu que l'on modifie une cellule OnChange se déclenche
'Il ne faudra pas le faire si la modif de la cellule en colonne B doit exécuter du code dans l'événement Change
On Error Resume Next 'si une erreur survient on passe qd même a la ligne suivante, jefais ca pour eviter de rester avec EnableEvent a false
Application.EnableEvents = False 'Excel ne déclenchera plus de code événementiel
Target.Offset(0, 5).Value = Mention 'la cellule immédiatement a coté de la notre prend la valeur contenu dans Mention
Application.EnableEvents = True 'Excel recommence a gerer l'événementiel
On Error GoTo 0 ' si des erreur surviennent a partir de maintenant excel nous avertira (comme avant le resume next - c'est par défaut)
End If
End Sub |
En d'autres termes....
Ce que je veux après qu'il y ait eu les saisies dans la feuille SAISIE, c'est que dans la feuille DEVIS (qui est en quelque sorte une feuille de mise en forme devant servir à être imprimée et envoyée au client) si la colonne E trouve en colonne A la désignation Poutre IC 40x75 donc que sur la même ligne en colonne E (malgré qu'il y ait une liaison relative à la feuille de SAISIE) qu'elle prenne la main et indique la valeur 75 et non 45.4 résultant de la liaison donc la véritable hauteur de la poutre. Et cela bien sûr sans intervention manuelle.
En quelque sorte c'est une condition que je veux écrire derrière la liaison et la recopie vers le bas des liaisons.
Ouf, pas facile à expliquer comme cela... je vous joins un fichier exemple.
Merci vous serez super....
LagratteCchouette
1 pièce(s) jointe(s)
Macro évenementielle sans rupture de liaison relative
On avance.
Merci pour cette explication que je dois analyser ce soir dans le train.
En attendant je joins un fichier plus complet qui en fonction de cette solution doit certainement être modifié, car mon application se présente comme cela et le feuille SAISIE se nomme en réalité "BP1.".
Si tu as un avis je suis preneur, car ta solution est parfaite, mais est-elle souple et facilement adaptable à ma réalité ???
LagratteCchouette
" La musique donne une âme à nos cœurs et des ailes à la pensée." - Platon
Macro évenementielle sans rupture de liaison relative
Re.
Merci pour ce code qui est intégré directement dans la saise.
Apparemment cela marche bien. Je l'intègre dans mon code et je te tiens au courant.
Encore merci.... les semaines de galère me font progresser..
LagratteCchouette