Créer un Range avec une variable tableau, c'est possible ?

SERIEUXETCOOL

XLDnaute Occasionnel
Bonjour le Forum,

Dans l'avancement de mon projet je bute sur un point important. Un coup de main, un conseil serait le bienvenu.

L'idée est la suivante :

Je créer un tableau dynamique, le redimensionne et le remplit. Jusque la tout va bien. J'obtiens donc une variable Tableau qui contient des éléments.

Ensuite je souhaite créer un Tableau Croisé Dynamique (TCD) à partir de ma variable Tableau précédente. Le problème se pose au niveau de la définition du "SourceData". Je ne sais pas comment sélectionner l'intégralité de ma variable Tableau sans passer par un Range classique.

La seule solution que j'ai trouvé, est de transférer tout le contenu de ma variable Tableau dans une feuille Excel, puis de mettre le "SourceData" comme un Range sur toute la plage.

Sauf que moi je ne veux justement pas transférer le contenu de ma variable Tableau dans une Feuille Excel ! Cette variable Tableau est dynamique et peut contenir environ 10 000 lignes sur 8 colonnes. Ça alourdit le fichier, et surtout ça augmente considérablement les temps de calculs si je transfère le contenu de la variable Tableau dans la feuille Excel. De plus je n'ai pas besoin d'avoir les 10 000 lignes de données, c'est complètement inutile.

Je place ci-après un bout de code qui illustrement de manière simple mon problème.

Code:
Option Explicit

Sub TEST()

Dim i As Long 'Déclaration des variables
Dim Tableau As Variant

ReDim Tableau(1 To 5, 1 To 3) As Variant 'On définit la taille et la dimension du tableau dynamique

'On remplit le tableau dynamique
For i = 1 To 5
    Tableau(i, 1) = 1
    Tableau(i, 2) = 2
    Tableau(i, 3) = 3
Next

Range(Cells(1, 1), Cells(UBound(Tableau, 1), UBound(Tableau, 2))) = Tableau 'On transfère les éléments du tableau dans la feuille de calcul

'=========================================================================================
'Crétion du Tableau Croisé Dynamique
'=========================================================================================
Sheets.Add 'On ajoute une feuille qui va contenir le TCD

'On ajoute le TCD
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=Sheets(ActiveSheet.Index + 1).Range("A1:C5"), _
Version:=xlPivotTableVersion12).CreatePivotTable TableDestination:=Range("A1"), _
TableName:="Tableau croisé dynamique", DefaultVersion:=xlPivotTableVersion12

End Sub


Voila, j'espère avoir été clair... N'hésitez pas à demander plus d'infos si besoin est. Je reste dans les parages.


Bien cordialement,

André


Ps : Bonnes fêtes de pâques
 

Pièces jointes

  • TABLEAUX ET RANGE.xlsm
    19.2 KB · Affichages: 65

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Créer un Range avec une variable tableau, c'est possible ?

Misange, peux tu être un peu plus explicite ?

Je dois pouvoir attribuer des nom de plages pour les séries du graphique. Mais comment pourrais-je m'en sortir ensuite ? Un exemple simple à proposer peut être ?
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Créer un Range avec une variable tableau, c'est possible ?

Pour Dranreb, mon tableau est construit par vba avec le code suivant :

Code:
Dim Tableau As Variant

ReDim Tableau(1 To Fin, 1 To 8) As Variant 'On définit la taille et la dimension du tableau dynamique

'On remplit le tableau dynamique
For i = 1 To Fin
    Tableau(i, 1) = 1
    Tableau(i, 2) = 2
    Tableau(i, 3) = 3
    Tableau(i, 4) = 4
    Tableau(i, 5) = 5
    Tableau(i, 6) = 6
    Tableau(i, 7) = 7
    Tableau(i, 8) = 8
Next

Sauf qu'au lieu de mettre des valeurs simple j'entre des formules plus complexes. Mais c'est la même chose en principe.

Dans ce tableau ce qui m’intéresse est la première colonne, la deuxième et la 8ème. Je cherche à récupérer ces données qui sont stockées dans le tableau pour en tracer un graphiques de surface. Avec la contrainte forte de ne pas coller les données sur une feuille Excel.

Rien de plus. La méthode pour générer ces graph 3D ne me gène pas. Que l'on passe par des TCD ou autre peut importe.



André
 

Dranreb

XLDnaute Barbatruc
Re : Créer un Range avec une variable tableau, c'est possible ?

Ça ne me dit toujours pas ce qu'il y a dans Tableau(i, 1), Tableau(i, 2) et Tableau(i, 8) qui doit se retrouver dans la matrice.

Pour info, une instruction de ce genre est généralement très rapide :
VB:
Feuil1.[A1].Resize(Unbound(Mat, 1), Ubound(Mat, 2)).Value = Mat
 

