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 d'évenements qui ne fonctionne pas


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut MACRO d'évenements qui ne fonctionne pas
    Bonjour,

    J’ai deux tableaux dans deux feuilles différentes mais qui ont en rapport un numéro de facture identique.
    J’essaie de mettre en place une macro en VBA, qui récupère une valeur saisie dans une cellule, si cette dernière est modifiée et recopier cette valeur dans une autre feuille en fonction du numéro de facture lié à la ligne modifié dans la 1ère feuille.

    Dans la feuille « Balance clients » j’écris le code suivant :

    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
    Public valeurCelluleModifiee As String
    Public cleRecherche As String
     
     
    Public Sub Worksheet_Change(ByVal Target As Range)
     
    Dim plageFacture As Range
     
    valeurCelluleModifiee = ""
    cleRecherche = ""
     
    ‘Définition de la plage qui est susceptible d’être modifiée
    Set plageFacture = Range("W6:W5000")
     
    ‘Si plusieurs cellules sont modifiées, ne rien faire
    If Target.Cells.Count > 1 Then
    Exit Sub
    End If
     
    ‘Si une cellule de la plage est modifiée
    If Not Application.Intersect(plageFacture, Range(Target.Address)) Is Nothing Then
     
    valeurCelluleModifiee = Target.Value	‘Récuperer la valeur saisie après modification
    cleRecherche = ActiveCell.Offset(0, -13).Value 	‘Récupérer le numéro de facture
     
     
    ‘Cette MsgBox est là juste pour vérifier si les données sont correctes durant la construction de la macro
    MsgBox "La cellule " & cleRecherche & " a été modifiée et la valeur modifiée est : " & valeurCelluleModifiee
     
    ‘Appel de la fonction de recherche et retranscription de la valeur
    Call rechercheValeur(cleRecherche, 8, valeurCelluleModifiee) 
     
    ‘Si aucune modification n’est faite, on quitte 
    Else
    Exit Sub
    End If
     
    End Sub
    Dans un module, je saisie le code ci-dessous :


    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
    Function rechercheValeur(cleATrouver As String, deplacementCellule As Integer, valeurAModifier As String)
     
    Dim plage As Range
     
    ‘Je sélectionne la feuille ou la valeur sera saisie ainsi que la plage de recherche du numéro de facture
    Application.Goto ActiveWorkbook.Sheets("Transco Factures").Range("A1:A5000")
     
     
    For Each Cell In Selection
    If Cell.Value = cleATrouver Then
     
    	‘Je me positionne à l’endroit où la valeur sera recopiée et je copie la valeur
    ActiveCell.Offset(0, deplacementCellule).Value = valeurAModifier
     
        End If
    Next Cell
     
    End Function

    Anomalies constatées :

    • Si je saisi une valeur dans une cellule de la plage « plageFacture » et que je tape « entrée » c’est le numéro de facture de la ligne en dessous qui est récupérer
    • Il ne trouve pas la facture dans la deuxième feuille « Transco Factures » et ne saisit pas la valeur saisie dans la première feuille « Balance clients »
    Pourriez vous m’aider, SVP, car je « bug » ?
    Vous en remerciant par avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    mets un point d'arrêt dès le début de ton code et fonctionne en mode pas à pas pour t'assurer que les valeurs que tu attends sont bien là
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'ai fait une rectification :

    J'ai remplacé cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cleRecherche = ActiveCell.Offset(0, -13).Value 	‘Récupérer le numéro de facture
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cleRecherche = Range(Target.Address).Offset(0, -13).Value
    de cette manière je récupère bien le numéro de facture de la ligne modifiée.

    Mais c est la deuxième fonction qui pose problème, elle n'aboutit pas du tout : Function rechercheValeur(cleATrouver As String, deplacementCellule As Integer, valeurAModifier As String)

    Elle sélectionne bien la zone de recherche mais ne retrouve pas la valeur cherchée et ne copie donc la valeur modifiée.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    OK,

    Est-ce que ta Selection est la bonne ?

    D'autre part tu repasses par ActiveCell, est-ce voulu ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.Offset(0, deplacementCellule).Value = valeurAModifier
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J’ai toujours un souci concernant cette macro. Mais cette fois-ci cela ne concerne pas la rechercheV.
    Cette fonctionnalité est OK.
    J’ai créé une macro qui permet de mettre à jour la totalité de mon tableau et je souhaiterais que pendant le travail de celle-ci, la modification liée à la macro de modification se mette en arrêt afin de ne pas les mettre en conflit.

    Malheureusement je n’y arrive pas, pourriez-vous m’aider SVP ?

    Ci-dessous le code mit dans la feuille concernée :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    Public valeurCelluleModifiee As String
    Public cleRecherche As String
    Public macroEnCours As Boolean
     
    Sub Worksheet_Change(ByVal Target As Range)
     
    Dim plageRespAffaire As Range
    Dim plageCommercial As Range
    Dim plageCommentaires As Range
    Dim plageDouteux As Range
     
    Call compteurLignes("Balance clients")
    Call compteurLignes("Transco Factures")
     
    Application.ScreenUpdating = False
     
    valeurCelluleModifiee = ""
    cleRecherche = ""
     
    Set plageRespAffaire = Worksheets("Balance clients").Range("Z6:Z" & ligneBalanceClients)
    Set plageCommercial = Worksheets("Balance clients").Range("X6:X" & ligneBalanceClients)
    Set plageCommentaires = Worksheets("Balance clients").Range("AB6:AB" & ligneBalanceClients)
    Set plageDouteux = Worksheets("Balance clients").Range("W6:W" & ligneBalanceClients)
     
    macroEnCours = True 'Cette définition de variable sert juste a faire un test de sortie
     
     
    If macroEnCours = True Then
        Exit Sub
    Else
     
        If Target.Cells.Count > 1 Then
     
            Exit Sub
     
        Else
     
            If Not Application.Intersect(plageRespAffaire, Range(Target.Address)) Is Nothing Then
                Call celluleCible(Target, "6")
            Else
                If Not Application.Intersect(plageCommercial, Range(Target.Address)) Is Nothing Then
                    Call celluleCible(Target, "9")
                Else
                    If Not Application.Intersect(plageCommentaires, Range(Target.Address)) Is Nothing Then
                        Call celluleCible(Target, "7")
                    Else
                        If Not Application.Intersect(plageDouteux, Range(Target.Address)) Is Nothing Then
     
                            Call celluleCible(Target, "8")
     
                        Else
                            Exit Sub
     
                        End If
                    End If
                End If
            End If
        End If
    End If
     
    End Sub
     
    Function celluleCible(celluleModifiée As Range, deplacementValeurCible As Long)
     
    If macroEnCours = True Then
        Exit Function
    Else
        valeurCelluleModifiee = celluleModifiée.Value
        cleRecherche = Range(celluleModifiée.Address).Offset(0, -13).Value
        MsgBox "La piéce n°" & cleRecherche & " a été modifiée et la valeur modifiée est : " & valeurCelluleModifiee
     
        Call rechercheValeur(cleRecherche, deplacementValeurCible, valeurCelluleModifiee)
     
        Application.ScreenUpdating = True
     
        Worksheets("Balance clients").Activate
        Range(celluleModifiée.Address).Activate
    End If
     
    End Function
    Ci-dessous le code mit dans un module :

    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
    Function rechercheValeur(cleATrouver As String, deplacementCellule As Integer, valeurAModifier As String)
     
    Dim Cell As Range
    Application.ScreenUpdating = False
     
     
    If macroEnCours = True Then
        Exit Function
    Else
        Application.Goto ActiveWorkbook.Sheets("Transco Factures").Range("A1:A" & ligneTranscoFactures)
     
        For Each Cell In Selection
            If Cell.Value = cleATrouver Then
                Cell.Offset(0, deplacementCellule).Value = valeurAModifier
            End If
        Next
     
    End If
    End Function

Discussions similaires

  1. Macro qui ne fonctionne pas
    Par Françoise_ dans le forum Débutez
    Réponses: 2
    Dernier message: 09/03/2013, 21h08
  2. [XL-2010] Macros complémentaire qui ne fonctionne pas
    Par little_boys dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/01/2013, 19h56
  3. Macro EXCEL - Boucle qui ne fonctionne pas
    Par babouchka01 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/10/2011, 11h24
  4. macro pour code barre qui ne fonctionne pas comme elle devrait
    Par scons dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/11/2009, 13h09
  5. macro identique qui ne fonctionne pas
    Par mindar dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 22/01/2008, 14h29

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