Variable publique ? Syntaxe ?

Bonjour à tous,

J'ai vu le lien de Math concernant les variables mais un point reste pour moi dans l'ombre :

J'ai un module principal qui appelle par Call un module secondaire qui ramène ensuite au module principal. Jusque là : banal.

Que fait le module secondaire que j'appelle "Timing" ? : Afficher une barre d'avancement du travail très simpliste : à chaque fois qu'on passe dans ce module secondaire, on noircit la case qui suit la dernière à avoir été noircie sur une ligne pré fixée.

Donc : Dans le module principal je déclare une variable "posit" qui doit être visible du module principal et du module secondaire "Timing"

Dans le module principal je lui affecte la valeur de départ 14 (par exemple) correspondant à la première colonne de ma barre de progression.

Dans le module secondaire, je fais + 1 dans posit avant de noircir la cellule correspondante.

Quelle est la syntaxe de la déclaration de variable dans le module principal et éventuellement du Call ?

bonne annee

Bonjour,

Pourrais-tu joindre un extrait de ton fichier ? Ce serait plus simple pour pouvoir te donner la solution à ton problème.

Merci

Bonjour readi,

Ci joint le module "Timing"

Ne sois pas trop sévère sur la syntaxe et l'ergonomie . . . je débute !

Ma question est :

J'initialise "posit" au début du module principal à la colonne de départ choisie pour ma barre de progession qui se trouve en Feuille "Timing" C15:BZ17 soit : colonne 14. Ensuite je ne passe plus jamais par là.

Puis, le module "Timing" est appelé par le module principal à des moments spécifiques du traitement, avec un "Call Timing"

A chaque passage dans le module "Timing" "posit" doit progresser de 1

Est-ce suffisamment clair ?

https://www.excel-pratique.com/~files/doc2/Module_Timing.doc

Bonjour,

Ne t'inquiète pas, je ne suis pas sévère. Ce n'est pas mon but.

Voici une solution.

La déclaration de ta variable "posit" doit se faire à l'extérieur de la procédure "Timing".

Option Explicit

Dim posit As Byte

Sub Timing()
'
' Timing Macro
' Macro enregistrée le 01/06/2009 par utilisateur
'
'
    Dim lglig As Long

    Application.ScreenUpdating = True
'
'   ***********************
    Sheets("Timing").Select
'   ***********************
'
    posit = posit + 1

    For lglig = 15 To 17
        Cells(lglig, posit).Select
        With Selection.Interior
            Select Case lglig
                Case 15, 17: .ColorIndex = 41
                Case 16: .ColorIndex = 42
            End Select
            .Pattern = xlSolid
            .PatternColorIndex = xlAutomatic
        End With
    Next lglig
'
    Application.ScreenUpdating = False
'
End Sub

bonjour pelierin98,

pour ta déclaration de variable, place ceci dans la première ligne de ton module principale :

Public posit As Integer

ensuite t'es pas obliger d'appeler la procedure Timing avec "call", tu peux seulement écrire le nom de la macro.

Merci readi et Math,

Pour l'instant, je plante !

Avec conseils readi :

1) super pour la réduction des instructions : c'est plus joli et plus court !

2) je ne peux pas écrire

Option Explicit

Dim posit As Byte

à l'extérieur (avant ?) la procédure "Timing", l'éditeur tire un trait après ces 2 lignes, les séparant ainsi de la procédure "Timing"

Avec conseil Math :Si j'écris :

Sub Nouveau_Mois()

Public posit As Integer

'

j'ai à l'exécution l'erreur :

Erreur de compilation : Attribut incorrect dans une procédure Sub ou Function

re,

et pourquoi tu ne peux pas écrire avant ?

J'ai effectué un test chez moi et cela fonctionne.

Le trait affiché est normal. C'est pour séparer les blocs de procédures, fonctions et variables globales.

Aurais-tu un ficher Excel avec un trait de ton traitement ?

Merci

tu ne déclares pas ta variable à la bonne place encore:

pour ta déclaration de variable, place ceci dans la première ligne de ton module principale

tu devrais donc avoir plutot ceci

Public posit As Integer 

Sub Nouveau_Mois() 
' 
' Nouveau_Mois Macro 
' Macro enregistrée le 31/05/2009 par utilisateur 
' 
ton code ici
' 

De ready :

je n'ai conservé que les modifs d'écriture ergonomiques.

pas de :

Option Explicit

Dim posit As Byte

avant le Sub

de Math :

Public posit As Integer avant le Sub

mais j'étais très inquiet de la barre que l'éditeur me place systématiquement si j'écris avant le "Sub" (voir image jointe)

https://www.excel-pratique.com/~files/doc2/Timing.jpg

Et ça marche !

Merci à vous deux.

la barre comme tu dis est seulement esthétique et sert à séparer les procédures et fonctions entre elles. En passant, tu aurais très bien pu écrire ta procédure Timing dans le même module que ta procedure principale.

Tant mieux si ça marche et que ton problème est résolue

Bonne journée

Rebonjour Math et readi,

en fait, je n'ai pas compris . . .

Mon nouveau problème :

Dans le work book de mon classeur j'ai déclaré que la feuille qui doit s'afficher à l'appel du classeur est "Accueil"