Misange

XLDnaute Barbatruc
Re : Créer un Range avec une variable tableau, c'est possible ?

Misange, peux tu être un peu plus explicite ?

Je dois pouvoir attribuer des nom de plages pour les séries du graphique. Mais comment pourrais-je m'en sortir ensuite ? Un exemple simple à proposer peut être ?

Rien de plus simple ensuite : c'est tout expliqué sur le tuto
Ce lien n'existe plus
(enfin quand excelabo veut bien répondre ... mon hébergeur doit me changer de serveur cette nuit, il y a visiblement un problème depuis quelque jour pour se connecter ! sois patient pour aller voir la page.

... le site est carrément en rade. et M...)


Bon en gros, tu fais un graphique avec des séries bidons (ou une partie de tes données, peu importe). Tu le mets en forme comme tu veux. Ensuite cllic droit sur le graphique/sélectionner des données.
Tu cliques sur une série et modifier. Au lieux du range définissant la série tu tapes
=feuil1!masérie (à adapter !)
en réouvrant cette même boite de dialogue, le nom de la feuille sera transformé par celui du classeur.

NB : comme souvent : plutot que de demander à faire des trucs très compliqués et probablement impossibles, il est bien plus simple dès le départ de dire "voilà ce que je cherche à faire : construire un graphique à partir d'un array. Voilà ce que j'ai essayé de faire sans y parvenir : passer de l'array à un tcd". Tu aurais gagné beaucoup de temps dans la résolution de ce problème !
 
Dernière édition:

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Créer un Range avec une variable tableau, c'est possible ?

Je ne vois pas quoi répondre alors le mieux c'est que je place le vrai code que j'utilise actuellement. Vous aurez alors accès au vrai tableau. Mais encore une fois, ça va compliquer plus qu'autre chose je pense.

Code:
Public Sub CONSTRUCTION_TABLEAU()

Dim Largeur As Long, Hauteur As Long, Pas As Long, Rayon As Long, i As Long, CentreX As Long, CentreY As Long 'Déclaration des variables
Dim Tableau() As Variant

'========================================================================================================================
'Pour gérer les pixels
    Dim toto As New StdPicture
    Dim couleur As Long, hdc As Long
    
    On Error Resume Next 'Place un gestionnaire d'erreurs qui saute l'instruction défectueuse
    Set toto = LoadPicture(Range("K17"))
    If (Err.Number <> 0) Then 'Indique le numéro de l’erreur. Ce numéro est unique et dépend également de l’application
    UserForm2.Show
    Exit Sub
    End If
    On Error GoTo 0 'Enlève le gestionnaire d'erreur s'il était mis en place

    hdc = CreateCompatibleDC(0)
    SelectObject hdc, toto.Handle
'========================================================================================================================

CentreX = Range("L6") 'On définit et règle les quelques paramètres
CentreY = Range("L7")
Rayon = Range("L8")
Pas = Range("L9")

i = 0
For Largeur = CentreX - Rayon To CentreX + Rayon Step Pas: For Hauteur = CentreY - Rayon To CentreY + Rayon Step Pas 'Cette boucle permet de redimensionner corretement le tableau
    If (Largeur - CentreX) ^ 2 + (Hauteur - CentreY) ^ 2 <= Rayon ^ 2 Then 'Condition pour passer d'un maillage rectangulaire -> circulaire
        i = i + 1
    End If
Next Hauteur: Next Largeur

ReDim Tableau(1 To i, 1 To 8) As Variant 'On peut maintenant redimensionner le tableau dynamique (i Lignes et 8 colonnes dans ce cas la)

i = 0
For Largeur = CentreX - Rayon To CentreX + Rayon Step Pas: For Hauteur = CentreY - Rayon To CentreY + Rayon Step Pas 'On parcours maintenant l'intégralité des points se trouvant à l'intérieur de la maille circulaire
    If (Largeur - CentreX) ^ 2 + (Hauteur - CentreY) ^ 2 <= Rayon ^ 2 Then
        
        couleur = GetPixel(hdc, Largeur, Hauteur)
        Dim RealColor As Long
        TranslateColor couleur, 0, RealColor
        i = i + 1
        Tableau(i, 1) = Largeur 'On remplit le tableau dynamique comme on l'entends (Pour le maillage circulaire, seule 2 colonnes suffisent)
        Tableau(i, 2) = Hauteur
        Tableau(i, 3) = Tableau(i, 1) * Range("Q5")
        Tableau(i, 4) = Tableau(i, 2) * Range("Q5")
        Tableau(i, 5) = RealColor And &HFF&
        Tableau(i, 6) = (RealColor And &HFF00&) / 2 ^ 8
        Tableau(i, 7) = (RealColor And &HFF0000) / 2 ^ 16

        Dim r As Double, g As Double, b As Double
        r = Tableau(i, 5) / (Tableau(i, 5) + Tableau(i, 6) + Tableau(i, 7)) 'D'après les formules.PDF de la transformation RGB->HSI
        g = Tableau(i, 6) / (Tableau(i, 5) + Tableau(i, 6) + Tableau(i, 7))
        b = Tableau(i, 7) / (Tableau(i, 5) + Tableau(i, 6) + Tableau(i, 7))

        On Error Resume Next
        If b <= g Then
            Tableau(i, 8) = (WorksheetFunction.Acos(((1 / 2) * (r - g + r - b)) / (((r - g) ^ 2 + (r - b) * (g - b)) ^ (1 / 2)))) / (2 * 3.14)
        Else
            Tableau(i, 8) = (6.28 - WorksheetFunction.Acos(((1 / 2) * (r - g + r - b)) / (((r - g) ^ 2 + (r - b) * (g - b)) ^ (1 / 2)))) / (2 * 3.14)
        End If
        On Error GoTo 0
    End If
    
