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 :

Procédure événementielle avec plusieurs variables


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 66
    Points : 37
    Points
    37
    Par défaut Procédure événementielle avec plusieurs variables
    Bonjour tout le monde,

    D'après le FAQ de Skyroad, il est possible d'utiliser le code ci dessous en utilisant une seule variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Dim i As Long
    If Sh.Name <> "Feuil1" Or Target.Address(0, 0) <> "G26" Then Exit Sub
    While Sh.Range("G26") > Worksheets("Fusible").Range("A" & i + 3)
        i = i + 1
    Wend
    Sh.Range("G27") = Worksheets("Fusible").Range("A" & i + 3)
    If Sh.Range("G26") = "" Then
         Sh.Range("G27") = ""
    End If
    End Sub

    Donc je m'étais dit que je pouvais extrapoler ce système avec un nombre indéfini de variable (par la suite, je me suis rendu compte que ce que j'avais supposé était faux)

    J'ai voulu appliquer le code suivant (pour une application differente de la première) :

    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
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
     
    Dim m As Integer, n As Integer, p As Integer
     
    If Sh.Name <> "Feuil1" Or Target.Address(0, 0) <> "G14" Then Exit Sub
    If Sh.Name <> "Feuil1" Or Target.Address(0, 0) <> "K10" Then Exit Sub
     
     
    For p = 1 To 5
        If Worksheets("Feuil1").Range("G14") = Worksheets("Feuil2").Cells(27, 1 + p) Then
            Exit For
        End If
    Next
     
    If ComboBox1.Value = Worksheets("Feuil3").Range("A2") Then
     
        For m = 1 To 5
            If Dispo.Value = Worksheets("Feuil2").Cells(12, m + 1) Then
                Exit For
            End If
        Next
        For n = 1 To 12
            If Worksheets("Feuil1").Range("G14") = Worksheets("Feuil2").Range("A" & 12 + n) Then
                Exit For
            End If
        Next
     
        Worksheets("Feuil2").Range("B2") = Worksheets("Feuil2").Cells(12 + n, m + 1) * Worksheets("Feuil2").Cells(28, 1 + p)
     
    ElseIf ComboBox1.Value = Worksheets("Feuil3").Range("A1") Then
     
        For n = 1 To 12
            If Worksheets("Feuil1").Range("G14") = Worksheets("Feuil2").Range("K" & 12 + n) Then
                Exit For
            End If
        Next
     
        Worksheets("Feuil2").Range("B2") = Worksheets("Feuil2").Range("L" & n + 12) * Worksheets("Feuil2").Cells(28, 1 + p)
     
    End If
     
    End Sub

    Problème : quand je touche soit à la cellule "G14" en "Feuil1", soit à la cellule "K10" de la "Feuil1", le code affiche un message d'erreur comme étant une "forme ambiguë".

    je voudrais savoir quelle(s) modification(s) apporter afin de gérer un résultat (ici, en "B2" de la "Feuil2") en fonction de plusieurs variables (ici, 2)

    Merci de votre attention.

    PS : si vous avez des pistes au niveau du tutoriel et/ou du FAQ, je suis preneur car j'ai cherché toute l'après midi, et je dois admettre que je sèche un peu

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Déjà, si tu mets
    If Sh.Name <> "Feuil1" Or Target.Address(0, 0) <> "G14" Then Exit Sub
    Tu ne vérifieras jamais la ligne suivante si Target <> "G14"
    If Sh.Name <> "Feuil1" Or Target.Address(0, 0) <> "K10" Then Exit Sub
    et comme target est G14 si tu arrive à cette ligne, que si tu es en G14 tu n'es pas en K10, donc tu sors.
    Bref, tu sors à tous les coups.
    Vérifie ton code et reviens nous
    Bonne soirée

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    J'ai finalement utilisé le code suivant (il n'est pas optimal, je l'admets, mais apparament, il n'a pas l'air de bugger), j'ai donc :

    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
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
    Dim m As Integer, n As Integer, p As Integer
     
    If Sh.Name <> "Feuil1" Or Target.Address(0, 0) <> "G14" Or Sh.Name <> "Feuil1" Or Target.Address(0, 0) <> "K10" Then Exit Sub
     
     
    For p = 1 To 5
        If Worksheets("Feuil1").Range("G14") = Worksheets("Feuil2").Cells(27, 1 + p) Then
            Exit For
        End If
    Next
     
    If Worksheets("Valeur").Range("B1") = Worksheets("Feuil3").Range("A2") Then
     
        For m = 1 To 5
            If Dispo.Value = Worksheets("Feuil2").Cells(12, m + 1) Then
                Exit For
            End If
        Next
        For n = 1 To 12
            If Worksheets("Feuil1").Range("G14") = Worksheets("Feuil2").Range("A" & 12 + n) Then
                Exit For
            End If
        Next
     
        Worksheets("Feuil2").Range("B2") = Worksheets("Feuil2").Cells(12 + n, m + 1) * Worksheets("Feuil2").Cells(28, 1 + p)
     
    ElseIf ComboBox1.Value = Worksheets("Feuil3").Range("A1") Then
     
        For n = 1 To 12
            If Worksheets("Feuil1").Range("G14") = Worksheets("Feuil2").Range("K" & 12 + n) Then
                Exit For
            End If
        Next
     
        Worksheets("Feuil2").Range("B2") = Worksheets("Feuil2").Range("L" & n + 12) * Worksheets("Feuil2").Cells(28, 1 + p)
     
    End If
     
    End Sub

    Comme qui dirait : la nuit porte conseil

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    A mon avis, ce serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Sh.Name <> "Feuil1" Or _
      (Sh.Name = "Feuil1" and Target.Address(0, 0) <> "G14" and Target.Address(0, 0) <> "K10") Then Exit Sub
    Mais ce n'est qu'un avis

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    C'est pas faux, j'avais oublié mes notions de logiques combinatoires

    Rappel: a.(b+c)=(a.b)+(a.c)

    Merci de me l'avoir remis en mémoire

    A plus, le temps que je tente le coup

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    euh attends, là, tu as fait :

    S=a+(\a.b.c)

    Donc

    S=(a+\a).(a+b).(a+c)

    S=(a+b).(a+c)

    Par conséquent :

    S=a+(b.c)

    Donc en principe, il y a possibilité d'optimiser

    ++

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    Finalement, je suis parvenu avec le code suivant, bonne lecture :

    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
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
    Dim m As Integer, n As Integer, p As Integer
     
    If Sh.Name <> "Feuil1" Or (Target.Address(0, 0) <> "G14" Or Sh.Name <> "Feuil1" And Target.Address(0, 0) <> "K10") Then Exit Sub
     
     
    For p = 1 To 5
        If Worksheets("Feuil1").Range("G14") = Worksheets("Feuil2").Cells(27, 1 + p) Then
            Exit For
        End If
    Next
     
    If Worksheets("Valeurs").Range("B1") = Worksheets("Feuil3").Range("A2") Then
     
        For m = 1 To 5
            If Dispo.Value = Worksheets("Feuil2").Cells(12, m + 1) Then
                Exit For
            End If
        Next
        For n = 1 To 12
            If Worksheets("Feuil1").Range("G14") = Worksheets("Feuil2").Range("A" & 12 + n) Then
                Exit For
            End If
        Next
     
        Worksheets("Feuil2").Range("B2") = Worksheets("Feuil2").Cells(12 + n, m + 1) * Worksheets("Feuil2").Cells(28, 1 + p)
     
    ElseIf Worksheets("Valeurs").Range("B1") = Worksheets("Feuil3").Range("A1") Then
     
        For n = 1 To 12
            If Worksheets("Feuil1").Range("G14") = Worksheets("Feuil2").Range("J" & 12 + n) Then
                Exit For
            End If
        Next
     
        Worksheets("Feuil2").Range("B2") = Worksheets("Feuil2").Range("K" & n + 12) * Worksheets("Feuil2").Cells(28, 1 + p)
     
    End If
     
    End Sub

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Si /a on sort
    ou
    a * (/b + /c) on sort aussi
    Si tu ne mets pas ça, /a * (b ou c) c'est pas bon
    Une solution pour simplifier ?
    /a * (a + /b + /c)) => Exit
    Je reviens à ma solution de départ
    Mais je te laisse t'amuser
    Bonne journée

    PS - Tu peux aussi essayer avec Xor

  9. #9
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Perso je verrais bien :
    1. condition principale : si on ne se trouve pas sur la feuille 1 --> "circulez, ya rien à voir" et on ne vérifie pas si les autres conditions sont remplies
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If Sh.Name <> "Feuil1" Then Exit Sub
    2. conditions secondaires :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      If Target.Address = "$G$14" Or Target.Address = "$K$10" Then
      'procédure
      End If
      End Sub

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    J'adopte !

    (bonjour fring, t'es pas marrant ! )

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    Salut,

    petite précision sur la logique combinatoire (qui ne sert pas seulement à l'électronique) :

    /a * (a + /b + /c)) => Exit
    si nous développons l'expression, nous obtenons:

    (/a*a)+(/a*/b)+(/a*/c) =>Exit

    or l'expression /a*a=1 donc :

    1+(/a*/b)+(/a*/c)=>Exit

    /mais 1+A=>A par conséquent :

    (/a*/b)+(/a*/c)=>Exit

    Donc, après factorisation :

    /a*(/b+/c)=>Exit

    Je vais te laisser cogiter sur cette réflexion (dans le pire des cas, demande à une personne spécialisée en électronique)

    A plus

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    Ta précision est fort juste, fring

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je n'ai pas à demander tu as raison. Je n'ai pas assez travaillé en classe
    merci de me rafraichir la mémoire
    Ceci dit, sachant ce que tu sais, je ne comprends pas comment tu as pu écrire ça au vu de tes connaissances
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Sh.Name <> "Feuil1" Or Target.Address(0, 0) <> "G14" Then Exit Sub
    If Sh.Name <> "Feuil1" Or Target.Address(0, 0) <> "K10" Then Exit Sub
    ...................................

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 66
    Points : 37
    Points
    37
    Par défaut
    à vrai dire, au début, je n'avais pas vraiment, d'idée. Et comme qui dirait, la nuit m'a porté conseil.

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

Discussions similaires

  1. [URL Rewriting] Problème avec plusieurs variables
    Par kwzprtt dans le forum Apache
    Réponses: 2
    Dernier message: 13/05/2008, 01h00
  2. [DEBUTANT]Procédure stockée avec plusieurs requetes
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/06/2007, 17h49
  3. UPDATE avec plusieurs variables
    Par melmouj dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/03/2007, 14h51
  4. Procédure stockée avec une variable "OUT"
    Par Cpas2latarte dans le forum SQL
    Réponses: 5
    Dernier message: 13/03/2007, 10h22
  5. Procédure stockée avec plusieurs SELECT
    Par amatollah dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/03/2006, 21h26

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