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 :

copie entre excel et VBA via variable tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut copie entre excel et VBA via variable tableau
    Bonjour,

    Je fais des tests pour essayer de comprendre le principe des tableaux en VBA.

    Le code ci-dessous devrait me permettre de mettre les données contenues dans la plage "A8: D8" dans vTableau puis de les restituer dans la feuille excel à partir de la cellule "B1"...
    En tous cas, c'est ce que j'essaie de faire !!

    Or, je ne récupère que les données de la cellule "A8".

    Est-ce que vous pourriez m'expliquer pourquoi ?

    Merci d'avance.
    Alfred

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub ExcelVersArray2()
     
        Dim vTableau() As Variant
        vTableau = Range("A8:D8")
     
        Range(Cells(1, 2), Cells(UBound(vTableau, 1), UBound(vTableau, 2))) = vTableau
     
    End Sub

  2. #2
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    bjr,

    à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Range(Cells(1, 2), Cells(UBound(vTableau, 1), 1 + UBound(vTableau, 2))) = vTableau
    vu que la première cellule est en colonne 2, il faut ajouter 1 à la deuxième cellule de destination

  3. #3
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut
    Oups, désolé, je n'avais rien dans les cellules A8: D8... Les données étaient en A7: D7...

    Bonjour


    J'ai un autre soucis qui doit être du même type, mais je ne comprends pas comment y palier...

    J'ai un message d'erreur 'incompatibilité de type' à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Tableau() = Range(resul).Value
    Pourtant je croyais que le type Variant acceptait tous les types de données.


    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
    Private Tableau() As Variant
     
    Sub Worksheet_change(ByVal Target As Range)
     
    ReDim TablTest(1 To 10)
     
    'Si un cellule de la colonne 'O' est modifiée (colonne n°12)
    If Target.Column = 2 Then
     
        'On déclare les variables ligneLong et ligneCourt
        Dim ligneLong, ligneCourt, resul, resul2
     
        'On récupère l'adresse de la ligne modifiée
        ligneLong = Target.Address
        'On coupe l'adresse pour ne garder que le numéro de la ligne
        ligneCourt = Mid(ligneLong, 4)
     
     
        resul = "A" + ligneCourt
        resul2 = "B" + ligneCourt
        Tableau() = Range(resul).Value
        Tableau() = Range(resul2).Value
     
    End If
     
    End Sub

    Alfred

  4. #4
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 148
    Billets dans le blog
    2
    Par défaut
    Bonjour Alfred,

    enlève les parenthèses derrière Tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau = Range(resul).Value
    Edit : D'ailleurs tu peux aussi les enlever à la déclaration de la variable, un variant peut contenir un tableau

  5. #5
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut
    Merci tototiti2008 ,

    Mais ça ne change rien malheureusement...

  6. #6
    Expert confirmé
    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
    Par défaut
    Bonjour,


    Alfred23, tu ne peux pas écrire comme tu l'as fait, tu ne peux affecter le contenu d'une seule cellule ainsi si c'est ce que tu veux faire...

    vois ceci : http://didier-gonard.developpez.com/...u-vba/#LVIII-C

    cordialement,

    Didier

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    [EDIT] Suite à un bug (?), ceci est une réponse à un post qui n'existe plus...à supprimer donc??


    Il semble que tu n'aies qu'une idée assez floue de ce qu'est un tableau. Je vais essayer de te l'expliquer d'après ce que j'en sais (mais peut-être aie-je tort sur certains points donc merci de me corriger si tel est le cas).

    A la base, un tableau est un moyen de regrouper un ensemble de variables d'un même type.
    Une manière simple d'illustrer cela est de prendre l'exemple de coordonnées cartésiennes. Chaque fois que l'on veut représenter un point on doit donc lui associer un doublet de coordonnées (x,y). Imaginons que l'on aie 3 points à gérer (A,B,C). Sans tableau, on devrait manipuler chacune des coordonnées indépendamment, ce qui dans mon cas en fait 6 en tout. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim A_x, A_y, B_x, B_y, C_x, C_y As Double
    A_x = 0.25
    A_y = 0.5
    B_x = 0.5
    B_y = 0.75
    C_x = 0.75
    C_y = 0.25
    Toujours avec le même exemple imaginons que veuille translater tous mes points de 1 en abscisse. Il faudrait donc que j'écrive les opérations pour chacun de mes 3 points!

    Utilisons donc maintenant un tableau de 3 "lignes" et 2 "colonnes" (je mets de guillemets car dans la mémoire physique de l'ordinateur il n'y a pas de lignes et de colonnes, seulement des adresses mémoires qui se suivent):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim tblCoordonnees(0 To 2, 0 To 1) As Double
    tblCoordonnees = Array((0.25, 0.5), (0.5, 0.75), (0.75, 0.25))
     
    Dim i As Long
    For i=0 To 2
       Array(i,0) = Array(i, 0) + 1
    Next i
    C'est beaucoup plus rapide. Et encore là c'est pour 3 points, mais imagine avec des centaines, des milliers ou des millions de points!

    Tout cela est possible parce que tous les éléments du tableau sont du même type et ont la même taille en mémoire. Pour le type que j'avais choisi (Double), la taille d'une variable est de 8 octets. Donc si j'ai un tableau de n doubles et que je veux accéder à l'élément i, c'est possible car l'adresse mémoire de l'élément i est (schématiquement):

    Adresse élément i = Adresse élément 0 + i*8 octets


    Toutes ces explications ont pour but de te montrer l'intérêt des tableaux et la nécessité que les éléments du tableau soient tous d'un type bien déterminé (sinon impossible de les repérer dans la mémoire physique).

    Le type 'Variant' n'existe pas en fait et je pense qu'il est déterminé à la compilation (si quelqu'un peut confirmer...).


    Pour en revenir à tes moutons, ça plante à la compilation parce que Tableau() ne représente rien. Un tableau n'est qu'un groupe de variables d'un type déterminé organisé de telle façon qu'on puisse facilement énumérer ses éléments et y accéder.

    Tableau(1), Tableau(2),...., Tableau(10) sont tous des variables certain type (celui de la propriété Value de tes cellules donc String, Long, Double...) mais pas Tableau()!

  8. #8
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut
    Merci Didier !

    Effectivement, je ne savais pas qu'on ne pouvait pas affecter le contenu d'une seule cellule.

    Merci aussi pour ton tuto sur les tableaux ! Je vais l'étudier de près.

    J'ai fait des tests en suivant tes instructions, et ça, ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau() = Range("A1:B1").Value
    Mais je n'arrive pas à utiliser mes variables resul et resul2...
    Par exemple, ce code ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau() = Rangeresul:resul2).Value
    Est-ce qu'il est possible de les utiliser ?

    Merci d'avance.
    Alfred

  9. #9
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    essaie de décortiquer ce code
    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
    Sub Worksheet_change(ByVal Target As Range)
    'Déclaration d'un tableau à 2 éléments
    Dim Tablo(1 To 2) As Variant
    'Déclaration des variables Ligne, resul1 et resul2
    Dim Ligne As Long, resul1 As String, resul2 As String
     
        'Si une cellule de la colonne 'L' est modifiée (colonne n°12)
        If Target.Column = 12 Then
            'On récupère le numéro de ligne
            Ligne = Target.Row
            'On définit l'adresse de la cellule qui contient le premier résultat
            resul1 = "A" & Ligne
            'On définit l'adresse de la cellule qui contient le deuxième résultat
            resul2 = "B" & Ligne
            'On affecte le premier résultat au premier élément du tableau
            Tablo(1) = Range(resul1).Value
            'On affecte le deuxième résultat au deuxième élément du tableau
            Tablo(2) = Range(resul2).Value
            'On visualise le résultat
            MsgBox "Tablo(1) = " & Tablo(1)
            MsgBox "Tablo(2) = " & Tablo(2)
        End If
    End Sub
    Cordialement.

  10. #10
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut
    Didier,

    En fait ça fait des jours que j'essaie de copier des données dans un tableau, mais je commence à me demander si ce que je veux faire est vraiment possible...

    Je vais te l'expliquer comme ça je ne perdrai pas plus de temps si c'est impossible à faire !

    Merci d'avance pour tes explications.

    Alfred

    Le code suivant me permet de copier les valeurs de certaines cellules SI une cellule de la colonne 12 a été modifiée. Ça fonctionne mais je voudrais non pas utiliser copy/paste, mais mettre les données dans un tableau sachant que les cellules que je veux copier sont sur la même ligne mais elles ne sont pas contigües.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub Worksheet_change(ByVal Target As Range)
     
    Dim Tableau() As Variant
     
    'On déclare les variables ligneLong et ligneCourt
    Dim ligneLong, ligneCourt
     
     
    If Target.Column = 12 Then
        'On récupère l'adresse de la ligne modifiée
        ligneLong = Target.Address
        'On coupe l'adresse pour ne garder que le numéro de la ligne
        ligneCourt = Mid(ligneLong, 4)
        'On copie les cellules dont on a besoin dans la ligne précédement sélecionnée
        Range("O" & ligneCourt & ",D" & ligneCourt & ",E" & ligneCourt & ",F" & ligneCourt).Copy
     
    End If
     
    End Sub

  11. #11
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Pour info, voir le lien vers Sykyraod dans le tutoriel précédemment cité => très précieux

    Sinon pour montrer, si besoin en est que l'utilisation de Variables tableau est native et fondamentale dans Excel, on va juste se servir de la propriété Value de l'objet Range qui est, on en conviendra, des plus utilisée.

    On n'est pas plus explicite volontairement au niveau code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub bibi()
    Dim zozo
    zozo = Range("C8:D8").Value ' C8 : D8
    MsgBox IsArray(zozo)
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub bobo()
    Dim zozo
    zozo = Range("C8").Value
    MsgBox IsArray(zozo)
    End Sub

    Alfred23 ceci explique ton dernier souci, c'est un comportement natif d'Excel

    cordialement,


    Didier

  12. #12
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Citation Envoyé par Alfred23
    Le code suivant me permet de copier les valeurs de certaines cellules SI une cellule de la colonne 12 a été modifiée. Ça fonctionne mais je voudrais non pas utiliser copy/paste, mais mettre les données dans un tableau sachant que les cellules que je veux copier sont sur la même ligne mais elles ne sont pas contigües.
    On ne peut pas alimenter un array avec une plage discontinue directement.

    Il faut passer alors par une boucle pour l'alimenter..

    cordialement,

    Didier

  13. #13
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Citation Envoyé par Sclarckone
    ....la nécessité que les éléments du tableau soient tous d'un type bien déterminé (sinon impossible de les repérer dans la mémoire physique).

    Le type 'Variant' n'existe pas en fait et je pense qu'il est déterminé à la compilation (si quelqu'un peut confirmer...).
    Si justement, le type Variant est obligatoire pour les transferts directs, par exemple contenu de notre plage (obligatoire de base, indépendamment de la nature du contenu) :
    12 Didier
    13 toto
    14 zaza
    code à tester avec les différents types (ou comment obtenir une incompatibilité de type) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Typalarray()
    Dim tboMontab As Variant 'As String 'As long
     
    tboMontab = Range("E13:F15")
     
    End Sub

    cordialement,

    Didier

  14. #14
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Par défaut
    OK. Merci Didier.

    Je crois que je ne m'en sortirai pas... Je déprime franchement, là.

  15. #15
    Expert confirmé
    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
    Par défaut
    Bonjour,

    pas de déprime, tu boucles simplement sur ta plage non contigüe avec un for each et tu alimentes ton tableau avec des variables compteur, il doit y avoir ça dans le tuto de Silkyraod ou du genre http://silkyroad.developpez.com/vba/tableaux/#LXIV-F


    ça paraît lourd, mais c'est simple en écriture

    cordialement,

    Didier

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

Discussions similaires

  1. Liaison entre Excel(E03- VBA) & DB AS400 (ADO)
    Par Godzestla dans le forum AS/400
    Réponses: 11
    Dernier message: 20/01/2009, 14h46
  2. Insérer un Tableau excel dans Word via VBA depuis Excel
    Par Godzestla dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 14/05/2008, 08h52
  3. Erreurs d'approximation entre Excel et VBA
    Par smassart dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 16/04/2007, 11h13
  4. Interraction entre Excel et Access via VB
    Par hat_et_m dans le forum Access
    Réponses: 3
    Dernier message: 05/06/2006, 16h33

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