Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/09/2011, 11h10   #1
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
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 :
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
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 11h49   #2
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 939
Points : 7 939
bjr,

à tester :
Code :
    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
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 15h16   #3
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
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 :
  Tableau() = Range(resul).Value
Pourtant je croyais que le type Variant acceptait tous les types de données.


Code :
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
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 15h23   #4
Membre éclairé
 
Avatar de tototiti2008
 
Inscription : octobre 2008
Messages : 327
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 327
Points : 320
Points : 320
Bonjour Alfred,

enlève les parenthèses derrière Tableau

Code :
Tableau = Range(resul).Value
Edit : D'ailleurs tu peux aussi les enlever à la déclaration de la variable, un variant peut contenir un tableau
__________________
tototiti2008 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 15h36   #5
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
Merci tototiti2008 ,

Mais ça ne change rien malheureusement...
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 15h46   #6
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
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
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 15h57   #7
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
[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 :
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 :
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()!
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h10   #8
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
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 :
Tableau() = Range("A1:B1").Value
Mais je n'arrive pas à utiliser mes variables resul et resul2...
Par exemple, ce code ne fonctionne pas :
Code :
Tableau() = Rangeresul:resul2).Value
Est-ce qu'il est possible de les utiliser ?

Merci d'avance.
Alfred
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h16   #9
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Bonjour,

essaie de décortiquer ce code
Code :
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.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/09/2011, 16h16   #10
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
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 :
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
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h20   #11
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
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 :
1
2
3
4
5
Sub bibi()
Dim zozo
zozo = Range("C8:D8").Value ' C8 : D8
MsgBox IsArray(zozo)
End Sub
Code :
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
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h29   #12
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
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
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h51   #13
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
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) :
Citation:
12 Didier
13 toto
14 zaza
code à tester avec les différents types (ou comment obtenir une incompatibilité de type) :

Code :
1
2
3
4
5
6
Sub Typalarray()
Dim tboMontab As Variant 'As String 'As long
 
tboMontab = Range("E13:F15")
 
End Sub

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 16h51   #14
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
OK. Merci Didier.

Je crois que je ne m'en sortirai pas... Je déprime franchement, là.
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 17h00   #15
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
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
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h01.


 
 
 
 
Partenaires

Hébergement Web