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 :

Probleme activation VBA [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Par défaut Probleme activation VBA
    Bonjour à tous

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Left(Range("B2"), 7) = "3661384" Then Range("a2").Value = Range("A2").Value - 1
    La ca sélectionne la cellule B2, mais je désirerais que cela ce fasse sur la cellule qui est active et que la macro s'exécute automatiquement, car a chaque fois je suis obligé d' exécuter la macro.

    Merci par avance pour votre patience

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Il faut peut-être préciser la plage pour laquelle tu veux que la macro soit active, sinon, il va faire cela pour chaque cellule de la feuille, et il faut au moins déterminer que tu es au moins en colonne B, puisque tu tentes de modifier la cellule à gauche de celle qui est modifiée.

    Si j'ai bien compris l'énoncé , tu souhaites décrémenter la cellule à gauche d'une cellule dans laquelle on saisit 3661384

    Voici un code qui fait cela, pour une cellule de B1:B10. A toi d'adapter la plage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
        On Error GoTo Fin
     
        If Not Intersect(Target, Range("B1:B10")) Is Nothing And Target.Cells.Count = 1 Then
            If Target.Value = 3661384 Then
                Application.EnableEvents = False
                Target(1, 0).Value = Target(1, 0).Value - 1
            End If
        End If
     
    Fin:
        Application.EnableEvents = True
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    ta question reste vague, une proposition à la devinette
    sur changement d'une cellule de la colonne B, la cellule de la colonne A est décrémenté de 1 si la cellule B="3661384*"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Or Intersect(Target, Columns("B:B")) Is Nothing Then Exit Sub
    If Left(Target, 7) = "3661384" Then Target.Offset(0, -1).Value = Target.Offset(0, -1).Value - 1
    End Sub
    Edit, Désolé pas rafraichi

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Par défaut
    Bonsoir et merci pour les réponses

    J'ai du mal m'exprimer, ce que je cherche c'est quand je scanne avec une douchette code barre que dans la cellule B2 le code commence par " 3661384 ", alors cellule A2 -1 par exemple, j'ai fait ça comme code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Macro1()
    If Left(Range("B2"), 7) = "3661384" Then Range("a2").Value = Range("a2").Value - 1 
    End Sub
    ca fonctionne, mais je dois activer la macro à chaque fois et cela active une autre cellule , logique, si je scanne toujours dans la colonne B un autre code " 1234567" et bien -1 dans A4 par exemple

    Merci pour votre bon vouloir, car je ne suis pas tres doué en VBA

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    la logique des codes cités ci haut:

    si la valeur d'une cellule se trouvant sur la colonne B change, alors, la cellule juste à côté de la colonne A est décrémentée de 1 (si la nouvelle valeur de B commence par 3661384)

    les codes sont écrits dans l'évènement de la feuille Worksheet_Change

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Merci pour votre bon vouloir, car je ne suis pas tres doué en VBA
    Heu, avec une pointe d'ironie amicale, crois-le bien, mais on est vendredi soir...

    Je trouve que tu n'es pas très doué pour expliquer ce que tu souhaites réaliser...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Par défaut
    merci
    J'ai juste modifie car je veux que se soit dans une cellule fixe A2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Or Intersect(Target, Columns("B:B")) Is Nothing Then Exit Sub
    If Left(Target, 7) = "3661384" Then range("a2").Value = range("a2").Value - 1
    End Sub

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Je n'ai pas compris ceci:
    ca fonctionne, mais je dois activer la macro à chaque fois et cela active une autre cellule , logique, si je scanne toujours dans la colonne B un autre code " 1234567" et bien -1 dans A4 par exemple
    Finalement, Où scannes-tu et que veux-tu qu'il se passe lorsque tu scannes, et en fonction de quels critères décides-tu que ce que tu scannes diminue la cellule de gauche de 1 unité?

    Sans cette mise au point de ta part, on va tourner encore longtemps en rond...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Par défaut re
    Bonjour à tous

    Voila ce que j'ai fais grace à vous, mais le soucis c'est que cela fonctionne pour une colonne mais pas pour les autres,

    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
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Target.Cells.Count > 1 Or Intersect(Target, Columns(1)) Is Nothing Then Exit Sub
    If Left(Target, 5) = "36613" Then Sheets("StockBox").Range("b2").Value = Sheets("StockBox").Range("b2").Value - 1
     
     
    If Target.Cells.Count > 1 Or Intersect(Target, Columns(2)) Is Nothing Then Exit Sub
    If Left(Target, 5) = "12345" Then Sheets("StockBox").Range("c2").Value = Sheets("StockBox").Range("c2").Value - 1
     
     
    If Target.Cells.Count > 1 Or Intersect(Target, Columns(3)) Is Nothing Then Exit Sub
    If Left(Target, 5) = "67890" Then Sheets("StockBox").Range("d2").Value = Sheets("StockBox").Range("d2").Value - 1
     
     
    End Sub
    A+

  10. #10
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Des question, de quelles colonnes tu veux généraliser ce code et dans quelles feuilles?
    ta feuille Sheets("StockBox") est la même que ta feuille où le changement de données de la colonne B?
    Enfin ton code est à optimiser comme ceci en attendant de le généraliser
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Kod As String
    Dim col As Integer
     
    If Target.Cells.Count > 1 Or Intersect(Target, Columns("A:C")) Is Nothing Then Exit Sub
     
    Kod = Left(Target, 5)
    MsgBox Kod
    col = Target.Column
    MsgBox col
    With Sheets("StockBox")
        If Kod = "36613" And col = 1 Then
            .Range("b2").Value = .Range("b2").Value - 1
        ElseIf Kod = "12345" And col = 2 Then
            .Range("c2").Value = .Range("c2").Value - 1
        ElseIf Kod = "67890" And col = 3 Then
            .Range("d2").Value = .Range("d2").Value - 1
        End If
    End With
    End Sub
    Si ce n'est déjà généralisé

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Par défaut re
    Re

    Et merci pour les réponses rapide et efficace.

    Voila mon classeur:
    3 Feuilles StockBox, EntréeBox et SortieBox
    7 colonnes de produit par feuille.

    Je scanne code barre Box dans entrée ou sortie suivant le cas et cela ajoute ou enleve dans Stockbox le produit correspondant au debut du code barre qui sont toujours les meme suivant le materiel.

    Comme ça dans les 2 autres feuilles il me reste juste les codes barres et au passage puisque tu m'as l'air d'etre tres doue pour le VBA, je voudrait faire en sorte que à la fin du mois par exemple une macro fasse la différence entre les feuilles entrée et sortie et qu'il me reste que les produits qui reste (code barre evidemment).

    Je ne suis pas trop doué, car j'ai du mal à comprendre à quoi correspond les variables, tous qui est reseau serveur pas de soucis mais ça je n'ai jamais appris et quand on me fourni des codes il n'y a pas d'explication en clair et les livres pas trop explicite, si tu en connais un sur le VBA en général très clair je suis preneur pour le titre

    Voila ce que j'ai fais au passage et ca fonctionne, pour l'instant que 3 colonnes le reste va arriver:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Or Intersect(Target, Columns("a:d")) Is Nothing Then Exit Sub
    If Left(Target, 5) = "36613" Then Sheets("StockBox").Range("b2").Value = Sheets("StockBox").Range("b2").Value + 1
     
    If Target.Cells.Count > 1 Or Intersect(Target, Columns("b:d")) Is Nothing Then Exit Sub
    If Left(Target, 5) = "12345" Then Sheets("StockBox").Range("c2").Value = Sheets("StockBox").Range("c2").Value + 1
     
    If Target.Cells.Count > 1 Or Intersect(Target, Columns("c:d")) Is Nothing Then Exit Sub
    If Left(Target, 5) = "67890" Then Sheets("StockBox").Range("d2").Value = Sheets("StockBox").Range("d2").Value + 1
    End Sub
    Merci mercatog

  12. #12
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Un petit fichier exemple joint vaut mieux que des explications vagues.
    tu m'as l'air d'etre tres doue pour le VBA: PAS DU TOUT

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Par défaut
    re

    ci joint l'ebauche
    Fichiers attachés Fichiers attachés

  14. #14
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Voilà ma proposition
    dans un module public j'ai adapté la procédure précédente comme ceci
    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
    Option Explicit
    Public Sub EntreeSortie(ByRef rng As Range, Op As Integer)  'pour simplifier Op=-1 si sortie, Op=1 si entrée
    Dim col As Integer
    Dim kod As String
     
    col = rng.Column                            'N° colonne
    kod = Left(rng, 5)                          'Code article
    With Sheets("StockBox")
        If col = 1 And kod = "36613" Then
            .Range("B2").Value = .Range("B2").Value + Op
        ElseIf col = 2 And kod = "12345" Then
            .Range("C2").Value = .Range("C2").Value + Op
        ElseIf col = 3 And kod = "67890" Then
            .Range("D2").Value = .Range("D2").Value + Op
        ElseIf col = 4 And kod = "00000" Then               'Tu mets le code pour LiveBox
            .Range("E2").Value = .Range("E2").Value + Op
        ElseIf col = 5 And kod = "11111" Then               'Tu mets le code pour Décod81
            .Range("F2").Value = .Range("F2").Value + Op
        ElseIf col = 6 And kod = "22222" Then               'Tu mets le code pour Décod82
            .Range("G2").Value = .Range("G2").Value + Op
        ElseIf col = 7 And kod = "33333" Then               'Tu mets le code pour Décod91
            .Range("H2").Value = .Range("H2").Value + Op
        End If
    End With
    End Sub
    Ensuite dans le code de la feuille SORTIEBOX ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Target.Cells.Count > 1 Or Intersect(Target, Columns("A:G")) Is Nothing Then Exit Sub
    EntreeSortie Target, -1
    End Sub
    et dans la feuille EntreeBox ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Target.Cells.Count > 1 Or Intersect(Target, Columns("A:G")) Is Nothing Then Exit Sub
    EntreeSortie Target, 1
    End Sub

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Par défaut Epaté
    Re

    Je vais tester, mais la ca m'épate le boulot que tu as produit. Moi une ligne c'est une journée.

    Merci

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

Discussions similaires

  1. [XL-2003] probleme activé VBA
    Par Roman76 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/05/2013, 11h22
  2. [VBA-E]Probleme macro VBA excel 2000 2003
    Par skichatchat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2007, 22h16
  3. Probleme Langage VBA
    Par nassu dans le forum Access
    Réponses: 21
    Dernier message: 20/05/2006, 10h53
  4. Probleme code vba
    Par alex38 dans le forum Access
    Réponses: 6
    Dernier message: 18/04/2006, 13h10
  5. probleme code vba ne s'execute pas apres instruction sql
    Par arnogef dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 29/12/2005, 13h34

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