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 :

Nb, variable et BD


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Apprentis
    Inscrit en
    Juillet 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Apprentis

    Informations forums :
    Inscription : Juillet 2018
    Messages : 22
    Par défaut Nb, variable et BD
    Bonjour,

    Je me débrouille en programmation en générale (sur papier...), mais une fois arrivé au code et encore plus sur VBA où je ne trouve aucune bibliothèque. Je suis un peu perdu sur le détails du code, même si je comprend globalement ce que celui ci produit.

    Donc, dans le code (que j'ai récupéré) qui suis voici plusieurs questions :

    BD_DONNEES est une feuille de calcule,

    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
    Private Sub Compter_les_clients()
     
        Nb_Clients = BD_DONNEES.Range("A1").End(xlDown).Row
     
        If Nb_Clients > 65530 Then Nb_Clients = 2
     
        ListBox_Clients.Clear
     
        For i = 2 To Nb_Clients
     
            ListBox_Clients.AddItem BD_DONNEES.Cells(i, 1)
     
        Next
     
        ListBox_Clients.ListIndex = -1
     
    End Sub

    1) Comment Nb_Clients, peut-il recevoir une valeur si non déclarer en variable?
    2) Pourquoi mettre =-1 à la réinitialisation de ListIndex si ça commence par 0 (définition même de cette fonction)?


    Cordialement
    Adrien

  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
    Salut.

    VBA permet de ne pas déclarer les variables avant de les utiliser, et c'est son fonctionnement par défaut. Dans ce cas, la variable est "déclarée" en Variant et va prendre le type de données de la valeur que tu lui assignes.

    C'est une "facilité" mais en fait un vrai piège à bug car lors de l'utilisation d'une variable non déclarée à laquelle tu n'as pas affecté de valeur, VBA lui attribuera la valeur par défaut selon le type attendu. (chaine vide pour un string, 0 pour les valeurs numériques et les dates/heures, Faux pour les booléens).

    considère le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub Test()
      prune = 4
      Proc1 prume
    End Sub
     
    Sub Proc1(ByVal Value As Long)
      MsgBox Value
    End Sub
    Tu constates que, sans déclaration obligatoire, tu as un souci dû simplement à une faute de frappe. Ce problème, dans un code plus étoffé, prend parfois des plombes à débusquer...

    Pour éviter cela, tu places la ligne Option Explicit au début du module. VBA t'obligera alors à déclarer tes variables et tu éviteras le problème rencontré ci-dessus (et beaucoup d'autres). VBA peut ajouter la ligne à ta place sur les nouveaux modules et pour cela, tu vas dans Outils/options/Editeur et tu coches la case Déclaration des variables obligatoire.

    2. Les items d'un listbox commencent à l'indice 0 pour le premier item. Donc, si tu sélectionnes le premier élément de la liste, ListIndex vaut 0. Pour déselectionner les items, on doit passer ListIndex à -1.
    "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
    Membre actif
    Homme Profil pro
    Apprentis
    Inscrit en
    Juillet 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Apprentis

    Informations forums :
    Inscription : Juillet 2018
    Messages : 22
    Par défaut
    Dans un premier temps merci pour ce retour.
    Dans un second, cela m'évoque d'autres question:

    1) Je dois donc déclarer mes variables en début de programme, mais si la dite variable est utilisé dans différents sous programme, où dois-je la déclarer ? au programme principale (en pensant à la réinitialisé à chaque fin de sous programme) ? ou dans chacun des sous programme?
    2) Maintenant admettons que attribut une valeur à la variable A dans le sous programme 1, dans le sous programme 2 ( qui est après le 1) je peux récupérer la variable A ainsi que sa valeur?

  4. #4
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Adrien, bonjour le forum,

    1. Si l'Option Explicit n'est pas écrite dans le code (en première ligne en principe) la déclaration des variables n'est pas indispensable. Je la recommande malgré tout car bien souvent elle évite des bugs insoupçonnés...
    2. ListBox_Clients.ListIndex = -1 signifie qu'aucun client de la liste ne sera sélectionné mais cette ligne me paraît superflue dans ton code...

    Pour éviter la boucle, j'écrirai plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Nb_Clients = BD_DONNEES.Cells(Application.Rows.Count, "A").End(xlUp).Row
    If Nb_Clients = 1 Then ListBox_Clients.Clear: Exit Sub
    ListBox_Clients.Clear
    ListBox_Clients.List = BD_DONNEES.Range("A2:A" & Nb_Clients).Value
    Je temps que je réfléchisse et ponde ma réponse le maître Pierre était déjà passé. Bonjour Pierre.

  5. #5
    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 Thauthème

    @Monkeydlufy
    Ce cours en pdf https://bidou.developpez.com/article/VBA/ te donnera toutes les infos.

    En très gros résumé:
    Déclarer une variable au sein d'une procédure/fonction/propriété permet de l'utiliser uniquement au sein du bloc de code considéré. Tu peux la déclarer avec Dim et elle meurt alors lorsque tu quittes le bloc considéré (le bloc sort de la pile d'appels). Si tu la déclares avec Static, elle garde sa valeur même lorsque le bloc considéré sort de la pile d'appels.

    Avec Dim ou Private en début de module, la variable/constante peut être utilisée dans tout le module.

    Avec Public ou Global en début d'un module standard, la variable est globale et peut être utilisée partout (à utiliser avec parcimonie, c'est-à-dire jamais, sauf pour certaines variables/constantes d'application). Au lieu d'utiliser une variable globale, il est préférable de passer les valeurs par paramètres aux procédures/fonctions/propriétés qui doivent les utiliser.

    Pour le point du message , le code que je te donne dans ma première réponse explique le mécanisme pour utiliser dans une procédure une variable d'une autre procédure

    Je préciserai encore que par défaut, les arguments d'une procédure/fonction sont passées par référence (ByRef) (un peu comme un pointeur en C). C'est-à-dire que c'est la même variable qui est utilisée. Si tu veux en utiliser une copie, tu dois la passer par valeur (ByVal) (comme dans mon exemple). Voici un exemple qui illustre cela. C étant une variable de module, elle peut être modifiée par toutes les procédures/fonctions du module, mais comme elle est déclarée avec Dim, elle ne peut être utilisée dans un autre 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Option Explicit
     
    Dim C As Long
     
    Sub ProcA()
      Dim A As Long
      Dim B As Long
     
      A = 10
      B = 20
      C = 40
     
      Debug.Print "Valeur A: " & A
      Debug.Print "valeur B: " & B
      Debug.Print "valeur C: " & C
     
      ProcB A, B
     
      Debug.Print "Valeur A: " & A
      Debug.Print "valeur B: " & B
      Debug.Print "valeur C: " & C
    End Sub
     
    Sub ProcB(ValA As Long, ByVal ValB As Long)
      ValA = 30
      ValB = 50
      C = 100
    End Sub
    Note: tu peux bien entendu préciser le passage par référence de façon explicite: Sub ProcB(ByRef ValA As Long, ByVal ValB As Long)

    Encore quelques précisions:
    Un module standard peut avoir une variable publique qui porte le même nom qu'une variable publique d'un autre module standard. Cela ne pose pas de problème particulier mais si tu souhaites utiliser une variable qui présente ce cas à l'extérieur du module dans lequel elle est déclarée, tu devras la préfixer du nom du module suivi d'un point.

    Si, dans un module, tu as une variable de module qui porte le même nom qu'une variable déclarée à l'intérieur d'une procédure/fonction de ce module, ladite procédure/fonction utilisera SA variable et non celle du 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
    Option Explicit
     
    Dim C As Long
    Private D As Long ' ou Dim ou Public
     
    Sub ProcA()
      D = 45
      ProcD
    End Sub
     
    Sub ProcD()
      Dim D As Long
     
      D = 20
      Debug.Print "D ProcD: " & D
      Debug.Print "D module: " & Module2.D
    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...
    ---------------

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/07/2002, 13h32
  2. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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