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 :

Ecrire plusieurs initialisation variable sur une même ligne [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 274
    Par défaut Ecrire plusieurs initialisation variable sur une même ligne
    Bonjour,

    j'ai une macro qui utilise un certain nombre de variable comme compteurs définies en "Integer", je les initialise à zéro de cette façon :

    a = 0
    b = 0

    x = 0

    pour la lisibilité j'essaie en vain de les écrire sur moins de lignes, impossible de trouver la solution à ce pb pourtant très simple, je cherche une doc mais ne trouve pas, les exemples donnés ne marchent pas...

    du style
    a = b = x = 0
    ou
    a = 0 ; b = 0 …

    ou autre...

  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.

    Des variables de type Integer valent 0 dès leur déclaration. Il n'est donc pas nécessaire de leur attribuer cette valeur.

    Si tu veux déclarer plusieurs variables sur une même ligne, tu dois préciser le type pour chacune d'entre elles, les non typées seront de type Variant

    Le code suivant déclare trois Integer qui valent automatiquement 0 au moment de leur déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim a As Integer, b As Integer, c As Integer
    Tu peux déclarer des variables de types différents

    A vaudra 0, b sera une chaine vide "" et c sera la date 30/12/1899
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim a As Integer, b As String, c As Date
    Avec la ligne suivante, seule la variable c est un Integer, a et b sont des variant et sont vide (isEmpty = true)

    Si tu souhaites, après utilisation, les réinitialiser, tu peux le faire sur une seule ligne, avec : comme séparateur d'instruction (perso, je n'aime pas, mais chacun son truc)
    "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 éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 274
    Par défaut
    Merci c'est très clair,

    mais si j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim a, b, c As Integer
    Compris a et b seront de type Variant Ok, mais si je fais (sans initialiser a)
    J'ai constaté que ça marche quand même, a devient bien = 1 et ainsi de suite,

    Cela se comporte comme un type Integer, quel est le risque encouru ?

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Bonjour,

    a reste un variant qui contient un integer alors que
    c est un integer.

    Par exemple il y aura une erreur "incompatibilité de type" avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      c = c + 1
      c = c & "z"
    mais pas d'erreur avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      a = a + 1
      a = a & "z"
    qui verra a transformé en String

  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
    En ne déclarant pas le type, la variable sera du "type" Variant et prendra son "vrai" type en fonction de ce que tu lui passes...

    C'est une "facilité" qui peut s'avérer très problématique dans ton code, puisque tu ne seras jamais certain du type de variable que tu vas utiliser.

    Regarde 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
    Sub Test()
      Dim a As Variant
      Dim b As String
     
      On Error Resume Next
      Debug.Print "type de a: " & TypeName(a), "Valeur : " & a
      a = a + 1
      Debug.Print "type de a: " & TypeName(a), "Valeur : " & a
      a = 60000
      Debug.Print "type de a: " & TypeName(a), "Valeur : " & a
      a = "pierre"
      Debug.Print "type de a: " & TypeName(a), "Valeur : " & a
      a = a + 1
      Debug.Print "type de a: " & TypeName(a), "Valeur : " & a
      b = 0
      Debug.Print "type de b: " & TypeName(b), "Valeur : " & b
      b = b + 1
      Debug.Print "type de b: " & TypeName(b), "Valeur : " & b
    End Sub
    Et son résultat dans la fenêtre d'exécution (Tu auras peut-être un arrêt sur la ligne a = a + 1 après l'affectation de "pierre" à a, et il te suffira de déplacer la ligne jaune sur la ligne suivante pour continuer le code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type de a: Empty            Valeur : 
    type de a: Integer          Valeur : 1
    type de a: Long             Valeur : 60000
    type de a: String           Valeur : pierre
    type de a: String           Valeur : pierre
    type de b: String           Valeur : 0
    type de b: String           Valeur : 1
    Je pense que tu verras mieux le caractère vicieux de la déclaration non typée, qui est réservée lorsque l'on ne sait réellement pas ce que l'on va recevoir comme donnée...
    "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...
    ---------------

  6. #6
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 274
    Par défaut
    Entendu, du coup je vais déclarer toutes mes variables sous la forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim a As Integrer
    Dim b As Integrer
    …
    Dim x As Integrer
    sur autant de ligne que de variable, mais sans avoir à les initialiser à 0.

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bon!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim a as integer,b as integer,c as integer

    bon aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim a as integer
    dim b as integer
    dim c as integer

    pas bon mais marche quand meme car a et b sont de type variant et accepte donc les numeriques mais pour une utilisation numerique attention au manoeuvre que tu fera suivre
    exemple avec pas de type pour a et b
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim a ,b ,c as integer
    a=1
    b=2
    c=3
    msgbox a+b+c'te donnera 6
    exemple en donnant une valeur numerique sous forme de string a et b

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim a, b, c As Integer
    a = "1"
    b = "2"
    c = 3
    MsgBox a + b + c 'te donnera 15
    comme tu peux le voir ca change la donne

    d'ou l'importance declaration typée autre que variant quand c'est necessaire
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut
    Bonjour,
    Personnellement j'utilise la déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DefInt i 'déclaration à placer en tête du module concerné
    'Cette déclaration suppose que toutes les variables dont le nom commence par i seront integer
    Sub Macro1
    Dim iR, iC, iLR, iLC, icpt
    'longue suite d'instruction
    End Sub
    Cette déclaration ne fait pas obstacle à déclarer dans la procédure une autre variable commençant par i d'une autre manière...
    ou d'utiliser des variables commençant autrement as integer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim iSem as Byte 'par exemple
    Dim Semaine as Integer
    Toutefois l'esprit bien compris de ces déclarations globales est de ne pas faire d'exceptions...
    Ce système est particulièrement intéressant pour les types de variables qui n'ont pas de caractère abrégé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DefBool Y 'toutes les variables qui commence par Y sont de type boolean
    Sub test
    Dim Y, Y1, Y2, Y3, Y4 'toutes ces variables sont integer
    'longue suite d'instruction
    End Sub
    [EDIT] Pour correction... cf observation de Pierre Fauconnier.
    A+

  9. #9
    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 Galopin,

    Ton dernier bloc et les explications y afférentes ne sont pas corrects. Je suppose que tu voulais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DefBool Y  'toutes les variables qui commence par Y sont de type boolean
    Sub test
    Dim Y, Y1, Y2, Y3, Y4 'toutes ces variables sont boolean
    'longue suite d'instruction
    End Sub
    Personnellement, je trouve ce système assez casse-gueule, surtout si, comme illustré dans ton deuxième bloc, on s'amuse à nommer des variables non integer en les commençant par i. Si on souhaite par exemple nommer une variable Insertion en la laissant en variant, on va être obligé de la typer explicitement en variant dim Insertion As Variant, alors qu'habituellement, on la déclarerait dim Insertion qui la déclarerait en Integer. Si on déclare un tableau dim Insertion(1 to 3, 1 to 5) en omettant de typer variant, toutes les cases du tableau seront des Integer, alors qu'on voudrait peut-être mettre du numérique en colonne 1 et du texte en colonne2. De plus, ce système doit se répéter sur chaque module si on veut être cohérent, ce qui me semble assez lourd à mettre en place.

    De plus, attention que le Def... n'accepte qu'une lettre et qu'elle est transformée en majuscule (non impactant sur les noms des variables). il faut aussi noter que, par convention, ce sont les interfaces qui commencent par I (majuscule, cette fois).

    Perso, assez dubitatif sur cette technique qui pour moi est une fausse bonne idée et qui apporte plus de désagréments que de confort (Mais chacun est libre, et mes propos ne sont pas une attaque personnelle, évidemment).
    "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...
    ---------------

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut
    Bonsoir
    Oui bien sur, je corrige...

    A+

  11. #11
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Re,

    Sans oublier la déclaration Integer sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim a%, b%, c%
    a = a + 1
    b = a + 2

  12. #12
    Membre éprouvé
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2017
    Messages
    1 274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2017
    Messages : 1 274
    Par défaut
    Bonjour,

    en tant que néophyte je préfère de loin rester sur des déclarations plus basiques du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim a As Integer, b As Integer, c As Integer
    merci quand même de la démarche enrichissante

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

Discussions similaires

  1. Plusieurs Query écrit sur une même ligne
    Par Invité dans le forum VBScript
    Réponses: 1
    Dernier message: 18/06/2012, 17h31
  2. [awk] Utiliser plusieurs FS sur une même ligne
    Par novices dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 06/08/2008, 18h45
  3. [Tableaux] plusieurs tableaux sur une même ligne
    Par zugolin dans le forum Langage
    Réponses: 6
    Dernier message: 12/01/2008, 23h29
  4. Réponses: 2
    Dernier message: 29/11/2006, 11h52
  5. debutant lecture de plusieur variable sur une meme ligne
    Par Slumpy dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/06/2006, 19h37

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