Next Hauteur: Next Largeur

Range(Cells(5, 2), Cells(UBound(Tableau, 1) + 4, UBound(Tableau, 2) + 1)) = Tableau 'On transfère les éléments du tableau dans la feuille de calcul

Voila ce que contient mon tableau. Uniquement des entiers et des décimaux. Il n'y a pas plus d'infos dans cet exemple que celui que j'avais donné au tout premier post selon moi. Néanmoins on se rapproche du cas réel maintenant.
Je cherche donc à tracer un graph 3D qui correspond à Tableau(i, 1), Tableau(i, 2) et Tableau(i, 3) sans transfert des données dans la feuille.

Si vous avez des idées je suis preneur :eek:

André
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Créer un Range avec une variable tableau, c'est possible ?

Pour Misange, en utilisant les plages nommées comme tu l'entends on doit donc disposer des données sur la feuille ou pas nécessairement ? Je ne visualise pas le résultat la comme ça. J'ai l'impression que les données doivent tout de même être copiées dans la feuille pour que ça marche.


NB : comme souvent : plutot que de demander à faire des trucs très compliqués et probablement impossibles, il est bien plus simple dès le départ de dire "voilà ce que je cherche à faire : construire un graphique à partir d'un array. Voilà ce que j'ai essayé de faire sans y parvenir : passer de l'array à un tcd". Tu aurais gagné beaucoup de temps dans la résolution de ce problème !

Plus un pour toi en effet.

Même si l'objectif premier est de tracer un graph à partir d'un array, il n'en reste pas moins que j'étais (et reste) curieux de savoir comment on pouvait entrer une plage de valeur à partir d'une variable tableau. Voila pourquoi j'ai commencé ainsi. Je reste sur ma fin de ce coté. Et je trouve ça super intéressant comme concept pourtant...
Je sais maintenant que c'est pas si évident comme demande. Je peux donc élargir le cadre de la discussion. Voila pourquoi j'ai commencé ainsi. Mais tu as tout à fait raison cela dit Misange.

André
 

Misange

XLDnaute Barbatruc
Re : Créer un Range avec une variable tableau, c'est possible ?

Tu n'as absolument pas besoin que les données soient sur la feuille pour créer un nom.

Code:
Sub test()
Dim monarray
monarray = Array(4, 5, 6)
Names.Add Name:="maplage", RefersToR1C1:=monarray
End Sub

tu peux ensuite créer un graphique et utiliser maplage comme source de données.
 

Dranreb

XLDnaute Barbatruc
Re : Créer un Range avec une variable tableau, c'est possible ?

Pourquoi ne renseignez vous pas directement en parallèle un tableau de Variant à 2 dimensions d'indices en relations linéaires avec Hauteur et Largeur ?
Sans doute vaudrait il mieux d'ailleurs boucler avec un pas de 1 quitte à calculer vos X,Y en Pixels et en microns à chaque passage.
Ça y est, j'ai fait le lien avec notre précédente discussion !
Mais je ne vous écrirai rien. Je détesterais produire une application très aboutie sans que rien ne soit dûment bien repéré par des noms de plages, et sans profiter de la souplesse d'Excel pour formater hors VBA ce qui ne changera pas beaucoup !

P.S. Sans parler d'une petite recherche qu'il y aurait lieu de mener, destinée à vérifier s'il est exact, comme semblent le supposer certains organismes officiels, que les valeurs de composantes RGB codées lors de prises de vues peuvent effectivement, en principe, être directement utilisées pour calculer des angles de teintes. Recherche dont le résultat m'intéresserait beaucoup, et démontrerait des dispositions absolument scandaleuses du coté des gamma dans les restitutions de couleurs des écrans LCD !

À +
 
Dernière édition:

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Créer un Range avec une variable tableau, c'est possible ?

