IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro Condition sans rupture de liaison


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de lagratteCchouette
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 202
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Une piste avec la démarche suivante

    1) copiez le code évènementiel suivant dans la fenêtre de code de la feuille DEVIS (j'y ai supprimé l'ancien code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Private Sub Worksheet_Calculate()
    Dim S1 As Worksheet
    Dim S2 As Worksheet
    Dim R1 As Range
    Dim R2 As Range
    Dim var1
    Dim var2
    Dim i&
    Dim j&
    Set S1 = Sheets("BD")
    Set R1 = S1.[a1].CurrentRegion
    var1 = R1
    Set S2 = Sheets("DEVIS")
    Set R2 = S2.[a1].CurrentRegion
    var2 = R2
    Application.EnableEvents = False
    On Error GoTo Erreur
    For i& = 2 To UBound(var2, 1)
      For j& = 2 To UBound(var1, 1)
        If Trim(LCase(var2(i&, 1))) = Trim(LCase(var1(j&, 1))) Then
          S2.Range(S2.Cells(i&, 5), S2.Cells(i&, 5)) = var1(j&, 4)
          Exit For
        End If
      Next j&
    Next i&
    Erreur:
    Application.EnableEvents = True
    End Sub
    2) pour les #N/A, utilisez le type de formule suivant
    =SI(ESTNA(RECHERCHEV(A2;BD_poutre_ic_matriceRechercheV;3;0)&"");"";(RECHERCHEV(A2;BD_poutre_ic_matriceRechercheV;3;0)&""))
    3) pour masquer les 0 dans la plage A2:B13 de la feuille DEVIS
    sélectionnez la plage A2:B13 et faites menu Format/Cellule…/Nombre/Catégorie Personnalisée et dans Type tapez 0;;


    Pour plus de facilité, téléchargez l'exemple ci-joint.

    Cordialement.

    PMO
    Patrick Morange

  3. #3
    Membre éclairé Avatar de casavba
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 464
    Par défaut
    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)
    Bon pour te répondre parce que ce que t'as écrit là, est vraiment paradoxal:

    Ton problème ne réside pas dans la feuille Devis mais dans la feuille Saisie.
    Puisque la feuille Devis ne reprend que les données de la feuille Saisie.

    Pour être bref, l'erreur provient de la formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =RECHERCHEV(A3;BD_poutre_ic_matriceRechercheV;5;0)&""
    qui est dans la colonne E de la feuille saisie.

    Il te suffit de modifier cette formule pour prendre la vraie valeur Hauteur qui 75 dans ton exemple et non 45,5.
    Ainsi, tu regardes la feuille BD, tu concluras qu'il faut écrire la formule comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =RECHERCHEV(A3;BD_poutre_ic_matriceRechercheV;4;0)&""
    Il faut récupérer la valeur qui est dans la colonne 4 --> Hauteur

    Ta macro vient faire quoi ici ????

    Bonne journée

  4. #4
    Membre confirmé Avatar de lagratteCchouette
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 202
    Par défaut Macro condition
    Bonjour et merci pour vos pistes.


    Pour PMO2017 cela marche effectivement super bien, mais tu peux m'expliquer ce que fait ce code et comment je peux faire référence dans ce code à une autre région ?

    Svp...


    Pour casavba

    Je suis obligé dans la feuille SAISIE de faire apparaître le volume réel de la poutre pour le calcul du prix de revient et le chiffrage.

    mais par contre dans la feuille DEVIS d'écrire la macro car toutes les celulles liées dans cette feuille n'ont pas forcément besoin de conversion.

    Exemple :

    SAISIE DEVIS
    ligne 1 : Poteau R 50 x 50 => 50 X 50

    ligne 4 Poutre IC 40x75 => je souhaite 40 x 75

    Designtion Type Largeur Hauteur
    Poteau R 50x50 0 50 x 50
    Poteau R 50x50 0 50 x 50
    Poteau RH 50x50 0 50 x 50
    Poutre IC 40x75
    0 40 x 45,4

    Je ne sais si c'est très facile à comprendre. Sans cela je repost un fichier plus détaillé.

    LagratteCchouette

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Pour PMO2017 cela marche effectivement super bien, mais tu peux m'expliquer ce que fait ce code et comment je peux faire référence dans ce code à une autre région ?

    Svp...
    En espérant que cela va vous éclairer, j'ai ajouté quelques commentaires au code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Private Sub Worksheet_Calculate()
    Dim S1 As Worksheet
    Dim S2 As Worksheet
    Dim R1 As Range
    Dim R2 As Range
    Dim var1 As Variant
    Dim var2 As Variant
    Dim i&
    Dim j&
     
    '### D'après votre exemple, la 1ère cellule de chaque feuille est A1 ###
        '°°° Feuille BD °°°
    Set S1 = Sheets("BD")
    '--- La plage contiguë à la cellule A1 soit A1:F25 dans l'exemple ---
    Set R1 = S1.[a1].CurrentRegion
    '--- On monte le contenu de la plage en mémoire dans un variant (tableau Basic var1) ---
    var1 = R1
     
        '°°° Feuille DEVIS °°°
    Set S2 = Sheets("DEVIS")
    '--- La plage contiguë à la cellule A1 soit A1:G13 dans l'exemple ---
    Set R2 = S2.[a1].CurrentRegion
    '--- On monte le contenu de la plage en mémoire dans un variant (tableau Basic var2) ---
    var2 = R2
    '####################################################################
     
    Application.EnableEvents = False
    On Error GoTo Erreur
    '--- Pour toutes les lignes du tableau var2 ---
    For i& = 2 To UBound(var2, 1)
      '--- Pour toutes les lignes du tableau var1 ---
      For j& = 2 To UBound(var1, 1)
        '--- Si les éléments en colonne 1 (soit "A") de chaque tableau concordent alors
        If Trim(LCase(var2(i&, 1))) = Trim(LCase(var1(j&, 1))) Then
          '--- on renseigne (dans DEVIS) la cellule ligne i , colonne 5 (soit "E")
          '--- par (dans BD) l'élément var1 ligne j , colonne 4 ("D")
          S2.Range(S2.Cells(i&, 5), S2.Cells(i&, 5)) = var1(j&, 4)  'c'est ici qu'on peut adapter les N° de colonnes
          '--- et on sort de la boucle
          Exit For
        End If
      Next j&
    '--- on continue pour les autres lignes du tableau var2
    Next i&
    Erreur:
    Application.EnableEvents = True
    End Sub
    Cordialement.

    PMO
    Patrick Morange

  6. #6
    Membre confirmé Avatar de lagratteCchouette
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 202
    Par défaut 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
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Créer des listes avec conditions sans macro
    Par tioch dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 26/07/2011, 15h14
  2. Macro événementielle sans rupture de liaison
    Par lagratteCchouette dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/06/2009, 14h47
  3. Inhiber la macro AutoExec sans shift
    Par manoun1 dans le forum Access
    Réponses: 8
    Dernier message: 27/06/2006, 14h45
  4. [Reports6] Etat sans rupture
    Par lafouine dans le forum Reports
    Réponses: 2
    Dernier message: 02/03/2006, 15h20
  5. [EXCEL] copier une feuille sans changer les liaisons
    Par DidRocks dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/09/2005, 13h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo