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 :

Melanger 2 codes VBA "private"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2018
    Messages : 28
    Par défaut Melanger 2 codes VBA "private"
    Bonjour à tous,

    Jeune débutant en VBA, je profite, il est vrai de codes existants que j'adapte à mes besoins...Jusque là en cherchant parfois bien des heures, je trouvais comment les modifier à mes besoins....
    Là, depuis 48h je sèche !

    J'essaie d'adapter 2 codes VBA, un que j'ai déjà modifié et qui fonctionne et l'autre que j'essaie d’intégrer.... Le probleme, c'est que les 2 utilisent la fonction "private" et qu'aprés bien des lectures, j'ai vu que l'on ne pouvais en avoir qu'une seule par feuille (logique d'ailleurs)

    Or je n'arrive pas à mélanger les 2....

    Quelqu'un aurais-t-il 5 min pour m'aiguiller ?

    Ce serait vraiment sympa....

    Milles mercis à ceux qui vont y passer un moment.
    Bon Week-end

    'Le premier code qui fonctionne lui !

    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
    Private Sub ToggleButton1_Click()
    ToggleButton1.Caption = IIf(ToggleButton1, "AM=PM", "AM<>PM")
    ToggleButton1.BackColor = IIf(ToggleButton1, vbGreen, vbRed)
     
     
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
     
         If Target.Count > 1 Then Exit Sub
     
         If Not Intersect(Target, Range("D5:NE5,D11:NE11,D17:NE17,D23:NE23,D29:NE29,D35:NE35,D41:NE41,D52:NE52,D58:NE58")) Is Nothing Then
            Debug.Print Target.Address
            If ToggleButton1 Then
                Target.Offset(2, 0) = Target
                Else
                Exit Sub
            End If
         End If
     
         If Not Intersect(Target, Range("D7:NE7,D13:NE13,D19:NE19,D25:NE25,D31:NE31,D37:NE37,D43:NE43,D54:NE54,D60:NE60")) Is Nothing Then
            Debug.Print Target.Address
            If ToggleButton1 Then
                Target.Offset(3, 0) = Target
                Else
                Exit Sub
            End If
         End If
     
    End Sub
    -------------------------------------------------------------------------------------------------------------------------------------------------------------
    'Le second qui ne fonctionne pas avec le précédent mais qui fonctionne seul sur un autre projet


    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 av As Variant 'déclare la varaible av (Ancienne Valeur)
    Private test As Boolean 'déclare la varaible test
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'au changement de sélection dans l'onglet
    If Application.Intersect(Target, Range("A1:AZ100")) Is Nothing Then Exit Sub 'si la cellule active ne fait pas partie de la plage A1:AZ100, sort de la procédure
    If Selection.Cells.Count > 1 Then ActiveCell.Select 'si plusieurs cellules sélectionnées, ne sélectionne que la cellule active
    av = Target.Value 'définit la variable av
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
    If Application.Intersect(Target, Range("A1:A100")) Is Nothing Then Exit Sub 'si le changement se fait ailleurs que dans la plage A1:A100 (à adapter), sort de la procédure
    If test = True Then Exit Sub 'si test est vrai, sort de la procédure
    If Target.Value = "" And av <> "" Then 'condition 1 :si la cellule est effacée et l'ancienne valeur n'est pas vide
        If MsgBox("Êtes-vous sûr(e) de vouloir effacer cette cellule ?", vbYesNo, "ATTENTION !") = vbNo Then 'condition 2 : si non au message
            test = True 'définit la variable test
            Target.Value = av 'remet l'ancienne valeur effacée
            test = False 'redéfinit la variable test
        End If 'fin de la condition 2
    End If 'fin de la condition 1
    End Sub

  2. #2
    Membre chevronné
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 214
    Par défaut
    Bonjour

    Tu peux avoir autant de fonction "private" que tu veux : ca veut juste dire qu'elles sont inutilisables en dehors du module/feuille ou elles sont déclarées
    par contre
    dans un même module (ou feuille) deux fonction ne peuvent avoir le même nom

    Peut-être (a adapter)
    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
    Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
     
        Application.EnableEvents = False 'desactiver les ?v?nements
     
     
        'Exit
        If Target.Count > 1 Then GoTo fin_sub
        If Not ToggleButton1 Then GoTo fin_sub
        If Application.Intersect(Target, Range("A1:A100")) Is Nothing Then GoTo fin_sub
        If Target.Value <> "" Or av = "" Then GoTo fin_sub
     
        'Traitement
        If Not Application.Intersect(Target, Range("A1:A100")) Then
            If MsgBox("?tes-vous s?r(e) de vouloir effacer cette cellule ?", vbYesNo, "ATTENTION !") = vbNo Then Target.Value = av
        End If
        If Not Intersect(Target, Range("D5:NE5,D11:NE11,D17:NE17,D23:NE23,D29:NE29,D35:NE35,D41:NE41,D52:NE52,D58:NE58")) Is Nothing Then
            Target.Offset(2, 0) = Target
        End If
        If Not Intersect(Target, Range("D7:NE7,D13:NE13,D19:NE19,D25:NE25,D31:NE31,D37:NE37,D43:NE43,D54:NE54,D60:NE60")) Is Nothing Then
            Target.Offset(3, 0) = Target
        End If
     
    fin_sub:
        Application.EnableEvents = True 'reactiver les ?v?nements
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2018
    Messages : 28
    Par défaut
    Grand merci pour la réponse...

    Je vais chercher, pour l'instant ça ne fonctionne toujours pas, il bloque toujours sur le second "private"....

    Merci pour la réponse en tout cas...
    Au moins, j'apprends !
    Bon Dimanche

  4. #4
    Membre chevronné
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 214
    Par défaut
    Il ne faut laisser qu'un
    Sub Worksheet_Change
    et un
    Worksheet_SelectionChange

    et il ne faut les mettre (en vba)dans une feuille, pas dans un "module"

    après sans le fichier, c'est difficile de savoir ou peut-être le problème

    Bon dimanche aussi

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