Merci Misange pour ce petit exemple. Je reste tout de même interrogateur la.

Créer un graphique à partir d'une plage nommée je pense m'en sortir. Mais je ne vois pas très bien encore comment sont insérées les données contenues dans mon tableau dynamique vers ton array.

On utilise un seul tableau ou 2 tableaux du coups ?

Code:
monarray = Array(4, 5, 6)
, à la place de 4, 5, 6 comment j'entre toutes les données contenues de mon tableau ?

Dsl je suis perdu pour être honnête la.


André
 

Misange

XLDnaute Barbatruc
Re : Créer un Range avec une variable tableau, c'est possible ?

Je ne suis pas entrée dans les détails de ta macro et je ne vais pas le faire.
Tu as un array et tu en crées un autre à partir de celui là en récupérant dans le nouveau les données qui t'intéressent.
genre avec une boucle (à toi d'optimiser ensuite si c'est trop lent)
Code:
ReDim TbloArr(UBound(TbloDep, 1), UBound(TbloDep, 2)) For i = LBound(TbloDep, 1) To UBound(TbloDep, 1)     For j = LBound(TbloDep, 2) To UBound(TbloDep, 2)     'ici tu fait ton test pour choisir les bonnes valeurs à mettre dans les tableaux d'arrivée         TbloArr(i, j) = TbloDep(i, j)     Next j Next i
oui il te faut un nom défini par série (X, Y, Z)
Cela dit, quel graphique vraiment 3D fais tu sur excel ???
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Créer un Range avec une variable tableau, c'est possible ?

Merci Misange pour ces précieux conseils. Je vais essayer de monter un petit exemple. Si j'y parviens je viendrais le placer ici pour ceux que ça intéresserais.

Va me falloir un peu de temps par contre. Ne soyez pas pressés^^



Cela dit, quel graphique vraiment 3D fais tu sur excel ???

Sur Excel 2007, insertion, graphique de surface. Ensuite je joue avec la fonction "rotate" pour orienter mon grpah dans l'espace. De cette manière je place 3 graphiques 3D (Vue de dessus, vue de face et en 3D). Ça rend vraiment très bien moyennant un temps de calcul plus ou moins long suivant mes paramètres d'entrées.

Je teste ton idée Misange...



André
 

Misange

XLDnaute Barbatruc
Re : Créer un Range avec une variable tableau, c'est possible ?

OK c'est tout sauf un graphique 3D... c'est un graphique 2D avec une vue en perspective ce qui est très différent. Tu n'as besoin que de 2 séries pour le construire, la 3° est arbitraire non ??
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Créer un Range avec une variable tableau, c'est possible ?

C'est un graphique 2D ??? Ah bon oki. Je me suis dis il y a 3 axes...c'est de la 3D. A tord sans doute.

Dans tous les cas, c'est ce type de graphique que j'emploie. C'est le seul à ma connaissance qui permette de faire afficher les 3 dimensions. Si tu en connais un autre je suis curieux d'en savoir plus.


Tu n'as besoin que de 2 séries pour le construire, la 3° est arbitraire non ??

Ben non justement, il me faut 3 séries pour les 3 axes. Chaque axe est représenté par une série qui lui est propre. Je peux me tromper, mais en tout cas je vois bien apparaitre mes 3 séries moi.

Quelle est la manière la plus simple de faire un Graph 3D sur Excel sans utiliser de TCD alors ???


André
 

Misange

XLDnaute Barbatruc
Re : Créer un Range avec une variable tableau, c'est possible ?

Tu as raison, j'avais zappé le surface. Oui il te faut bien 3 séries.
mais tu n'as toujours pas besoin d'un TCD pour faire un graphique.
Je pense que tu as toutes les infos nécessaires pour avancer sur ton projet, en tous cas toutes celles que je peux te donner. SAns voir le moindre fichier réel, juste des macros ou des fichiers avec des données sans aucun rapport avec la réalité, on parle dans le vide et maintenant même si tu le joins en ce qui me concerne ce sera stop :)
 

Dranreb

XLDnaute Barbatruc
Re : Créer un Range avec une variable tableau, c'est possible ?

Au cas où vous ne décidiez pas de passer en pas=1 qui aboutirait à mon avis à des expressions plus simples, ceci sera ...ma dernière contribution probablement :
VB:
Dim dXMat as Long, dYMat as Long
...
dXMat = Pas - (CentrX - Rayon)
dYMat = Pas - (CentrY - Rayon)
Redim Mat(1 To 2 * Rayon \ Pas + 1, 1 To 2 * Rayon \ Pas + 1) As Variant
...
   Mat((Largeur + dXMat) \ Pas, (Hauteur + dYMax) \ Pas) = Tableau(i, 8)
À +
 

Discussions similaires