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 :

Envoyer un tableau a unidimensinel vers Excel sans passer par une boucle [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 125
    Points
    125
    Par défaut Envoyer un tableau a unidimensinel vers Excel sans passer par une boucle
    Bonjour a tous,
    J’aimerais savoir si il est possible d’envoyer le tableau suivant vers excel sans passer par une boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim arrayA(1 to 3)
    arrayA(1) = 11
    arrayA(2) = 22
    arrayA(3) = 33
    remarquez qu’on est en presence d’un tableau a UNE seule dimension.

    Merci

  2. #2
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    bonjour,

    La réponse est oui en précisant la destination.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim arrayA(1 to 3)
    arrayA(1) = 11
    arrayA(2) = 22
    arrayA(3) = 33
    Range("A1:C1") = arrayA
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  3. #3
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Je serais plus réservé quant à la réponse,
    La réponse est oui en précisant la destination.
    est un faux ami, ça a l'air de marcher, mais dès que le contexte va évoluer ça n'ira plus forcément.
    C'est le cas ici où le code donné, dans le cas d'une plage en colonne et non en ligne, fournira un résultat sans planter (c'est là le danger), mais faux par rapport à ce qu'on en attend.

    Excel travaille toujours sur des tableaux à 2 dimensions, il suffit d'injecter une plage à 1 colonne en écriture directe pour s'en convaincre.

    Le reste relève de manipulations particulières qui peuvent donner le résultat voulu si on se fige dans un contexte particulier et qu'on sait exactement ce qu'on est en train de faire (utilisation de Tranpose dans le tuto).

    Tout ceci est décrit, exemples et dessins à l'appui dans cette partie du tuto sur les Array.

    http://didier-gonard.developpez.com/...vba/#LVIII-B-1

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  4. #4
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    bonsoir didier,

    l'exemple de code qui a été donné est assez indicateur de l'orientation du tableau à une dimension vers Excel. Un utilisateur qui connait un tant soi peu quelques fonctions de base d'Excel est censé imaginé que pour adapter le renvoi en colonne il doit passer par la fonction Transpose.

    je retiens le lien http://didier-gonard.developpez.com/...vba/#LVIII-B-1 donné comme référence prochainement en cas de question semblable. c'est très bien fait.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  5. #5
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Bonjour, voici une autre voie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub DemoTableauConstant()
    '   tableau en ligne :  (C1:E1)
        AR = [{11,22,33}]:  [C1].Resize(, UBound(AR)) = AR
     
    '   tableau  colonne :  (A1:A3)
        AR = [{11;22;33}]:  [A1].Resize(UBound(AR)) = AR
    End Sub
    Evidemment UBound(AR) peut être remplacé par 3 dans cet exemple …

    Ou bien encore directement affecter la plage de destination : [A1:A3] = [{11;22;33}]


    _____________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  6. #6
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Salut Ousmane,

    Tu as raison vu de notre fenêtre, c’est le peu de renseignements fournis par Bonero qui a motivé ma réponse.

    Comme Pierre Fauconnier le met dans sa signature, « VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... » et si on faisait un sondage sur la connaissance de Transpose au niveau des débutants (et moins) navigant sur le site, il y aurait sans doute des surprises. La découverte de nouvelles choses, en nous dévoilant l’abîme de notre ignorance, nous fait toujours nous considérer nous-même comme débutants selon certains critères, mais il y a des niveaux sous-jacents à ce critère.
    En Arts martiaux le débutant c’est la ceinture noire 1er dan, il possède juste les bases qu’il faut pour apprendre des choses sérieuses, en dessous on devrait parler d’apprenti, et pour marquer le franchissement des étapes préliminaires, on a inventé des codes de couleurs.
    Les fils ne manquent malheureusement pas, où dans ce genre de contexte, un demandeur serait capable de te répondre « vérifiez votre code" celui-ci ne marche pas chez-moi…vu que son besoin était justement une écriture en colonne, ce qui n’avait été pas précisé.

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    C'est intéressant tout ça.

    Pour ma part, je suis pleinement d'accord avec NVCfrm.
    Ici, il s'agit d'une array a UNE seule dimension. C'est a dire que la dimension 2 n'existe pas ici.
    C'est dans ce cas une array en largeur (type A1:C1 et non A1:A3).
    L'utilisation de transpose est dans ce cas unique une bonne méthode pour transposer les données dans le sens de la Hauteur.

    Excel travaille toujours sur des tableaux à 2 dimensions, il suffit d'injecter une plage à 1 colonne en écriture directe pour s'en convaincre.
    Malheureusement, je ne suis pas d'accord avec ça.
    Cependant, dans votre article, vous dites:

    Citation Envoyé par Ormonth
    Nous n'avons pas le résultat attendu : que se passe-t-il ?
    Sous VBA, les tableaux à une dimension sont en ligne par défaut, donc pour Excel, le code que nous venons d'écrire équivaut à : Range("I1:I5") = "Toto" (soit le premier index).
    Pour s'en convaincre, il suffit d'appliquer à tabArrayOrmonth sur la ligne suivante la fonction Transpose (de Feuille), pour que tout rentre dans l'ordre !
    Vous dites qu'avec une dimension, le VBA travaille en ligne, ce qui est vrai justement.

    Cela fait 2 versions différentes. L'une qui nous dit que le VBA travaille toujours avec 2 dimensions,
    et une autre qui nous dit que lorsque le VBA travaille avec une dimension (ce qui est justement possible), alors les données sont en ligne.

    Dans le cas de Bonero, c'est la version de votre article qui est la bonne.
    Une seule dimension est tout à fait possible.


    *****************************************************************************
    P.S.:
    Intéressant Marc-L les 2 types d'array. Une petite vérification indique que dans le cas n°1, AR ne contient qu'une seule dimension, ce qui est en accord avec le fait que:
    1 dimension = A1:C1 = en ligne

    La 2ème solution rajoute 1 dimension. Donc, on se retrouve avec 2 dimensions.

    Pour être plus clair.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    '   tableau en ligne :  (C1:E1)
        AR = [{11,22,33}]:  [C1].Resize(, UBound(AR)) = AR
        [G4] = UBound(AR, 1)
        [G5] = UBound(AR, 2) 'erreur 9, car cette dimension n'existe pas
     
    '   tableau  colonne :  (A1:A3)
        AR = [{11;22;33}]:  [A1].Resize(UBound(AR)) = AR
       [G8] = UBound(AR, 1)
       [G9] = UBound(AR, 2) 'pas d'erreur, on a 1 dimension qui s'est créé, ce qui a permis d'utiliser l'array sans fonction transpose.
    Pour retirer d'éventuelle ambiguïté,
    pour le tableau en ligne, le VBA générera 1 erreur lorsqu'il devra indiquait le nombre de case de la 2ème dimension, puisqu'elle n'existe tout simplement pas. (Il faut se servir de la gestion d'erreur dans ce cas et attribué 0 à la 2ème dimension en cas d'erreur 9)
    pour le tableau en colonne, le VBA indiquera le nombre de case de la 2ème dimension en cellule G9. Donc, il y a eu création d'une 2ème dimension par l'array utilisant les point-virgules. Il vaut mieux le savoir dans ce cas. L'array déclaré avec les point-virgule déclare une array verticale, alors que l'array déclaré avec les virgules, déclare l'array dans le sens horizontal qui est le sens natif des tableaux à une seule dimension.

    Je ne connaissais pas dutout la petite subtilité entre les virgules et point-virgules.

    En tout cas, ça montre et confirme que les tableaux unidimensionnels n'accepte que des array classique utilisant une syntaxe avec les virgules, sinon, une nouvelle dimension sera créé.

    Je rajouterai pour le cas à 2 dimensions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test()
    Dim arrayA() 'dynamique
     
    arrayA = Range("A1:A3")
    [J1] = UBound(arrayA, 1) '3
    [J2] = UBound(arrayA, 2) '1
     
     
    arrayA = Range("A1:C1")
    [K1] = UBound(arrayA, 1) '1
    [K2] = UBound(arrayA, 2) '3
     
    End Sub
    En dynamique, le redimensionnement du tableau se fait tout seul.
    Il faut noter la différence au niveau de l'option base automatique qui peut prendre plusieurs valeurs.
    Par exemple, dans le cas de Marc-L, l'option base passe implicitement à 1 alors qu'elle est a 0 pour les array basique (array dans le sens en largeur). Dans le cas d'une plage Range, l'option base passe à 1.
    Ce que je ne comprends pas, c'est pourquoi en déclarant:
    Il ne vois qu'une array horizontale alors que les crochets décrivent une range (ici horizontale à cause des virgules). On a bien qu'une dimension ici et pourtant, l'option base passe à 1 comme dans le cas d'une range !


    C'est assez ambigüe finalement tout ça.

    Citation Envoyé par Ormonth Voir le message
    La découverte de nouvelles choses, en nous dévoilant l’abîme de notre ignorance, nous fait toujours nous considérer nous-même comme débutants selon certains critères, mais il y a des niveaux sous-jacents à ce critère.

    Ça c'est bien vrai, surtout sous VBA ou même Excel. Tellement de chose à savoir que quelpars, on est un peu tous débutant sous certains critères.
    Dernière modification par AlainTech ; 13/07/2013 à 18h31. Motif: Fusion de 2 messages

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Citation Envoyé par Nouveau2 Voir le message
    Ce que je ne comprends pas, c'est pourquoi en déclarant:
    Il ne vois qu'une array horizontale alors que les crochets décrivent une range (ici horizontale à cause des virgules).
    Niet ‼

    Les crochets ne décrivent pas un Range, ce n'est que l'expression courte de la méthode Evaluate

    Une autre instruction peu prisée et pourtant si puissante …

    Exemple tiré de l'aide VBA de cette méthode :

    X = [SIN(45)] est l'équivalent de X = Evaluate("SIN(45)")

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Points : 2 553
    Points
    2 553
    Par défaut
    Et un tableau à 3 dimensions ?

  10. #10
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Citation Envoyé par NOuveau2
    Malheureusement, je ne suis pas d'accord avec ça.
    Nouveau2 , ça serait sympa de ne pas déformer mes propos, ce qui te conduit à n’être malheureusement pas d’accord avec ce que tu as mal interprété, donc finalement à être heureusement d’accord avec ce que j’ai réellement écrit (principe de la double négation).

    Quand je dis « Excel travaille toujours sur des tableaux à 2 dimensions » je parle d’Excel Feuille, ensuite quand je dis « Sous VBA, les tableaux à une dimension sont en ligne par défaut » je parle bien de l’action du VBA, ce qui dans de nombreux contexte est loin d’être la même chose. Ceci est lié aux pouvoirs d’interprétation croisés d’Excel d’une part et du VBA d’autre part, ceux-ci rentrant en conflits parfois d’ailleurs (dates par exemple).

    Donc Nouveau2 quand tu dis :
    Cela fait 2 versions différentes. L'une qui nous dit que le VBA travaille toujours avec 2 dimensions,
    et une autre qui nous dit que lorsque le VBA travaille avec une dimension (ce qui est justement possible), alors les données sont en ligne.
    Tu devrais retranscrire ce qui est dit à savoir :

    "Cela fait 2 versions différentes. L'une qui nous dit que le VBA qu’Excel travaille toujours avec 2 dimensions, et une autre qui nous dit que lorsque le VBA travaille avec une dimension (ce qui est justement possible), alors les données sont en ligne."

    Ce sur quoi on est du coup d’accord, il y a bien 2 comportements distincts.

    Sans aller plus loin ayant surement l’habitude des objets et de la fenêtre variables locales, tu pourras constater sur l’image jointe le comportement d’un Range (collections de cellule) dès que sa propriété Count dépasse 1.
    Nom : Ormonth Data-1.jpg
Affichages : 132
Taille : 136,0 Ko
    Je ne m’étendrais pas plus, le but des fils n’étant pas d’en faire des tutos.

    Sur cette citation de Lapalisse, je suis pleinement d’accord par contre :

    Citation Envoyé par Nouveau2
    il s'agit d'une array a UNE seule dimension. C'est a dire que la dimension 2 n'existe pas ici.
    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ah, désolé si j'ai déformé vos propos dans ce cas
    Oui, c'est vrai pour Excel.
    L'array du type array("10","20","30") n'a pas besoin de Excel (Tableau).

    Citation Envoyé par EngueEngue Voir le message
    Et un tableau à 3 dimensions ?
    Très bonne question. Je ne sais pas. Je vais essayer de donner un code qui va donner plusieurs solutions, mais pas sûr que ça marche. j'espère que ça ne générera pas d'erreur.

    Enfaite, je crois que le redimmensionnement automatique du tableau ne s'effectue qu'avec 1 ou 2 dimensions au Maxi (en tout cas, à ma connaissance). Avec 3 dimmensions, il faut être explicit et utiliser Redim.





    ************************************************************************************************




    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
    46
    47
    48
    49
    50
    51
    Sub test()
    Dim arrayA() 'dynamique
     
     
    ' Méthode 1
    arrayA = Range("A1:A3") ' Explicitement : arrayA(1 To 3, 1 To 1)
    [J1] = "arrayA(" & LBound(arrayA, 1) & " To " & UBound(arrayA, 1) _
    & ", " & LBound(arrayA, 2) & " To " & UBound(arrayA, 2) & ")" ' Littéralement : arrayA(1 To 3, 1 To 1)
    [J:J].Columns.AutoFit
     
    ' Méthode 2
    arrayA = Range("A1:C1") ' Explicitement : arrayA(1 To 1, 1 To 3)
    [K1] = "arrayA(" & LBound(arrayA, 1) & " To " & UBound(arrayA, 1) _
    & ", " & LBound(arrayA, 2) & " To " & UBound(arrayA, 2) & ")" ' Littéralement : arrayA(1 To 1, 1 To 3)
    [K:K].Columns.AutoFit
     
    ' Méthode 3
    arrayA = Range("A1:C3") ' Explicitement : arrayA(1 To 3, 1 To 3)
    [L1] = "arrayA(" & LBound(arrayA, 1) & " To " & UBound(arrayA, 1) _
    & ", " & LBound(arrayA, 2) & " To " & UBound(arrayA, 2) & ")" ' Littéralement : arrayA(1 To 3, 1 To 3)
    [L:L].Columns.AutoFit
     
    ' Méthode 4
    arrayA = Array("11", "22", "33") ' Explicitement : arrayA(0 To 2)
     
    On Error GoTo RE1
    aa = LBound(arrayA, 1) & " To " & UBound(arrayA, 1)
    RE1: If Err.Number = 9 Then aa = "0 To 0"
    Resume Next
     
    '--------------
    On Error GoTo RE2
    bb = LBound(arrayA, 2) & " To " & UBound(arrayA, 2)
    RE2: If Err.Number = 9 Then bb = "0 To 0"
    Resume Next
     
    '---------------
    [M1] = "arrayA(" & aa & ", " & bb & ")"
    [M:M].Columns.AutoFit
     
     
     
    ' Méthode 5
    ReDim arrayA(1 To 2, 1 To 2, 1 To 2)
    arrayA = Worksheets(2).Range("A1:A2")
    [G10] = "arrayA(" & LBound(arrayA, 1) & " To " & UBound(arrayA, 1) _
    & ", " & LBound(arrayA, 2) & " To " & UBound(arrayA, 2) _
    & ", " & LBound(arrayA, 3) & " To " & UBound(arrayA, 3) & ")" '
    [G:G].Columns.AutoFit
     
    End Sub

    Désolé pour le code, il est un peu long. Mais ça ne marche pas pour 3 dimensions.


    Citation Envoyé par Marc-L Voir le message
    Niet ‼

    Les crochets ne décrivent pas un Range, ce n'est que l'expression courte de la méthode Evaluate

    Une autre instruction peu prisée et pourtant si puissante …

    Exemple tiré de l'aide VBA de cette méthode :

    X = [SIN(45)] est l'équivalent de X = Evaluate("SIN(45)")

    Il faut que j'avoue que je me suis souvent demandé ce qui signifiait exactement les crochets. Je m'en sert pour les range et les variable texte justement parce que les crochets ont l'accuïté de supprimer les guillemets, mais je pensais qu'il ajoutait simultanément un Range.
    Dernière modification par AlainTech ; 13/07/2013 à 18h33. Motif: Fusion de 2 messages

  12. #12
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Citation Envoyé par Nouveau2 Voir le message
    L'array du type array("10","20","30") n'a pas besoin de Excel (Tableau).
    Pourquoi entre guillemets ?

    Pourquoi pas Array(10, 20, 30) ?

    Sinon c'est comme utiliser Split("10 20 30")

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  13. #13
    Invité
    Invité(e)
    Par défaut
    C'est une variable texte. Cela ne change pas grand chose ici pour nombre, mais ça changera pour des lettres.

  14. #14
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    bonsoir,

    @Didier:
    bonne conclusion:
    Sur cette citation de Lapalisse, je suis pleinement d’accord par contre :

    Citation:
    Envoyé par Nouveau2
    il s'agit d'une array a UNE seule dimension. C'est a dire que la dimension 2 n'existe pas ici.
    cordialement,
    Cette discussion semble sortir de son contexte.
    N'empêche que je vais faire quelques remarques par rapport à ceci:
    Quand je dis « Excel travaille toujours sur des tableaux à 2 dimensions » je parle d’Excel Feuille, ensuite quand je dis « Sous VBA, les tableaux à une dimension sont en ligne par défaut » je parle bien de l’action du VBA, ce qui dans de nombreux contexte est loin d’être la même chose. Ceci est lié aux pouvoirs d’interprétation croisés d’Excel d’une part et du VBA d’autre part, ceux-ci rentrant en conflits parfois d’ailleurs (dates par exemple).
    En réalité les notions de Uni, Bi ou Multi dimensions sont relatives.
    Tous les tableaux sont en fait des listes à une dimension pouvant ou non contenir d'autres liste par élément. On parle alors de bi ou tri ...
    Ceci étant, l’interprétation par le langage d'un array en ligne ou colonne n'est pas un pouvoir, mais un choix d'implémentation du langage.
    Ligne ou colonne sont plutôt des notions d'interface permettant d'orienter l'utilisateur.

    Peut-on vraiment affirmer en l'absence du code source qu'excel travaille vraiment sur des tableaux à 2 dimensions?
    Voici par exemple le code d'une classe nommée Feuille.
    La classe initialise un tableau à trois dimensions et impose la syntaxe semblable à celle d'Excel pour accéder ou affecter un élément du tableau.

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    Option Explicit
     
    Dim f As String
     
    Private Sub Class_Initialize()
     
        Dim Rows_, Columns_, Sheet_, n As Long, l As Long, c As Long, i
     
        Dim tb_row, tb2_col, tb3, table
        f = CurDir & "\lignes"
     
        ReDim Rows_(10) '11 élém
        ReDim Columns_(6) '7 élém
        Sheet_ = Array(Rows_, Columns_) '2 éléms contenant des élém
        Sheet_ = Array(Columns_, Rows_)
     
        tb_row = Rows_
        'maintenant subdidiviser tb_row
        For l = 1 To UBound(tb_row) 'l'élément 0 a été volontairement ignoré
            tb_row(l) = Columns_
            tb_row(l)(0) = "Ligne " & l
        Next
        tb_row(0) = "Lignes"
     
        'plus loin subdiviser chaque sous élémen de (tb_row)(columns_)
     
        For l = 1 To UBound(tb_row) 'l'élément 0 a été volontairement ignoré
            'tb_row(l) = Columns_
            'tb_row(l)(0) = "Ligne " & l
            For c = 1 To UBound(tb_row(l))
                tb_row(l)(c) = Rows_
                tb_row(l)(c)(0) = Chr(c + 64)
            Next
     
        Next
     
        'conceptualiser avec des valeurs
     
        For l = 1 To UBound(tb_row) 'l'élément 0 a été volontairement ignoré
            'tb_row(l) = Columns_
            'tb_row(l)(0) = "Ligne " & l
            For c = 1 To UBound(tb_row(l))
                'tb_row(l)(c) = Rows_
                'tb_row(l)(c)(0) = Chr(c + 64)
                For n = 1 To UBound(tb_row(l)(c))
                    tb_row(l)(c)(n) = tb_row(l)(c)(0) & l
                Next
            Next
     
        Next
     
        'enregistrons le tableau dans un fichier
        Open "lignes" For Binary As #1
            Put #1, 1, tb_row
        Close #1 'facultatif
     
    End Sub
     
    Property Get Lignes(ligne As Long, colonne As Long) As Variant
        Lignes = ReturnVal(ligne, colonne)
    End Property
     
    Property Let Lignes(ligne As Long, colonne As Long, Valeur As Variant)
        ReturnVal ligne, colonne, Valeur
    End Property
     
    Private Static Function ReturnVal(ligne As Long, colonne As Long, Optional Valeur As Variant = Null)
        Dim tb
     
        If Not IsArray(tb) Then
            Open "lignes" For Binary As #1
            Get #1, 1, tb
            Close #1
        End If
        If (ligne > 0 And colonne > 0) Imp (ligne <= UBound(tb)) Then
            If colonne <= UBound(tb(ligne)) Then
                If Not IsNull(Valeur) Then
                    tb(ligne)(ligne)(colonne) = Valeur
                    ReturnVal = Valeur
                Else
                    ReturnVal = tb(ligne)(ligne)(colonne)
                End If
            End If
        Else
            Err.Raise 9
        End If
     
    End Function
     
    Private Sub Class_Terminate()
     
        Reset
        Kill f
     
    End Sub
    en essayant d'accéder à l'unique interface "Lignes" de cette classe à partir d'un code placé dans un module standard comme ceci:
    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
    Sub test()
     
        Dim f As feuille, i
     
        Set f = New feuille
     
        i = f.Lignes(2, 1)
     
        f.Lignes(1, 3) = "Mytest"
     
        Msgbox f.Lignes(1, 3)
     
        Set f = Nothing
     
    End sub
    on voit que l'instruction "i = f.Lignes(2, 1)" donne l'impression d'accéder à un tableau à 2 dimensions dans le concept VB, alors qu'il n'en est rien du tout derrière le rideau.
    On croirait également que f.Lignes(0) n'existe pas.
    C'est que quelque part fort probablement, VBA Excel l'utilise et ne nous permet d'y accéder.
    Comme tu l'a dejà dit : "le but des fils n’étant pas d’en faire des tutos.", les explications sur les Array si on se laisse y aller, risquerait de pondre un livre in here

    Bien de choses à tous.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  15. #15
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonsoir Ousmane,

    J'analyserais ça demain, le contexte précis du fil a en effet évolué, mais le seul qui ne donne pas signe de vie est son concepteur, à savoir celui qui a posé la question, donc tant qu'on reste sur le domaine technique et qu'on fait avancer le schmilblick d'un certain côté, ce n'est pas négatif.

    En préambule, je reprendrais le § 2 de mon tuto sur les Array :
    http://didier-gonard.developpez.com/...s-tableau-vba/
    dont en particulier :
    Il ne s'agit pas non plus d'adopter un mode représentatif de la façon dont le langage stocke ces variables, ce serait une hérésie. Car, pour le gestionnaire de mémoire, il s'agit simplement d'adresses mémoire et il n'a aucune notion (à ce jour) de dimensions, il fonctionne en base deux. C'est l'esprit humain qui a besoin de conceptualisation.
    Je m’intéresse beaucoup à la conceptualisation (poussé en cela par la pédagogie lors des formations), ou bien comment faire saisir un concept à des gens que l'approche de certaines choses effraient ? Les paraboles sont une des solutions, mais pas universelle.

    Pour tout un tas de raisonnements, considérer que la terre est ronde est pratique, on sait qu'il n'en est rien en réalité, à l'arrêt tu te considères comme immobile, il n'en est rien, la terre tourne et se déplace et de façon conséquente, le principe de l'inertie fait que tu ne le ressens pas, ça ne veut pas dire que tu l'ignores.

    C'est l'approche que j'utilise suivant les niveaux pour faire passer les messages ou les saisir moi-même, comme j'évite de parler de classes à des gens qui n'ont pas de notion du modèle orienté Objet d'Office et du VBA, vu que je ne vois pas comment on peut aborder l'un avant l'autre

    rien que le fait de conceptualiser de façon imagée les array à 1, 2 ou 3 dimensions est une hérésie pour un mathématicien qui évolue normalement dans des espaces à n dimensions, cette représentation risque au contraire de bloquer le raisonnement pour les dimensions > à 3, mais comme le dis le tuto, si les gens deviennent à l'aise et utilisent les Array à 2 dimensions plutôt que les éviter, on a déjà fait un pas.

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  16. #16
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Bonjour Didier,

    J’admire sincèrement ton esprit philosophique, aux contradictions parfois déroutantes.
    Sans doute que tu me répondras: "cela fait partie des subtilités de cette doctrine".

    Ça me rappelle une dispute de petits et grands indiens avec un œuf. Cassée l’œuf par la base ou par le cône ne change strictement rien à l'action qui est "Casser".

    C'est l'approche que j'utilise suivant les niveaux pour faire passer les messages ou les saisir moi-même, comme j'évite de parler de classes à des gens qui n'ont pas de notion du modèle orienté Objet d'Office et du VBA, vu que je ne vois pas comment on peut aborder l'un avant l'autre
    Entièrement d'accord avec toi, je citerais ce principe de géométrie:
    "Pour tout n dans N, l’ensemble Rn est muni de sa topologie usuelle".

    Nous sommes d'accord sur le fait que: Excel pas plus que VBA ne considèrent un tableau comme une ligne ou une colonne. Juste une série d'éléments connexes, que je peux me représenter ici comme une ligne et ailleurs comme une colonne. Ce qui n'implique forcément pas que ma conception d'une colonne soit représentée par un aspect horizontal...

    Sur un plan, une ligne qu'on représente d'horizontal ou vertical est forcément une hérésie, si on ne se représente une base tirée d'un concept.
    On constate dès lors que le concept d'horizontalité ou verticalité ... est simplement superflue, puisque cela ne modifie en rien le fondement de la ligne qui reste le trait reliant 2 points dans un espace donné.

    Je ne suis pas un matheux, et je pensais vaguement que la notion de "Concept" est héritée des mathématiciens.
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  17. #17
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Surtout qu'en VBA une plage lignes par colonnes n'est pas qu'un tableau lignes par colonnes
    mais aussi une suite d'éléments (collection de cellules), sans intention de ranimer la flamme …
    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
    Const Plage = "C11:J20"
     
    Sub DemoSuite()
        With Range(Plage)
            .ClearContents
            For N& = 1 To .Count:  .Cells(N) = N:  Next
        End With
    End Sub
     
    '   Ces deux procédures sont équivalentes …
     
    Sub DemoTableau()
        With Range(Plage)
            .ClearContents
     
            For R& = 1 To .Rows.Count
                For C& = 1 To .Columns.Count
                    N& = N& + 1:  .Cells(R, C) = N
                Next C
            Next R
        End With
    End Sub

    ___________________________________________________________________________________________________
    Des chercheurs qui cherchent, on en trouve. Des chercheurs qui trouvent, on en cherche ! (Charles De Gaulle)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  18. #18
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour les agitateurs de neurones,

    C’est sûr que ce fil aurait mieux sa place, au final, dans le sous-forum « Conception » d’Excel

    En effet, vous avez raison je dirais que la vérité à un instant n’est que le mensonge nécessaire pour atteindre LA Vérité vraie qui se révèlera, bien sûr, n’être que celle de l’instant où on l’atteindra….

    Si vous considérez le Snapshot qu’il y a en # 11, vous reconnaîtrez que cette approche colle quand-même bien à la manipulation du concept à travers le VBA, cf Value2. D’ailleurs personne ne demande où est passée la propriété Value dans le coup ?

    N’étant pas programmeur de formation, je gratte et conceptualise selon le concept de vérité énoncé plus haut en faisant attention que ça n’en vienne pas à énoncer des erreurs grossières, mais peut-être des approximations acceptables. Excel lui-même procède à des arrondis dans ses calculs que d’aucuns trouvent trop grossiers, mais s’ils persistent dans cette voie, c’est qu’ils ne sont pas en face du bon outil pour accomplir le boulot voulu.

    Citation Envoyé par Marc-L
    Surtout qu'en VBA une plage lignes par colonnes n'est pas qu'un tableau lignes par colonnes
    mais aussi une suite d'éléments (collection de cellules)
    Oui et d’ailleurs tu es en train de parler, vu de ma fenêtre, de la façon fondamentale dont Excel se repère dans son référentiel de plage*, bref de la compréhension fine de la propriété Range.Item, du fait qu’elle sous-tend la notation Cells(Row, Column) en ayant bien en tête que le paramètre Column est optionnel.

    Le fait de faire des formations et d’écrire des tutos, mène à se pencher sur des trucs qui, non indispensables, sont intéressants et marrants au niveau conceptuel voir : L’énigme du jour zéro dans le tuto sur les dates

    Vouloir se pencher sur le comment ça fonctionne, n’est pas simple effectivement.

    Je tenterais donc, pas l’avenir, de dire selon ma façon de voir et d’être moins affirmatif, même si à un niveau débutant faut bien jeter des bases.

    Pour conclure, je dirais que tout le monde sera d’accord sur le fait que : "de compter sur ces doigts, ce n’est pas Chinois ».... encore que, êtes-vous d’accord avec ceci ? (cliquer sur l'image avant le lien)

    Nom : Ormonth Data-1.jpg
Affichages : 105
Taille : 16,3 Ko

    http://www.chine-nouvelle.com/ressources/compter-avec-les-mains.html

    cordialement,

    Didier

    *(pour moi, en gestion de cellules, une feuille n’est pas une feuille telle que les gens la voient souvent, mais un référentiel de plage au nombre d’éléments de cellules variable. Ceci m’est devenu évident avec l’apparition de 2007, si tu es ou non en mode compatibilité, tu as toujours une feuille sous Excel 2007, mais ton référentiel de plage n’a rien à voir)
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  19. #19
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    D'accord avec ton astérisque !

    J'ai est vu certains déboussolés rien que par la propriété CurrentRegion

    Oserais-je conclure par une maxime ?

    _____________________________________________________________
    On ne dit pas une biroute mais une route à deux voies …


    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  20. #20
    Invité
    Invité(e)
    Par défaut Bonsoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim arrayA(3, 1)
    arrayA(O, O) = 11
    arrayA(1, 0) = 22
    arrayA(2, O) = 33
    Range("A1:A3") = arrayA

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/05/2014, 11h47
  2. Exporter les données vers excel sans passer par un agent
    Par debdev dans le forum Lotus Notes
    Réponses: 3
    Dernier message: 04/10/2013, 00h10
  3. Réponses: 3
    Dernier message: 30/04/2009, 14h06
  4. convertir un tableau en une liste sans passer par une boucle
    Par sallemel dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 04/12/2008, 22h04
  5. Réponses: 6
    Dernier message: 20/11/2008, 15h55

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