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 :

Question sur la portée d'une Procédure en Public [XL-2007]


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
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 12
    Par défaut Question sur la portée d'une Procédure en Public
    Bonjour ,

    Je travaille actuellement sur une macro qui se décompose en 3 étapes .

    La première partie de mon code s'éxécute à l'ouverture du classeur (ThisWorkbookOpen).

    Ensuite j'ai placé la suite de mon code dans la fonction Sub Worksheet_Calculate d'une de mes feuilles . J'aimerais pouvoir par la suite exécuter ce code en appuyant sur F9 comme j'ai pu le voir , en désactivant le calcul automatique des feuilles . Malheureusement cela ne marche pas pour l'instant ...

    Mon second soucis c'est que dans ce 2nd code j'ai besoin d'e la valeur d'une variable calculé dans à l'ouverture du classeur dans ThisWorkbookOpen . Je ne sais pas quel serait la maniere la plus propre d'abordé ce probleme.

    J'ai décidé alors de créer deux fonctions en public :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public Sub setMyVariable(ByVal Int_Var As Integer)   'Write
        MyVariable = Int_Var
    End Sub
     
    Public Function getMyVariable() As Integer     'Read
        getMyVariable = MyVariable
    End Function
    Le soucis c'est que lorsque j'essaye d'utiliser la fonction setMyvariable à l'ouverture il ne semble pas reconnaitre la fonction malgré quelle soit en Public .

    En Espérant avoir été assez clair

    Merci d'avance pour votre aide

    Leiam

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    tu confond la portée d'une procédure et la portée d'une variable je pense

    dans un module standard, tu mets ça tout en haut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public MyVariable as Integer

    dans ton Workbook_Open, un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Workbook_Open()
     
    MyVariable = 4
     
    End Sub

    Pour ton premier problème, peut-on voir tes 2 procédures ? Afin de comprendre les actions effectuées

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Comme l'a mentionné Joe,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public Sub setMyVariable(ByVal Int_Var As Integer)   
    Public Function getMyVariable() As Integer
    ne présente aucun intérêt car seule la variable MyVariable si elle est déclarée en public est digne d'intérêt et vue quelle est défini public accessible de tout le projet sens passer par des méthodes!

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 12
    Par défaut
    Merci Joe.LeVrai pour ta réponse,

    Je ne souhaite pas dans la mesure du possible utiliser de variables globales , Je pensais que mes 2 fonctions déclarés en Public pouvait etre appellé depuis n'importe quels modules ou classeurs .

    dans mon Private Sub Workbook_Open() j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Option Explicit
    Private Sub Workbook_Open()
     
    Dim var_to_save As Integer
     
    'Var_to_save me renvoie le nombre de ligne rempli dans mon classeur 
     
    'mettre à jour la variable MyVariable qui est en Private en entete de Worksheet_calculate
    Call setMyVariable(var_to_save)
    En parrallèlle j'ai mis dans le Sub Worksheet_open

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Option Explicit
    Private MyVariable As Integer
     
    Public Sub setMyVariable(ByVal Int_Var As Integer)   'Write
        MyVariable = Int_Var
    End Sub
     
    Public Function getMyVariable() As Integer     'Read
        getMyVariable = MyVariable
    End Function
    Il me manque peut etre quelque chose pour pouvoir utiliser ces fonctions ou bien il n'est possible de le faire qu'entre 2 modules et non deux objets Excel ?

    Pour l'autre probleme:
    Le code se trouvant dans le Workbook_calculate peux s'éxécuter manuellement ce qui permet d'écarter une erreur dans le code . Mais lorsque j'appuie sur F9 rien ne se produit ... Je ne veux pas passer par un bouton pour lancer ce bout de code . J'aimerais beaucoup pouvoir utiliser le recalcul de la feuille .

    Merci de l'aide

    Leiam

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Je ne comprend décidément pas ce qui te rebute dans la déclaration d'une variable globale :

    ton Set est là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Option Explicit
    Private Sub Workbook_Open()
     
    ' tu n'est pas précis sur ta formulation, je ne sais pas si c'est le nombre de lignes d'une feuille
    ' ou l'addition des lignes remplies de chaque feuille
    MaVar = "Mon nombre de lignes remplies dans le classeur"
    ton Read est accessible n'importe où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sub Toto()
    MsgBox MaVar
    Tu n'as plus besoin d'appeler tes procédures Set et Get au sein de ton projet
    Tu peux même OverWrite ou Erase ta variable quand bon te semble : dans une procédure évènementielle ou non

    Quand je parlais de voir tes deux procédures ... c'était le workbook_open et le worksheet_calculate (cette dernière nous est toujours inconnue)
    Il serait également de bon aloi de nous contextualiser la chose, on a aucune vision d'ensemble de ce que tu fais de cette variable, et de la raison d'être de ta procédure Calculate

  6. #6
    Invité
    Invité(e)
    Par défaut
    tu as le choix entre le possible et l'impossible, prends une pièce de monnaie si ça te semble utile!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private MyVariable As Integer
    Public Property Let setMyVariable(Value As Integer)
        MyVariable = Value
    End Property
    Public Property Get getMyVariable() As Integer
        getMyVariable = MyVariable
    End Property
     
    Sub test()
    setMyVariable = 10
    a = getMyVariable
    End Sub
    mais là on frise le ridicule!
    Dernière modification par Invité ; 21/07/2015 à 14h12.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 12
    Par défaut
    Désolé pour le manque de précision voici a quoi ressemble le Workbook_open

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    Option Explicit
     
    Const ColSignals As String = "C" 'First variant column in Boxes Sheet
    Const ColVar1 As String = "G" 'First variant column in Boxes Sheet
    Const ColVar2 As String = "P" 
    Const ColBox  As String = "K" 
    Const ColInv  As String = "D" 
    Const ColPol1  As String = "D" 
    Const ColPol2  As String = "L" 
    Const ColBoxName As String = "A"
    Const ColSupp As String = "M" 
    Const ColPin        As String = "I" 
    Const ColConnec  As String = "H" 
    Public k As Integer
     
     
     Private Sub Workbook_Open()
     
    'Declarations
        Dim i, j, BoxIndexRow As Integer
        Dim r, r1 As Range
        Dim BoxesAvailableTable(21)
        Dim ColVar As Byte
        Dim Boxname
        Dim ColVarAscii
        Dim YesNo(2) As String
        Dim BoxNbr
        Dim PinNumber
     
    '-------------
    'Declaration en dur de la table BoxAvailable
    '-------------
     
        ThisWorkbook.Sheets("BLABLA").Activate
        With Sheets("BLABLA")
        j = 0
        For Each r In Columns(ColBox).Cells
            If r.Row > 2 Then
                If IsEmpty(r.Value) Then
                    If r.Row = 2 Then
     
                        MsgBox ("Configuration of Boxes is empty")
                        Exit For
                    Else
     
                        Exit For
                    End If
                Else
     
                    j = j + 1
                End If
            End If
        Next
     
     
            k = 0
        For Each r In .Columns("A").Cells
            If r.Row > 2 Then
                If IsEmpty(r.Value) Then
                    If r.Row = 3 Then
     
                        MsgBox ("Configuration of Signals is empty")
                        Exit For
                    Else
     
                        Exit For
                    End If
                Else
     
                    k = k + 1
                End If
            End If
        Next
     
       ' k contient le nombre de resource que l'utilisateur a entré 
        End With
     
                ReDim BoxesTable(j - 1)
                BoxIndexRow = 2
     
     
                For i = 0 To (j - 1)
                    BoxesTable(i) = Range("A" & BoxIndexRow).Value
                    BoxIndexRow = BoxIndexRow + 1
                Next
     
        '----------------------------------------------------------------------------------------
     
         With Sheets("BLABLA")
     
            YesNo(0) = "HS"
            YesNo(1) = "LS"
            YesNo(2) = "NA"
     
            For Each r In .Columns(ColPol2).Cells
                If (r.Row > 2) Then
                    If IsEmpty(r.Offset(0, -11).Value) Then Exit For
                        With r.Validation
                            .Delete
                            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(YesNo, ",")
                            .InputMessage = "Must be in the joined list"
                        End With
                End If
            Next
        End With
     
     
        With Sheets("BLABLA")
     
     
            For Each r In Sheets("BLABLA").Columns(ColBox).Cells
                If (r.Row > 2) Then
                    If (IsEmpty(r.Offset(0, -10).Value)) Then Exit For
     
                        With r.Validation
                            .Delete
                            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(BoxesAvailableTable, ",")
                            .InputMessage = "Must be in the joined list"
                        End With
                End If
            Next
     
     
        '----
     
            YesNo(0) = "X"
            YesNo(1) = "NOT USED"
     
            For Each r In Sheets("BLABLA").Columns(ColVar2).Cells
                If (r.Row > 2) Then
                    If IsEmpty(r.Offset(0, -15).Value) Then Exit For
                        For i = 0 To 32
                            With r.Offset(0, i).Validation
                                .Delete
                                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(YesNo, ",")
                                .InputMessage = "Must be in the joined list"
                            End With
                        Next i
                    End If
            Next
        End With
     
    End Sub

    En gros J'ai un nombre X de ressources entré par l'utilisateur dans la colonne A . Je calcule le nombre de ressources en premier lieu puis je propose des listes de choix à l'ouverture .


    Dans le Worksheet_calculate je veux également faire une liste de choix mais cette liste contient les données que l'utilisateur à entrer c'est pourquoi je souhaite créer cette liste sur le recalcul de la feuille .

    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
     
    Private Sub Worksheet_Calculate()
     
    Dim r As Range
    Dim i, k, BoxIndexRow As Integer
    Dim SignalsTable() As String
     
     
        With Sheets("BLABLA")
     
     
               ' k is the needed table size
               If IsEmpty(k) Then Exit Sub 'Malgré que k soit déclaré en public dans le premier sub il est vide à présent .
     
                ReDim SignalsTable(k - 1)
                BoxIndexRow = 3
     
     
     
            ' Fill SignalsTable with boxes names
                For i = 0 To (k - 1)
                    SignalsTable(i) = .Range("A" & BoxIndexRow).Value
                    BoxIndexRow = BoxIndexRow + 1
                Next
     
           For Each r In .Columns("M").Cells
               If (r.Row > 2) Then
                   If IsEmpty(r.Offset(0, -12).Value) Then Exit For
                       With r.Validation
                            .Delete
                            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(SignalsTable, ",")
                            .InputMessage = "Must be in the joined list"
                            .IgnoreBlank = True
                            .InCellDropdown = True
                            .ShowInput = True
                            .ShowError = True
     
                        End With
               End If
            Next
            MsgBox ("F9 Event")
     
    End With
    End Sub
    J'ai mis comme conseiller k en global mais je me retrouve avec la variable k vide lorsque j'execute le code ci dessus .

    J'ai mis un MSGBOX pour m'assurer de l'execution du code c'est ce qui me permet de dire que le F9/MajF9 ne fonctionne pas .

    Merci pour votre aide

  8. #8
    Membre expérimenté Avatar de Denis la Malice
    Homme Profil pro
    FabManager
    Inscrit en
    Février 2013
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : FabManager
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 133
    Par défaut Excel économise ses forces de calcul
    Bonjour,
    Excel gère les dépendances entre les cellules. Si une cellule contient la somme de 2 autres cellules, alors il y a recalcul quand une des 2 cellules est modifiée. Sinon, ça ne sert à rien de refaire le calcul. Pratiquement toutes les formules donnent le même résultat si les paramètres sont identiques.

    Si ton mode de calcul n'est pas automatique, alors il faut faire F9 pour lancer le calcul. Mais même dans ce cas, Excel ne recalcule pas les fonctions dont les paramètres n'ont pas changé.

    Si tu veux tester ta touche F9, ajoute dans une cellule quelconque de ta feuille une formule dont le résultat est différent même si aucun paramètre n'a changé. Par exemple :
    Et ton Msgbox apparaitra à chaque F9. Et à chaque modification sur la feuille.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 12
    Par défaut
    Bonjour ,

    Je reviens vers vous aujourd'hui car j'ai ajouté le raccourci ctrl+m à mon module comme conseillé mais lorsque j'essaye de lancer ma macro à l'aide du raccourci toujours rien . Y a t il un parametrage d'Excel qui m'empêcherais de pouvoir utiliser les raccourcis ?

    Bonne Aprem

    Leiam

  10. #10
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Je voudrais attiré l'attention sur la dangerosité des macros appelé par un raccourcis clavier.

    Lorsque l'on utilise un raccourcis clavier c'est la macro qui a la priorité !

    Imaginons que je crée une macro qui supprime le contenu du classeur et que je lui affecte le raccourcis [Ctrl]+[S].

    L'utilisateur lui a l'habitude d'utiliser la fonction [Ctrl]+[S] défini par défaut par Windows a savoir sauvegarder ... Vous voyer le problème ???

    Il va perdre le contenu de son classeur et ne pourra pas utiliser [Ctrl]+[Z] pour annuler car cela ne marche pas. Si par malheur on a affecter la sortie avec sauvegarde, il lui reste ses yeux pour pleurer et sa voix pour vous crier dessus !!!!!

    donc perso je deteste les raccourcis clavier affecter aux macros et je préfére de très loin les boutons

    Bonne soirée

    A+

  11. #11
    Membre expérimenté Avatar de Denis la Malice
    Homme Profil pro
    FabManager
    Inscrit en
    Février 2013
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : FabManager
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 133
    Par défaut
    Si le raccourci ne lance pas la macro, c'est peut-être parce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.EnableEvents = False

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 12
    Par défaut
    Bonjour ,

    Je n'ai finalement pas réussi à faire fonctionner le raccourci clavier lié à un module ni le calculate_sheet .
    Je me suis rabattu sur le worksheet_change en utilisant le target en parametre pour ciblé la colonne sur laquelle les changements devront .Le désavantage est que le code se lance à chaque changement mais étant donné le temps d'éxécution plutot court ce n'est pas dérangeant.

    Merci pour l'aide

    Résolu

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Ensuite j'ai placé la suite de mon code dans la fonction Sub Worksheet_Calculate d'une de mes feuilles . J'aimerais pouvoir par la suite exécuter ce code en appuyant sur F9 comme j'ai pu le voir
    Je crois que là aussi tu mélanges 2 choses.
    .Calculate recalcule les formules sur une feuille si un de leur argument a changé et donc nécessite ce recalcul.
    En aucun cas il ne lance une macro.

    Si tu veux la lancer avec F9 appelle-là dans Private Sub Worksheet_Calculate(), mais il faut absolument une fonction volatile présente sur ta feuille pour que cet événement ait lieu à chaque fois.
    Si tu as déjà une fonction comme Alea(), Maintenant(), Aujourdhui(), decaler(), Cellule(), Indirect() ou Info() c'est bon, sinon tu ajoutes un =Alea() dans un coin et ta macro sera appelée sur F9
    Mais bon, faut pas oublier de faire F9... Doubler sur activate ou deactivate c'est plus sûr.

    eric

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

Discussions similaires

  1. petite question sur la récupération d'une variable
    Par minusette dans le forum Langage
    Réponses: 6
    Dernier message: 17/11/2005, 16h57
  2. [FLASH 8] Question sur la portée des objets.
    Par i_shinji dans le forum Flash
    Réponses: 1
    Dernier message: 02/11/2005, 17h18
  3. Question sur la création d'une table
    Par air dans le forum Oracle
    Réponses: 4
    Dernier message: 23/10/2005, 12h46
  4. Réponses: 5
    Dernier message: 13/10/2005, 12h46
  5. question sur la creation d'une base
    Par vbcasimir dans le forum Débuter
    Réponses: 4
    Dernier message: 27/05/2005, 11h17

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