Dans cette feuille "Accueil" j'ai des cellules à cliquer qui appellent automatiquement des fonctions (Sub)

J'en ai une ( Sub_1 par exemple) qui met à jour des variables "mois" et "an" As Integer et une variable "libmois" As String et puis cette Sub_1 appelle par Call une Sub_2

Je veux que Sub_2 ait accès aux valeurs de "mois" "an" et "libmois" créés par Sub_1

Comment je déclare ça ?

Bonjour,

Voici un exemple de code :

Public Sub Sub_1()
    Dim mois As Integer
    Dim an As Integer
    Dim libmois As String

    mois = Month(Now)
    an = Year(Now)

    Call Sub_2(mois, an)
End Sub

Public Sub Sub_2(mois As Integer, an As Integer)
    MsgBox "Mois : " & mois & " - Année : " & an
End Sub

ou bien

Public mois As Integer 
Public an As Integer 
Public libmois As String 

Public Sub Sub_1()  

    mois = Month(Now) 
    an = Year(Now) 

    Call Sub_2() 
End Sub 

Public Sub Sub_2() 
    MsgBox "Mois : " & mois & " - Année : " & an 
End Sub

si tu as besoin des variables mois et an seulement dans la sub Sub_2 alors tu peux les passer en paramêtre comme dans la solution de readi. Si tu penses les utilisés dans plusieurs Sub, alors déclare les au début de ton module comme dans mon exemple.

Bonne journée

Pour Math et Ready,

je vous remercie et je peux utiliser vos solutions en les pompant bêtement, mais je voudrais comprendre (pour ne pas mourir idiot car je ne suis pas tout jeune !)

Moi, pour l'instant, je ne fais que des procédures "Sub machin()" . . . . . . . "End Sub"

A quoi correspond "Public Sub machin()" par rapport à "Sub machin()" ?

Et si je place avant une "Private Sub bidule()" des "Public variables As . . . " cela les rend elles visibles de toutes les procédures du classeur ?

Et dans ce cas, dans quelle procédure ("Sub()") faut-il les mettre ? car pour mon cas, il n'y en a pas de principale puisque l'utilisateur choisit le traitement qu'il veut faire.

re,

Voici les définitions des termes :

Public :

Indique que la procédure Sub est accessible à toutes les autres procédures dans l'ensemble des modules.

Private :

Indique que la procédure Sub n'est accessible qu'à d'autres procédures du module dans lequel elle a été déclarée.

"Public Sub machin()" équivaut à "Sub machin()".

Bonjour readi,

Excuse moi d'abuser de tes connaissances, mais j'ai besoin d'une . . . transfusion (de savoir).

Module : je ne connais ce mot qu'au travers de ce que VBA indique quand on visualise la structure du classeur.

Qu'est-ce que c'est qu'un module ? Dans mon classeur j'ai 25 feuilles et 7 procédures et il me déclare 45 modules ? . . . .

Je n'ai aucune procédure déclarée en "Public Sub() elles sont toutes en Sub() et pourtant elles sont toutes communicantes.

Private : Cela signifie t-il que les Private Sub() ne peuvent communiquer qu'avec les autres Private Sub() un peu comme des italiens qui dans le monde ne peuvent comprendre que d'autres italiens ?

Je réserve un autre flot de questions sur les variables pour plus tard car j'ai le sentiment d'être un peu lourd . . . mais je voudrais comprendre.

Bonjour à tous,

Pelerin, retiens ce que Readi a très bien expliqué en quelques mots.

En complément sache que :

  • une macro de type PRIVATE se trouve dans une feuille (clique droite sur l'onglet où se trouve la macro). Ces macros réagissent à un évènement. Exemple le changement de valeur dans une cellule.
  • Une macro SUB (ou PUBLIC, c'est la même chose) se trouve dans un module. Pour voir ce module, fais ALT+F11 sur ton clavier et à gauche tu verras une fenêtre avec le répertoire VBA Project dans lequel se trouve les modules. Clique sur un module pour voir à droite les macros.
En principe tu peux ne faire qu'un module avec toutes tes macros. Le nombre de modules n'a aucune importance si ce n'est pour gérer ou te retrouver dans tes codes.

Toutes les macros peuvent communiquer entre elles via l'instruction CALL (qui n'est pas obligatoire). Donc si dans un module tu as une macro SUB tata() et dans ta feuille une macro PRIVATE SUB ..., tu peux de la macro PRIVATE SUB appeler la macro SUB TATA. Idem d'une macro vers l'autre dans un module.

Exemple : Appel de la macro TATA depuis une macro dans une feuille.

1. Dans ta feuille

PRIVATE SUB CHANGE5...°

Call Tata

End sub

2. Dans un module VBA

SUB TATA()

'Tes instructions

End sub

Si tu as 45 modules dans ton classeur et qu'il ne comportent pas de macros, tu peux les supprimer car ils ne servent à rien.

Voilà quelques explications qui, je l'espère, t'aideront à mieux comprendre.

Amicalement

Dan

Merci Nad Dan pour ce cours magistral,

Je l'ai imprimé, mis dans mon "cahier de formation" et je vais digérer tout ça . . .

Rechercher des sujets similaires à "variable publique syntaxe"