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

VBA Discussion :

Instruction with avec un tableau


Sujet :

VBA

  1. #1
    Invité
    Invité(e)
    Par défaut Instruction with avec un tableau
    Bonjour,

    C'est peut-être une question tout à fait stupide, mais je me demande s'il existe en VBA un moyen d'utiliser le bloc with avec un tableau comme objet puis d’accéder aux éléments du tableau avec une syntaxe se rapprochant de l'exemple ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With ThisWorkbook.Sheets
            MsgBox .(1).Name ' pour afficher le nom de la premiere feuille
    End With
    (Il est bien évident que dans cet exemple non fonctionnel l'utilisation de with est superflue)

    Si vous connaissez la syntaxe ou une méthode du genre MyArray.Get(i) (à la Java), merci d'avance pour vos suggestions.

  2. #2
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    Salut,

    il faut réaliser une boucle pour parcourir le tableau, ou si tu connais la portée tu peut directement saisir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For j = 0 To UBound(NomTableau)
        MsgBox NomTableau(j)
    Next j
    Utiliser les variables tableaux en VBA Excel
    Conceptualisation des variables tableau en VBA et Application à l'optimisation du code sous Excel

    @++

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Merci d'avoir répondu, mais ça ne correspond pas à ma question.
    Ma question porte sur l'utilisation de l'instruction de bloc With avec les tableaux (cf. mon premier message qui, je crois, est clair).

  4. #4
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    Bonjour,
    Citation Envoyé par kéraunos Voir le message
    Bonjour,
    Merci d'avoir répondu, mais ça ne correspond pas à ma question.
    Ma question porte sur l'utilisation de l'instruction de bloc With avec les tableaux (cf. mon premier message qui, je crois, est clair).
    J'étais partit sur les variables

    Citation Envoyé par kéraunos Voir le message
    (cf. mon premier message qui, je crois, est clair)
    Peut être pas assez, j'aurais ajouter Excel après tableau, qui son en faite des feuilles et j'aurais mis mon message dans le Forum Excel. Mais ce n'est que mon avis.

    @+

  5. #5
    Invité
    Invité(e)
    Par défaut
    Mon exemple n'est qu'un exemple
    S'il correspond en effet à mon problème réel (j'utilise VBA Excel), il s'agit bien d'une question sur le langage VBA lui-même, donc je suis dans la bonne section.

    Mais dans un souci de clarté, voici un second exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim myArray As Variant
    myArray = Array("foo", "bar")
    MsgBox myArray(1) ' affiche "bar"
    With myArray
        MsgBox .(1) ' quelle syntaxe pour afficher "bar" sans ecrire myArray ?
    End With
    A l'intérieur du bloc With, je veux tenter de reproduire le même comportement qu'à la ligne 3 mais en utilisant, si toutefois c'est possible*, une facilité d'écriture permise par le With. J'étends ma question aux collections également (du genre Workbook.Sheets).

    * j'ai bien précisé qu'il s'agissait peut-être d'une question stupide, mais s'il existe un moyen (avec les tableaux de base ou les collections), je serais heureux de le connaitre, cela m'aiderait à rendre bien plus lisibles des dizaines de lignes de code.

    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut,

    Ta question est clair, mais tu ne peux pas détacher le (1) du Arr.
    Le (1) est lié à Arr.

    Si c'était par exemple Ws(1) , avec:
    - Ws(1) = Wb.Sheets("Feuil1")
    - Wb = ThisWorkbook
    tu pourrai faire pour cette exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Ws(1)
       Msgbox .CodeName
    end with
    Mais pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Ws
    Msgbox (1).CodeName
    end with
    tu peux en revanche faire (de préférence si Wb n'est pas déjà inclus dans Ws(1)):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Wb
    Msgbox Ws(1).CodeName
    Msgbox Ws(2).CodeName
    Msgbox Ws(3).CodeName
    end with
    avec Set Wb = ThisWorkbook par exemple.
    Dernière modification par Invité ; 02/08/2013 à 13h04.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Enfaite dans ton 1er exemple, With ThisWorkbook.Sheets ne veux rien dire.
    Il faudrai mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With ThisWorkbook
    with .Sheets(1)
    .Name = "f"
    end with
    end with
    Ou un truc dans le genre. Un Msgbox fonctionnerai aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With ThisWorkbook
    with .Sheets(1)
    MsgBox .Name
    end with
    End With

    Ou alors (ce qui reviendrai au même):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With ThisWorkbook.Sheets(1)
    .Name = "f"
    end with
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With ThisWorkbook.Sheets(1)
    MsgBox .Name
    End With
    Après, tableau ou pas tableau, cela ne change rien.


    A+
    Dernière modification par Invité ; 02/08/2013 à 12h54.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Réponse à Nouveau2, que je remercie pour ses messages (quel étrange pseudo ) :

    Réponse au deuxième message :
    Heu... Je ne suis pas d'accord. As-tu essayé d'exécuter le code suivant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
        With ThisWorkbook.Sheets
            MsgBox .Count
        End With
    End Sub
    Il fonctionne. Du moins avec Excel 2007.

    Réponse au premier message :
    Je dois admettre que je ne comprends pas trop la solution. Le dernier extrait de code ne semble pas correct.

    J'ai essayé le code suivant, qui comme attendu génère une erreur (out of range) à la ligne 8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim Wb As Workbook
        Set Wb = ThisWorkbook
        Dim Ws(1) As Worksheet
        Set Ws(1) = Wb.Sheets("Sheet1")
     
        With Wb
            MsgBox Ws(1).CodeName
            MsgBox Ws(2).CodeName
            MsgBox Ws(3).CodeName
        End With

  9. #9
    Invité
    Invité(e)
    Par défaut
    De rien.

    (quel étrange pseudo ) :
    J'admet qu'il va falloir changer très bientôt de pseudo si je reste encore un peu sur le forum .

    Sur un classeur vierge, essaye par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub AFaire1ou2fois()
    ThisWorkbook.Sheets.Add After:=Sheets(ThisWorkbook.Sheets.Count), Count:=20
    End Sub

    Ensuite, sans renommer les feuilles, puisque je me base ici sur le nom des feuilles "Feuil" & n où n est un chiffre. Mauvaise idée enfaite, mais ici le but est de remplir un Tableau nommer Ws(1 To n) si le nombre de feuilles est de n.

    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
    Sub RechercheFeuilleDansClasseur()
     
    Dim Wb As Workbook, Ws() As Worksheet
    Dim CompteurFeuille As Integer, Feuille As Worksheet
    Dim SafeArray1D() As String
     
        Set Wb = ThisWorkbook
           ReDim SafeArray1D(1 To 2 ^ 12)
           ReDim Ws(1 To 2 ^ 12)
              For Each Feuille In Wb.Sheets
                    CompteurFeuille = CompteurFeuille + 1
                    SafeArray1D(CompteurFeuille) = "Feuil" & CompteurFeuille 'Sinon, remplacer "Feuil" & CompteurFeuille par Feuille.name peut être par exemple
                 Set Ws(CompteurFeuille) = Wb.Sheets(SafeArray1D(CompteurFeuille))
                    If CompteurFeuille Mod (1500) = 0 Then DoEvents
              Next Feuille
           ReDim Preserve SafeArray1D(1 To CompteurFeuille)
           ReDim Preserve Ws(1 To CompteurFeuille)
     
        With Wb 'PS : Enfaite, le Wb est inclus dans chaque Ws, alors pour éviter un conflit dans le cas où les Workbook ne serait pas les même, le mieux serait de ne pas le mettre.
           MsgBox Ws(LBound(Ws)).CodeName '1er nom de Feuille du tableau Ws
           MsgBox Ws(1).CodeName
           MsgBox Ws(2).CodeName
           MsgBox Ws(3).CodeName
           MsgBox Ws(UBound(Ws)).CodeName 'Dernière
        End With
     
    End Sub
    Dernière modification par Invité ; 02/08/2013 à 20h42.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par kéraunos Voir le message

    Réponse au deuxième message :
    Heu... Je ne suis pas d'accord. As-tu essayé d'exécuter le code suivant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
        With ThisWorkbook.Sheets
            MsgBox .Count
        End With
    End Sub
    Il fonctionne. Du moins avec Excel 2007.
    C'est vrai. Tu marques 1 point.



    --------------------------------------------------------------------------------------------

    PS:
    Essaie ça, tu peux renommer les feuilles cette fois-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub AFaire1fois()
     
    ThisWorkbook.Sheets.Add After:=Sheets(ThisWorkbook.Sheets.Count), Count:=20
     
    End Sub
    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
    Sub RechercheNomFeuilleDansClasseur()
     
    Dim Wb As Workbook, Ws() As Worksheet
    Dim CompteurFeuille As Integer, Feuille As Worksheet
    Dim SafeArray1D() As String
    Dim i As Integer, iStr As String
     
        Set Wb = ThisWorkbook
           ReDim SafeArray1D(1 To 2 ^ 12)
           ReDim Ws(1 To 2 ^ 12)
              For Each Feuille In Wb.WorkSheets 'Pour Feuille uniquement (Graphique exclus ici) : pouvant décaler l'index Tableau Ws et l'index Feuille si des Graphique Charts sont insérés.
                    CompteurFeuille = CompteurFeuille + 1
                    SafeArray1D(CompteurFeuille) = Feuille.Name
                 Set Ws(CompteurFeuille) = Wb.Sheets(SafeArray1D(CompteurFeuille))
                    If CompteurFeuille Mod (2500) = 0 Then DoEvents
              Next Feuille
           ReDim Preserve SafeArray1D(1 To CompteurFeuille)
           ReDim Preserve Ws(1 To CompteurFeuille)
     
        With Nothing 'Méthode 1
           MsgBox "Index : " & Ws(LBound(Ws)).Index & Chr(10) & "Name : " & Ws(LBound(Ws)).Name & Chr(10) & "CodeName : " & Ws(LBound(Ws)).CodeName
           MsgBox "Index : " & Ws(2).Index & Chr(10) & "Name : " & Ws(2).Name & Chr(10) & "CodeName : " & Ws(2).CodeName
           MsgBox "Index : " & Ws(3).Index & Chr(10) & "Name : " & Ws(3).Name & Chr(10) & "CodeName : " & Ws(3).CodeName
           MsgBox "Index : " & Ws(4).Index & Chr(10) & "Name : " & Ws(4).Name & Chr(10) & "CodeName : " & Ws(4).CodeName
           MsgBox "Index : " & Ws(UBound(Ws)).Index & Chr(10) & "Name : " & Ws(UBound(Ws)).Name & Chr(10) & "CodeName : " & Ws(UBound(Ws)).CodeName
        End With
     
        With Nothing 'Méthode 2 : Liste toutes les Feuilles dans la Msgbox avec quelques infos sur chaques feuilles.
           For i = 1 To CompteurFeuille
           iStr = iStr & "Index Ws : " & i & Chr(10) & "Index Feuille : " & Ws(i).Index & Chr(10) & "Name Feuille : " & Ws(i).Name & Chr(10) & "CodeName Feuille : " & Ws(i).CodeName & Chr(10) & Chr(10) & ""
           Next
        End With
        MsgBox iStr
     
    End Sub
    Mais j'avoue que je m'écarte de ton but. Cela dit, ici, tu appel bien Ws qui est ici un tableau unidimentionnel.



    ------------------------------------------------------------------------------------------------------------

    Si tu veux faire le test pour toutes les Feuilles/graphiques existantes, il faut passer en Variant ou Object au lieu de WorkSheet.

    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
    Sub RechercheNomFeuilleGraphiqueDansClasseur()
     
    Dim Wb As Workbook, Ws() As Object 'Variant ou Object
    Dim CompteurFeuille_Graphique As Long, Feuille_Graphique As Object 'Variant ou Object
    Dim SafeArray1D() As String
    Dim i As Long, iStr As String
    Dim t(0 To 5) As Single, tStr As String
     
    t(0) = Timer
     
        Set Wb = ThisWorkbook
           ReDim SafeArray1D(1 To 2 ^ 4)
           ReDim Ws(1 To 2 ^ 4)
              For Each Feuille_Graphique In Wb.Sheets
                    CompteurFeuille_Graphique = CompteurFeuille_Graphique + 1
                    SafeArray1D(CompteurFeuille_Graphique) = Feuille_Graphique.Name
                 Set Ws(CompteurFeuille_Graphique) = Wb.Sheets(SafeArray1D(CompteurFeuille_Graphique))
                    If CompteurFeuille_Graphique > UBound(Ws) - 1 Then
                       ReDim Preserve SafeArray1D(1 To CompteurFeuille_Graphique * 2)
                       ReDim Preserve Ws(1 To CompteurFeuille_Graphique * 2)
                    End If
                    If CompteurFeuille_Graphique Mod (2500) = 0 Then DoEvents
              Next Feuille_Graphique
           ReDim Preserve SafeArray1D(1 To CompteurFeuille_Graphique)
           ReDim Preserve Ws(1 To CompteurFeuille_Graphique)
     
    t(1) = Timer
     
           For i = 1 To CompteurFeuille_Graphique
           iStr = iStr & "Index SafeArray Ws : " & i & Chr(10) & "Index Feuille/Graphique : " & Ws(i).Index & Chr(10) & "Name Feuille/Graphique : " & Ws(i).Name & Chr(10) & "CodeName Feuille/Graphique : " & Ws(i).CodeName & Chr(10) & Chr(10) & ""
           Next
     
    t(2) = Timer
    tStr = "Temps de recherche Feuille & Graphique : " & t(1) - t(0) & " s" & Chr(10) & _
           "Temps de construction variable texte iStr : " & t(2) - t(1) & " s" & Chr(10) & _
           "Temps Total : " & t(2) - t(0) & " s" & Chr(10) & Chr(10)
     
        MsgBox tStr & iStr
     
    End Sub

    On s'aperçoit que le With Wb est inutile car inclus dans le contenu du Tableau Ws(i).

    Je me suis un peu emballé avec toutes ses macros un peu inutile dans ton cas, mais ça montre principalement que l'on s'en sort sans aucun With ici. Mais les tableaux n'interdisent pas d'utiliser les With pour autant. A partir du moment où l'indice du tableau est lié à son tableau, il n'y a pas de problème.



    ------------------------------------------------------------------------------------------------------------------------

    Citation Envoyé par kéraunos Voir le message

    Réponse au premier message :
    Je dois admettre que je ne comprends pas trop la solution. Le dernier extrait de code ne semble pas correct.

    J'ai essayé le code suivant, qui comme attendu génère une erreur (out of range) à la ligne 8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim Wb As Workbook
        Set Wb = ThisWorkbook
        Dim Ws(1) As Worksheet
        Set Ws(1) = Wb.Sheets("Sheet1")
     
        With Wb
            MsgBox Ws(1).CodeName
            MsgBox Ws(2).CodeName
            MsgBox Ws(3).CodeName
        End With
    Sais-tu pourquoi ça ne fonctionne pas ici de cette façon ?
    Ws(2) n'existe pas ici. Tu n'as répertorié que Ws(1), alors lorsque tu appel Ws(2), le VBA ne comprends pas car Ws(2) n'existe pas.

    Essaie:
    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
    Sub test1()
     
    Dim Wb As Workbook, Ws(1 To 3) As Object ' ou Variant
     
        Set Wb = ThisWorkbook
        Set Ws(1) = Wb.Sheets("Feuil1") 'Attention au Set qui doit posséder des données valides.
        Set Ws(2) = Wb.Sheets("Feuil2")
        Set Ws(3) = Wb.Sheets("Feuil3")
     
     MsgBox IsArray(Ws) 'Vrai
     
        With Wb ' ?
            MsgBox Ws(1).CodeName
            MsgBox Ws(2).CodeName
            MsgBox Ws(3).CodeName
        End With ' ?
     
    End Sub
    Ou encore:
    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
    Sub test2()
     
    Dim Wb As Workbook, Ws As Variant
    Dim FeuillesEtGraphiques() As Variant
        FeuillesEtGraphiques = Array("Feuil1", "Feuil2", "Feuil3") 
        Set Wb = ThisWorkbook
        Set Ws = Wb.Sheets(FeuillesEtGraphiques) 'Attention au Set qui doit posséder des données valides. 
    ' D'où le code à base de For Each au dessus qui permet d'énumérer les Feuilles/Graphiques existants.
    ' L'array dynamique FeuillesEtGraphiques(0 To 2) doit posséder des noms de feuilles ou de graphiques existantes dans le classeur.
     
     MsgBox IsArray(FeuillesEtGraphiques) 'Vrai
     MsgBox IsArray(Ws) 'Faux, 
    ' Cependant...:
     MsgBox Ws.Count ' Egale 3
        With Wb ' ?
            MsgBox Ws(1).CodeName
            MsgBox Ws(2).CodeName
            MsgBox Ws(3).CodeName
        End With ' ?
     
    End Sub

    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
    Sub test3()
     
    Dim n As Byte 
    Dim Wb As Workbook, Ws As Variant
    Dim FeuillesEtGraphiques() As Variant
        FeuillesEtGraphiques = Array(1, 2, 3)
        Set Wb = ThisWorkbook
        Set Ws = Wb.Sheets(FeuillesEtGraphiques) 'Attention au Set qui doit posséder des données valides. 
    ' D'où le code à base de For Each au dessus qui permet d'énumérer les Feuilles/Graphiques existants.
    ' L'array dynamique FeuillesEtGraphiques(0 To 2) doit posséder des noms de feuilles ou de graphiques existantes dans le classeur.
     
     MsgBox IsArray(FeuillesEtGraphiques) 'Vrai
     MsgBox IsArray(Ws) 'Faux, cependant...
     
    ' Il faut une boucle où n serait égale à 1, puis 2, puis 3, mais ne jamais (par principe) mettre de Msgbox dans une boucle, sauf si une option de sortie automatique existe.
        With Ws(1)
              MsgBox .Index
              MsgBox .CodeName
              MsgBox .Name
        End With
        With Ws(2)
              MsgBox .Index
              MsgBox .CodeName
              MsgBox .Name
        End With
        With Ws(3)
              MsgBox .Index
              MsgBox .CodeName
              MsgBox .Name
        End With
     
    '   For n = 1 To 3
    '      With Ws(n)
    '          .Index
    '          .CodeName
    '          .Name
    '      End With
    '   Next
     
    End Sub

    Ou alors en comptant les feuilles/Graphiques:
    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
    Sub test4()
     
    Dim n As Byte
    Dim Wb As Workbook, Ws As Variant
    Dim FeuillesEtGraphiques() As Variant
    Dim CompteurDeFeuillesEtGraphiques As Long
     
        Set Wb = ThisWorkbook
        CompteurDeFeuillesEtGraphiques = Wb.Sheets.Count
        FeuillesEtGraphiques = Array(1, 2, 3) ' Les valeurs de l'array doivent être croissantes
           If CompteurDeFeuillesEtGraphiques < FeuillesEtGraphiques(UBound(FeuillesEtGraphiques)) Then
              MsgBox "Le nombres de feuilles et graphiques combinés appartenant au Classeur est inférieur à la Valeur du dernier indice de l'Array FeuillesEtGraphiques"
              Exit Sub
           End If
        Set Ws = Wb.Sheets(FeuillesEtGraphiques) ' Ça devrait être valide ici, sinon, Exit Sub
     
     MsgBox IsArray(FeuillesEtGraphiques) 'Vrai
     MsgBox IsArray(Ws) 'Faux, cependant...
     
    ' Il faut une boucle où n serait égale à 1, puis 2, puis 3, mais ne jamais (par principe) mettre de Msgbox dans une boucle, sauf si une option de sortie automatique existe.
        With Ws(1)
              MsgBox .Index
              MsgBox .CodeName
              MsgBox .Name
        End With
        With Ws(2)
              MsgBox .Index
              MsgBox .CodeName
              MsgBox .Name
        End With
        With Ws(3)
              MsgBox .Index
              MsgBox .CodeName
              MsgBox .Name
        End With
     
    '   For n = 1 To 3
    '      With Ws(n)
    '          .Index
    '          .CodeName
    '          .Name
    '      End With
    '   Next
     
    End Sub
    Dernière modification par Invité ; 03/08/2013 à 16h40.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Oulah c'est devenu vraiment long compte tenu de la simplicité de la question de base, non ? Je te remercie de prendre autant de temps pour y répondre, mais comme tu le dis toi-même, on s'écarte un peu du sujet avec toutes ces macros centrées sur la gestion des feuilles Excel. D'autant plus que c'est un sujet que je connais, cf. parenthèse en fin de post.

    Pour revenir sur mon précédent message : mon "comme attendu" indique que je savais pourquoi une erreur est générée.

    Du coup, nous n'avons pas élucidé le mystère à l'origine de ce thread. Et l'utilisation du With comme je l'ai fait dans mon précédent message (qui mettait en application tes conseils certes un peu bêtement mais à dessein) était totalement inutile, comme tu l'as toi-même justement relevé. Mais avec des arguments qui restent obscurs pour moi : "Wb est inutile car inclus dans le contenu du Tableau Ws(i)" ??? Wb est inutile tout simplement car si j'écris With Wb c'est pour utiliser des propriétés ou méthodes de Wb avec la syntaxe .Member, non ?


    ----------------------------------

    Parenthèse sur la récupération des feuilles de calcul dans un tableau : malgré ce que j'ai écrit juste au-dessus, voici tout de même ma solution (mais ça n'a rien à voir avec le With) qui récupère uniquement les feuilles de calcul (et non les graphiques) dans un tableau, en donne le compte et les énumère (s'il y en a) :

    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
    Sub test()
     
        Dim arWSh() As Worksheet, Sh As Object
        Dim WShCount As Long, i As Long
     
        ' build worksheets-only array (NO chart sheets)
        For Each Sh In ThisWorkbook.Sheets
            If TypeOf Sh Is Worksheet Then
                WShCount = WShCount + 1
                ReDim Preserve arWSh(1 To WShCount)
                Set arWSh(WShCount) = Sh
            End If
        Next Sh
     
        ' display
        MsgBox "Nb of worksheets: " & WShCount
        For i = 1 To WShCount
            MsgBox arWSh(i).Name
        Next i
     
    End Sub
    (fonctionne quelle que soit la valeur de l'Option Base)

  12. #12
    Invité
    Invité(e)
    Par défaut
    Hello,

    Oui, j'ai été long, très long même, mais toutes les procédures se ressemblent plus ou moins, avec disons 2 ou 3 méthodes différentes:
    - 1 avec des For Each => Tableau
    - 1 autre avec des Array => Pas tableau

    Mais passons.

    Du coup, nous n'avons pas élucidé le mystère à l'origine de ce thread.
    Pour ta question initiale sur les With, et pour faire court, non, tu ne peux pas détacher l'indice du tableau de son tableau.

  13. #13
    Invité
    Invité(e)
    Par défaut
    D'accord, c'est dommage tout de même.

    Je viens de trouver une solution pour les Collections avec la méthode Item (qui est en fait le membre par défaut pour la classe Collection), mais ça semble cuit pour les Arrays :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With ThisWorkbook.Worksheets
        MsgBox .Item(1).Name
    End With
    Ok pour tes exemples. Ce qui me déroutais notamment c'est le tableau SafeArray1D. Bref, passons.
    Dernière modification par Invité ; 06/08/2013 à 04h33.

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

Discussions similaires

  1. problème instruction With avec le bouton commande
    Par cecilecedric dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/01/2009, 22h07
  2. Question sur instruction With imbriquée
    Par LadyWasky dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/10/2005, 11h26
  3. probleme d allocation avec un tableau de BYTE
    Par e1lauren dans le forum C++
    Réponses: 5
    Dernier message: 06/05/2005, 13h42
  4. [CR] instruction If avec deux opérations
    Par MaDmAtT dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 19/07/2004, 13h54
  5. Exception 'instruction privilégiée' avec TDLPort
    Par jphi5 dans le forum C++Builder
    Réponses: 21
    Dernier message: 11/11/2003, 16h40

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