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 :

[]assigner 1 tableau à 1 autre tableau


Sujet :

VBA

  1. #1
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 257
    Points : 19 407
    Points
    19 407
    Billets dans le blog
    62
    Par défaut []assigner 1 tableau à 1 autre tableau
    Bonjour,

    Tout est dans le titre !

    Question n°1:

    par exemple si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim t1(1 to 5) As Integer
    Dim t2(1 to 5) As Integer
     
    .....
    Y a-t-il 1 moyen de faire:

    sans avoir a parcourir tous les indices !

    Merci par avance !

    Question n°2

    Autre question sous Excel puis-je faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim r As Range
    Dim t() As Integer
     
     
    r=t     ' sous certaines conditions
     
    ou t=r
    Pouvez vous m'éclairer sur ces 2 questions:

    Merci par avance,

    User
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Reponse 1:
    Oui, tout à fait vu que tes tableaux onts le même format.

    reponse 2:
    Non, tu n'a pas les 2 même type, tu devrais te récupérer une erreur 13 type "mistmatch"
    tu est en effet obliger de donner un indice à t, et, de plus, il faut que tu dimentionne celui-ci avant de le remplir.

    salut
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Re: assigner 1 tableau à 1 autre tableau
    Bonjour,
    Citation Envoyé par User
    Question n°1:

    par exemple si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim t1(1 to 5) As Integer
    Dim t2(1 to 5) As Integer
     
    .....
    Y a-t-il 1 moyen de faire:

    sans avoir a parcourir tous les indices !
    Si je comprends bien, il s'agit de COPIER le contenu de t1 dans t2.
    Eh bien non, en VB l'opérateur d'affectation ne le permet pas.

    Citation Envoyé par User
    Question n°2

    Autre question sous Excel puis-je faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim r As Range
    Dim t() As Integer
     
     
    r=t     ' sous certaines conditions
     
    ou t=r
    Tu peux exécuter r=t, en sachant que t peut être un tableau à 1 ou 2 dimensions.

    Cas où t est un un tableau à 1 seule dimension:
    r doit comporter autant de cellules horizontales contigües que t comprend de valeurs.
    Si les celulles du range sont disposées verticalement, alors il faut transposer t:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r=worksheetfunction.Transpose(t)
    Cas où t est un un tableau à 2 dimensions:
    La structure bidimensionnelle de r doit être "compatible" avec celle du tableau t.


    Tu ne peux pas exécuter t=r.
    Eventuellement, tu pourrais récupérer dans une variable de type Variant un tableau bidimensionnel des valeurs des cellules d'un range:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim t as variant
    t=r.Value
    =JBO=

  4. #4
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut Re: assigner 1 tableau à 1 autre tableau
    Citation Envoyé par JBO
    Si je comprends bien, il s'agit de COPIER le contenu de t1 dans t2.
    Eh bien non, en VB l'opérateur d'affectation ne le permet pas.
    en exel alors par-ce qu'en vb6, je suis sûr que ça marche.


    salut
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 257
    Points : 19 407
    Points
    19 407
    Billets dans le blog
    62
    Par défaut
    Merci à tous pour vos infos !

    Donc en résumé (en dehors d'excel):

    Il est impossible d'assigner 1 tableau t1 à 1 autre tableau t2 (de même dimensions) sans passer par les indices:

    un truc du style:
    t1=t2 est impossible en vb !

    Vous n'êtes pas tous d'accord sur le sujet est-ce exact !

    Pouvez-vous me préciser !

    @+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Février 2003
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2003
    Messages : 95
    Points : 85
    Points
    85
    Par défaut
    Bonjour.

    Je confirme que si les tableaux sont de types et de dimensions identiques, l'instruction :fonctionne correctement.

    Cordialement,

    Mathieu Driesbach.
    Un verre vide se plaint, un verre plein se vide ...

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    JBO a écrit:
    Si je comprends bien, il s'agit de COPIER le contenu de t1 dans t2.
    Eh bien non, en VB l'opérateur d'affectation ne le permet pas.

    méphistopheles a écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    en exel alors par-ce qu'en vb6, je suis sûr que ça marche.
    Donc je conclus : dans Excel, je confirme, tu peux faire t1=t2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    T1 = Array("Janvier", "février", "Mars", "Avril", "Mai")
    T2 = T1
    MsgBox T2(3)
    C'était une question VB ? Alors je ne sais pas...

    A+

  8. #8
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    merci ouskel... j'étais pas sûr par-ce que je fait trés peu de vba...

    je me demande de quel programme parle jbo....

    salut
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  9. #9
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 257
    Points : 19 407
    Points
    19 407
    Billets dans le blog
    62
    Par défaut
    Merci pour tout !

    mais sous vb5 ca ne fonctionne pas

    "Cant assign to array !"

    Désolé !
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  10. #10
    Membre éprouvé Avatar de avigeilpro
    Homme Profil pro
    Ambulancier
    Inscrit en
    Janvier 2004
    Messages
    880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Ambulancier
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2004
    Messages : 880
    Points : 971
    Points
    971
    Par défaut
    Dans MSND il est précisé que cela ne fonctionne pas, mais que l'on peut la passer dans une variable definie en Variant, qui après l'assignation se comportera comme un tableau.
    Et ceci est la seule façon de proceder (sauf le passage valeur par valeur)
    La connaissance seule ne suffit pas. La vraie compréhension vient de la mise en expérience.
    Règles|FAQ|Tuto

  11. #11
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Tu ferais mieux de tester par toi-même, cela te ferait gagner du temps et t'éviterait de lire des aneries -
    de plus une bonne utilisation de la msdn ou de la touche F1 serait également plus fiable et plus précise qu'on ne le sera jamais.

    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
    Sub testAffectation()
        Dim plage As Range, tmp
     
        'Affectation d'une matrice dim 1 à un range
        tmp = Split("1,2,3,4,5,6,7,8,9", ",")
        ' range non formaté en fct du tableau => réplication verticale
        Set plage = [Feuil1!A1:D10]
        plage = tmp
     
        'range formaté
        Dim a As Long
        a = UBound(tmp) + 1
        Set plage = Worksheets("Feuil1").Range("A20").Offset(0, 0).Resize(1, a)
        plage = tmp
     
        'transposition d'un tableau à 1 dimension
        Set plage = Worksheets("Feuil1").Range("F1").Offset(0, 0).Resize(a, 1)
        plage = Application.WorksheetFunction.Transpose(tmp)
     
        'Affectation direct d'un tableau à un tableau
        Dim temp
        temp = tmp
        Set plage = Worksheets("Feuil1").Range("A30").Offset(0, 0).Resize(1, a)
        plage = temp
     
        ' Affectation d'une matrice à 2 dim à un range
        Dim x As Long
        ReDim temp(1 To a, 1 To 1)
        For x = 1 To a
            temp(x, 1) = tmp(x - 1)
        Next
        Set plage = Worksheets("Feuil1").Range("H1").Offset(0, 0).Resize(a, 1)
        plage = temp
     
        ' si range non formaté en fct du tableau => réplication horizontale
        Set plage = [Feuil1!J1:M10]
        plage = temp
    End Sub
    Content également d'apprendre que ce n'est pas possible sous VB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Form_Load()
        Dim tmp, temp
     
        tmp = Split("1,2,3,4,5,6,7,8,9", ",")
     
        temp = tmp
        MsgBox temp(1)
    End Sub
    Le type variant est peut-être une abhération du fait de la permicivité qu'il induit
    mais c'est aussi ce qui permet l'affectation directe d'un type à un autre - un variant prend le type du modèle copié :
    ex : si var 1 est un object et var2 un variant, à la suite d'une affectation directe de var1
    var2 sera un object. etc.
    idem pour un tableau

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut [VB][VBA Excel] Affectation de tableaux
    Bonjour,
    Citation Envoyé par DarkVader
    Tu ferais mieux de tester par toi-même, cela te ferait gagner du temps et t'éviterait de lire des aneries [..]
    Voilà qui est désobligeant, surtout pour un forum d'entraide.
    Mais bon... on dira que c'était dans le feu de l'action et de la passion.

    Pour ma part, je n'aime pas rester sur des "à peu près" ou des "je suis sûr" non démontrés. Je veux savoir avec certitude à quoi je dois m'en tenir quand je programme. Comme vous tous, j'en suis certain.

    Alors, éclairé par les posts qui déclaraient l'affectation possible, j'ai creusé le sujet.
    Je peux formellement certifier que mes réponses sont justes vis à vis de la question posée.

    Mais je pense maintenant que User trouverait une solution simple au problème en utilisant des tableaux non pré-dimensionnés (ça c'est pour VB/VBA) et non typés (ça c'est pour VBA Excel).
    ... on n'est plus très loin d'un Variant .

    Question n°1:
    Pour COPIER un tableau dans un autre, sans avoir à parcourir les indices...
    ne pas dimensionner le tableau de destination de l'affectation.
    Si l'opérande gauche de l'opérateur d'affectation est un tableau pré-dimensionné, alors la compilation échoue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim t1() As Integer 
    Dim t2(1 To 5) As Integer 
     
    t1=t2
    Question n°2:
    Pour copier d'un tableau t typé (ici Integer) vers un Range, pas de problème.
    Pour copier un Range vers un tableau... il ne faut pas typer le tableau.
    Typer le tableau provoque une erreur à l'exécution, type incompatible (même si le contenu des cellules semble a priori compatible):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim r As Range 
    Dim t() As Variant
     
    r=t    ' r accepte que t soit à 1 ou 2 dimensions
    t=r    ' après affection, t contient un tableau à 2 dimensions
    Sémantique de l'affectation:
    Appliquée à un tableau, l'affectation effectue une copie mémoire de l'opérande droite (le tableau source) avant d'assigner ce "nouveau" tableau à la variable désignée par l'opérande gauche.
    Autrement dit, après avoir affecté t2=t1, la zone mémoire désignée par t2 est bien différente de la zone mémoire désignée par t1.

    Démonstration ci dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Tableau_SémantiqueAffectation()
        Dim t1(1 To 3) As Integer, t2() As Integer
     
        t1(1) = 1: t1(2) = 2: t1(3) = 3
     
        t2 = t1
     
        ReDim Preserve t2(1 To 4)
     
        t2(4) = 4
     
        ' Quelle est la dimension de t1() ???
        Debug.Print t1(4), t2(4)
    End Sub
    C'est ce que j'ai appris en creusant le sujet.

    Bonne lecture à tout ceux que ça intéresse.

    =JBO=

  13. #13
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    C'est mieux mais mon coup de gueule s'adressait aussi au fait
    que beaucoup ne prend même pas la peine d'effectuer des tests simples
    qui permettrait pourtant de casser des clichés en 2 coups de cuiller à pot.

    Pour en revenir à nos moutons, tu commences à saisir ici toute la philosophie du variant
    pour lequel on a également des permissivités d'affectation
    - pour les recordsets avec le getrows d'access
    (problème, les tableaux excel initialisés de 1 à n en lignes puis colonnes ont un format différents de ceux d'access
    qui utilise entre autre des tableaux initialisés à 0) ou
    - pour les chaines de texte utilisant comme séparateurs la tabulation ou le retour de ligne
    - ou encore les tableaux html.

    Pas joli tout ça pour les puristes mais tellement efficace en rapidité de développement - après tout, c'est le but de VB.


    Ps: certaines permissivités d'affectation directe ne sont pas permises qu'avec les version supérieure à XL97

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Salut Dark,
    qu'entends-tu par
    Ps: certaines permissivités d'affectation directe ne sont pas permises qu'avec les version supérieure à XL97
    ?

    Merci

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

Discussions similaires

  1. [Smarty] Affecter un tableau à un autre tableau
    Par valkiki dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 29/01/2012, 23h44
  2. [XL-2010] Extraction valeurs tableau vers autre tableau (avec filtrage)
    Par raphdc dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/09/2011, 14h46
  3. recherche valeurs d'un tableau dans autre tableau
    Par gct70 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 05/06/2010, 10h48
  4. Intégrer un tableau à un autre tableau en C
    Par alphenix dans le forum C
    Réponses: 3
    Dernier message: 16/04/2007, 21h56
  5. Intégrer un tableau à un autre tableau en C
    Par alphenix dans le forum C
    Réponses: 1
    Dernier message: 16/04/2007, 01h16

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