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 :

VBA - Comment imbriquer plusieurs Dir ?


Sujet :

Macros et VBA Excel

  1. #21
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 951
    Points
    55 951
    Billets dans le blog
    131
    Par défaut
    Tu peux tester que t(0) est vide ou pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Test()
      ReDim t(0 To 0)
     
      ScanFolder t, "c:\data", "*.mdf", True
      If Not IsEmpty(t(0)) Then
        ' Ton code
      Else
        ' On continue la macro sans ouvrir de fichier
      End If
    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...
    ---------------

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    Salarié
    Inscrit en
    Septembre 2020
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Salarié

    Informations forums :
    Inscription : Septembre 2020
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Merci une fois de plus Pierre

    J'essaierai ton code lundi et je reviendrai faire un retour !

    Bon weekend à toutes et à tous

  3. #23
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 951
    Points
    55 951
    Billets dans le blog
    131
    Par défaut
    Bonjour Patrice,

    Citation Envoyé par Patrice740 Voir le message
    Désolé, mais c'est pas tout à fait exact, ReDim n'est pas une instruction de déclaration.
    Je suis d'accord avec la première partie de ta réponse, mais pas avec la seconde.

    Ce n'est pas tout à fait exact: Tu as raison, on peut utiliser Redim sur un Dim, mais uniquement à la condition que le Dim concerne un tableau sans dimension, éventuellement typé, ou un variant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Test()
      Dim t '
      Dim u()
      ReDim t(5)
      ReDim u(5)
    End Sub

    ReDim n'est pas une instruction de déclaration: Si! ReDim est une instruction de déclaration ET, en même temps, une instruction d'exécution. Si l'on observe l'image suivante, on verra que les variables t et u existent dès l'entrée dans la fonction et sont déclarées de manière identique comme des tableaux de variant, alors même que dim u() est inexistant. C'est la preuve que Redim u(5) a bien déclaré la variable et en quelque sorte "contient" un Dim u() implicite. Redim est donc bien une instruction de déclaration.

    Nom : 2020-09-25_160323.png
Affichages : 223
Taille : 5,7 Ko


    Elle est, en plus, une instruction d'exécution qui modifiera les dimensions de u au moment de l'exécution de la ligne Redim...

    Nom : 2020-09-26_162912.png
Affichages : 224
Taille : 9,9 Ko


    On notera également que, si l'on peut redimensionner un tableau sans le retyper (il garde le type du dim de départ), on ne peut pas modifier le type du tableau lors du redimensionnement lorsqu'il est déclaré comme un tableau par un Dim ( par exemple, Dim t() ).

    Nom : 2020-09-26_185529.png
Affichages : 206
Taille : 5,5 Ko

    Nom : 2020-09-26_185601.png
Affichages : 201
Taille : 9,6 Ko


    Pour pouvoir modifier à volonté le type du tableau lors du redimensionnement, il faut qu'il ait été déclaré comme Variant

    Nom : 2020-09-26_190126.png
Affichages : 225
Taille : 6,9 Ko
    "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...
    ---------------

  4. #24
    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 : 70
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour, Pierre
    Citation Envoyé par Pierre Fauconnier Voir le message
    ... Si! ReDim est une instruction de déclaration ET, en même temps, une instruction d'exécution [...] et en quelque sorte "contient" un Dim u() implicite
    Mea Culpa, tu as effectivement raison pour être précis :
    A l'intérieur d'un procédure ou d'une fonction, Redim sert aussi de déclaration d'une variable tableau redimensionnable (tableau dynamique) de portée locale quand cette variable n'a pas été déclarée préalablement.

    C'est confirmé par les Spécifications du langage VBA : [MS-VBAL] ReDim :
    § If the name has no matches, then the <redim-statement> is instead interpreted as a <local-variable-declaration> with a <variable-declaration-list> declaring a resizable array with the specified name and the following rules do not apply.
    § Otherwise, if the name has a match, this match is the redimensioned variable.
    Pour ma ma part, je préfère déclarer et typer les variables dans la zone de déclaration plutôt que dans la zone d'exécution.
    Je place toujours les déclarations avant l'exécution puisque, comme tu le démontre, quelle que soit la position de la déclaration dans les lignes de code, les variables sont toutes déclarées dès le début de l'exécution de la procédure, avant d'exécuter la première instruction d'exécution.
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  5. #25
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 951
    Points
    55 951
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Patrice740 Voir le message
    [...]
    Pour ma ma part, je préfère déclarer et typer les variables dans la zone de déclaration plutôt que dans la zone d'exécution.
    Je comprends bien ce que tu veux dire, mais techniquement, il n'y a pas de zone de déclaration et de zone d'exécution. C'est une convention de codage qui fait que généralement, on déclare les variables en début de procédure, mais ce n'est nullement une obligation. D'autres langages, comme le C# par exemple, permettent de déclarer les variables au moment de leur première utilisation, et cela permet un code plus concis et néanmoins très lisible. On pourrait donc, techniquement, avoir le code suivant, qui montre bien que déclaration et exécution se mêlent et que les notions "zone de déclaration" et "zone d'exécution" sont des vues de l'esprit, même si je trouve que ce n'est pas très lisible de coder ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test()
      Dim a As String
      a = InputBox("Votre prénom svp")
      Dim b As String
      b = InputBox("votre nom svp")
      Dim c As String
      c = a & " " & b
      MsgBox "Vous vous appelez " & c
    End Sub
    Pour ma part, et notamment pour les compteurs, j'utilise souvent ceci (écriture "à la C#"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Test()
      Dim Counter As Long: Counter = 1
      Dim Name As String
      Dim sh As Worksheet
     
      Name = "shParameters"
      Do While Counter <= ActiveWorkbook.Worksheets.Count And sh Is Nothing
        If ActiveWorkbook.Worksheets(Counter).CodeName = Name Then Set sh = ActiveWorkbook.Worksheets(Counter)
        Counter = Counter + 1
      Loop
      Debug.Print sh.Name
    End Sub
    Ce qui revient à mélanger les lignes de déclaration et d'éxécution et pourrait s'écrire comme ceci (perso, je n'aime pas):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Dim Counter As Long
      Counter = 1
      Dim Name As String
      Dim sh As Worksheet
    ou encore comme ceci (plus souvent rencontré sur les forums et plus "puriste")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Dim Counter As Long
      Dim Name As String
      Dim sh As Worksheet
     
      Counter = 1



    Citation Envoyé par Patrice740 Voir le message
    [...]
    Je place toujours les déclarations avant l'exécution puisque, comme tu le démontre, quelle que soit la position de la déclaration dans les lignes de code, les variables sont toutes déclarées dès le début de l'exécution de la procédure, avant d'exécuter la première instruction d'exécution.
    Je n'ai pas dit ça (ce qui est en gras) . Dans le cas du Redim utilisé seul, la ligne de déclaration implicite Dim t() précède la ligne d'exécution Redim, comme le montre l'illustration dans ma réponse précédente. La ligne de déclaration ne peut pas être n'importe où. Elle doit obligatoirement précéder la ligne d'exécution qui utilise la variable. Ainsi, le code suivant plantera dès la compilation car la variable est déclarée après son utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Test()
      a = 4
      Dim a As Long
    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...
    ---------------

  6. #26
    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 : 70
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Je comprends bien ce que tu veux dire, mais techniquement, il n'y a pas de zone de déclaration et de zone d'exécution. C'est une convention de codage ...
    Bien sûr, mais à la différence d'autres langages, le compilateur VBA effectue toutes les déclarations avant la première exécution, ce qui revient à placer toutes les déclarations avant la première exécution.
    Souvent certains écrivent des codes comme ton premier exemple en pensant économiser la mémoire utilisée par la déclaration.

    ... La ligne de déclaration ne peut pas être n'importe où.
    Je n'ai pas dit ça . Tes codes, dont je parle, sont compilés, ils ne présentent pas d'erreur de compilation. (quelle que soit la position, ne veux pas dire n'importe où)
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  7. #27
    Nouveau membre du Club
    Homme Profil pro
    Salarié
    Inscrit en
    Septembre 2020
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Salarié

    Informations forums :
    Inscription : Septembre 2020
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Je reviens sur ce sujet car j'ai un petit problème avec la fonction de Pierre Fauconnier, je l'utilise dans une macro sur plusieurs valeurs mais lorsque ça passe sur le deuxième nom j'ai un message d'erreur comme quoi le classeur n'existe pas car en effet il garde en mémoire la première valeur pour le nom du fichier...

    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
     
      ReDim T(0 To 0)
      Dim I as Long
      Dim Y as Long
      For Y = 1 To 10
      ScanFolder T, "C:\TEST", Workbooks("TEST").Sheets("TEST").Cells(Y, 8).Value & " " & "*.xls*", False
      If Not IsEmpty(T(0)) Then
      For I = 0 To UBound(T)
        Workbooks.Open T(I)
        nomclasseur = ActiveWorkbook.Name
        Classeur = Application.ActiveWorkbook.FullName
        ActiveWorkbook.Close
        Kill Classeur
      Next I
      End If
      Next Y
    Je pense que c'est histoire de réinitialisation de variable ?

    Merci du coup de main ^^

  8. #28
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 347
    Points : 622
    Points
    622
    Par défaut
    Salut JukeBox,
    es-tu sûr de ton Pattern au niveau des variables de la sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ScanFolder T, "C:\TEST", Workbooks("TEST").Sheets("TEST").Cells(Y, 8).Value & " " & "*.xls*", False
    Tu devrait mettre un point d'arrêt (Touche F9) sur la ligne 9 et voir ce que contient T(I) tu sélectionnes T(I) et ensuite touche Shift + F9.
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/04/2007, 23h30
  2. [VBA-E] comment selectionner plusieurs lignes
    Par Annick.w dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/01/2007, 20h15
  3. Réponses: 7
    Dernier message: 15/12/2006, 16h14
  4. comment imbriquer plusieurs evenements
    Par nazimb dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 05/07/2006, 14h57
  5. excel VBA comment recopier sur plusieurs feuilles
    Par floflo2006 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/11/2005, 15h56

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