Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

laurent950

XLDnaute Barbatruc
Bonsoir le forum, le fil,

J’aimerais comprendre la suite d’un tableau alimenté a partir d’une feuille Excel.

Avec l’instruction Redim

Puis coller les valeurs du tableau (en mémoire) dans des cellules d’une feuille Excel.

Ce même tableau existant (en mémoire) j’aimerais lui ajouter une colonne supplémentaire (toujours en mémoire) cette colonne serais une clef de concaténation (à partir de valeur déjà en mémoire) dans le tableau existant.

Avec l’instruction ReDim Preseve.

J’ai commencé quelque choses, joint le code avec le fichier Excel.

Le tableau s’appelle MesEleves.

Code : (Lisible est très propre avec des commentaires dans l'éditeur VBA)

Sub test22()
Dim MesEleves() As Variant
Dim i As Integer
Dim j As Integer 'Nbre éléments du tableau

'============================================================================================================
' Feuil2 pour mettre le resultat
Set F2 = ThisWorkbook.Worksheets("Feuil2")

' Derniere cellule non vide de la colonne A
derCA = Range("a65536").End(xlUp).Row

' Derniere cellule non vide de la ligne 1
derL1 = Range("IV1").End(xlToLeft).Column
'============================================================================================================

' Boucle pour remplir le tableau si la note de l'eleve est égale à 19
' Avec l'instruction redim (pour comprendre)
For j = 1 To derCA 'derL1 Derniere cellule non vide de la ligne 1
For i = 1 To derL1 ' derCA Derniere cellule non vide de la colonne A
'Engestriment de tous les éléments du tableau (Mise en mémoire de celui-ci = MesEleves)
ReDim MesEleves(j, i)
MesEleves(j, i) = Cells(j, i) ' Remplis le tableau (Toutes les cellules de 3 colonnes et 15 lignes)
Debug.Print MesEleves(j, i) ' lecture de la cellule remplis (fenêtre d'excécution éditeur VBA)
Next i
Next j

' =====================================================================================
' Une fois celle-ci dans le tableau, je ne sais pas :
' - copier les valeur du tableau MesEleves dans la Feuil2
' Soit :
' Tous le tableau en une fois. (3 colonnes et 15 lignes)
' ou
' Juste une colonne du tableau (Toutes la colonne éléves)
' ou
' Une ligne du tableau (Salle224 /VALERIE / 12)
' ou
' Par exemple ou jsute une valeur (Jeanne dans une cellule)
' ou
' Par exemple des valeurs a coller dans des cellules :
' - Jeanne = une cellule et 0 = une cellule

' C'est le faite de récuperer des valeur dans le tableau et les
' Coller dans excel.

' ===========================================================================================

' =====>>>> Divers test non concluant ???

' =====>>>> F2.Cells(1, 1) = MesEleves
' =====>>>> F2.Range(F2.Cells(1, 1), F2.Cells(UBound(MesEleves, 1), UBound(MesEleves, 1))) = MesEleves
' =====>>>> F2.Range(F2.Cells(1, 1), F2.Cells(UBound(MesEleves, 1))) = MesEleves



' SUITE AVEC ReDim Preseve

' ===========================================================================================
' **** Comment se servire de l'instruction ReDim Preserve pour completer *****
' **** La dimension du tableau MesEleves est completer ce tableau *****
' **** Sans perdre les donner précedente contenu dans MesEleves *****
' ===========================================================================================


' ===>>> Associer la classe avec la Note = 19 :
' Ici le Tableau contient les Notes 19 (soit 3 fois la Note 19) dans le Tableau MesEleves
' Avec ReDim Preserve (ajouter des valeur aux tableau MesEleves)
' La colonne Clef (A et C) doit être dans la mémoire tableau est être une clef de concatenation
' de la Classe et Note (Uniquement si la note est de strictement = 19)

' =====================================================================================
' Ne fonctionne pas
' je sais pas ajouter la clef de concatenation a la mémoire du tableau
' MesEleves avec l'instruction Redim Preserve (aux tableau existant MesEleves)

For i = 1 To UBound(MesEleves, 2) ' Colonne = 3 LBound(MesEleves, 2) Soit deuxieme dimension
For j = 1 To UBound(MesEleves, 1) ' Ligne = 15 LBound(MesEleves, 1) soit premiere dimension

If MesEleves(j, i) = 19 Then ' Condition si la note est strictment = 19
'Redimension du tableau en conservant ses éléments
' =====================================================================================
x = 46 + i ' ICI JE COMPREND PLUS ?
ReDim Preserve MesEleves(x)
MesEleves(x) = Cells(i, 1) & Cells(i, 3)
Debug.Print MesEleves(x)
' =====================================================================================
End If
Next j
Next i


' =====================================================================================

' Pour la suite j'aimerais à present que le tableau contient maintenant une dimensions
' Suplémentaire soit la clef (A et C) soit la contaténation de :

' Soit : clef (A et C)
' Salle227 / 19 soit = Salle22719
' Salle224 / 19 soit = Salle22419
' Salle227 / 19 soit = Salle22719

' Et coller le resultat des lignes de se tableau redimensioné (MesEleves) en :
' En cellule A10 : point de départ
' Correspondant aux lignes de la clef de concatenation.

' soit:
' Salle22719
' Salle22419
' Salle22719


End Sub

Remerciant le Forum pour cette aide qui me serait bien utile.

Laurent.
 

Pièces jointes

  • RedimPreserveTab.xls
    39 KB · Affichages: 69
Dernière édition:

MichD

XLDnaute Impliqué
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonjour Laurent,


Si tu as cette ligne de c ode dans le haut du module

Option Base 1

| 'exemple = ReDim Preserve Trsf(1 to 15, 1 to 4) = tableau de la ligne 1 à 15, colonne 1 à 5
****C'est plutôt : tableau de la ligne 1 à 15, colonne 1 à 4

Si tu utilises ceci pour remplir ton tableau
T = range("A1:A5") ton tableau "T" sera obligatoirement de base 1 même si tu as Option Base 0 dans le haut du module.
une feuille de calcul n'as pas de ligne 0 ou de colonne 0
Cependant, si tu boucles sur chacune des cellules du tableau pour insérer les valeurs dans un tableau, ce dernier pourrait être de base 0

Si dans le haut du module il est écrit : Option base 1
| 'exemple = ReDim Preserve Trsf(15, 4) = tableau de la ligne 0 à 15, colonne 0 à 5
C'est un tableau de 15 lignes de 1 à 15 et de 5 colonnes de 1 à 5

En l'absence de la ligne "Option base 1" dans le haut du module ou en présence de "Option Base 0"
| 'exemple = ReDim Preserve Trsf(15, 4) = tableau de la ligne 0 à 15, colonne 0 à 5
C'est un tableau de 16 lignes de 0 à 15 et de 5 colonnes de 0 à 4
 

laurent950

XLDnaute Barbatruc
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonsoir MichD,

J'ai corrigé est ce que c'est bien cela ?

Option Base 1
'Option Base 0
'15 lignes sur 4 colonnes
'exemple = ReDim Preserve Trsf(1 to 15, 1 to 4) = tableau de la ligne 1 à 15, colonne 1 à 4
'16 lignes sur 5 colonnes
'exemple = ReDim Preserve Trsf(15, 4) = tableau de la ligne 0 à 15, colonne 0 à 4
'
'Option Base 1
'15 lignes sur 4 colonnes
'exemple = ReDim Preserve Trsf(1 to 15, 1 to 4) = tableau de la ligne 1 à 15, colonne 1 à 4
'15 lignes sur 4 colonnes
'exemple = ReDim Preserve Trsf(15, 4) = tableau de la ligne 1 à 15, colonne 1 à 4


'*****************************************************************************
'Pour le reste je pense avoir compris mais je ne suis pas très sur, dans la construction de ma macro en exemple avec le fichier excel joint dans le poste précédent.

Pour ma macro est ce qu'elle tiens la route ? en poste #15

Aussi Empty ou 0 c'est la même chose ? le code ce comporte bizarrement avec une condition if avec empty lorsqu'elle (boucle sur la case qui contient la valeur 0) du tableau en mémoire (variable Tableau)

Que j'ai pas mis dans mon exemple, mais que j'ai constaté lors de la construction de cette boucle, avec cette anomalie que j'ai contourné autrement.

Laurent
 
Dernière édition:

MichD

XLDnaute Impliqué
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonjour Victor21,

| Bonsoir, Denis.
****Tu veux dire : Bonsoir MichD

Je suppose qu'il doit y avoir un autre truc pour faire ressortir les fautes d'orthographe... sois gentil, ne l'active pas !
Qui est responsable ici du café et des muffins ?
;-))
 

laurent950

XLDnaute Barbatruc
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonsoir MichD,

J'ai corrigé les postes #15 et #17 avec la macro en poste #15 suite aux compléments d'information et explication que MichD.

J'avais bien fait cette erreur en poste #15 avec
Option base 1
'exemple = ReDim Preserve Trsf(1 to 15, 1 to 4) = tableau de la ligne 1 à 15, colonne 1 à 5
Que j’ai corrigé en poste 5


Je dois encore travailler je pense les tableaux.

Je vous remercie pour les explications :
- Option Base 0
- Option Base 1

Merci
 
Dernière édition:

Misange

XLDnaute Barbatruc
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonjour Misange,

Si je peux me permettre, pour compléter ton tuto, je verrais bien quelques lignes
A ) sur la notion d'un tableau de base 1 ou de Base 0
B ) sur la ligne de code qu'on peut ajouter dans le haut d'un module "Option Base 0" ou "Option Base 1"
C ) que les tableaux représentant une plage de cellule ayant été renseigné par cette méthode
T = range("A1:A5") sont nécessairement des tableaux de base 1 puisque dans une feuille de
calcul, il n'y a ni ligne 0 ou ni colonne 0
c'est déjà là :
Ce lien n'existe plus
(il y a 8 pages en tout et tes critiques seront bienvenues, ce n'est pas évident d'aborder les différents points de façon claire...


Je donne 2 autres exemples dans le cas où l'on peut utiliser un tableau pour recopier ou travailler avec des formules et des constantes dans la plage de cellules : [...]
Je mets ça de côté et je le rajouterai ce soir, c'est un truc super utile. Je m'étais déjà fait du reste depuis longtemps une macro pour faire ça mais je n'avais pas pensé à stocker les formules dans un array, c'est une super idée.
 

Victor21

XLDnaute Barbatruc
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonjour.
Pour rendre la lecture du code plus agréable, il est coutume ici d'utiliser les balises [ Highlight=VBA] au début et [/Highlight ] à la fin (sans les premier et dernier espaces.
...suppose qu'il doit y avoir un autre truc pour faire ressortir les fautes d'orthographe... sois gentil, ne l'active pas !
Qui est responsable ici du café et des muffins ?
;-))
Pas de quoi, c'était avec plaisir :)

Edit : Bonjour, Misange :)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonjour à tous

Victor21
Alors maitre Yoda (salutations au passage), on a pas lu son bréviaire BBCODE et on s'encombre de cet espace, alors qu'on peut l'éviter (voir ci-dessous)
[NOPARSE]
VB:
[/NOPARSE]Ici le code VBA[NOPARSE]
[/NOPARSE]
PS: tu ne m'en veux pour cette taquinerie dominicale, j'espère
(fais moi savoir si tu as compris de quoi je parle... ;) )

Merci à Misange pour son tuto au passage
 
Dernière édition:

laurent950

XLDnaute Barbatruc
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonsoir Misange, MichD, le fils, le forum.

J'ai compris la variable tableau mais j'ai encore des questions :

- Comment Mettre une couleur avec la variable tableau ?

Code : ici ca Plante ?

VB:
Sub Test()
Dim F1 As Worksheet
Dim T()
T = Range("A3:A18").Value

'Efface les valleur de la feuilles
Range("B1:Z150").ClearContents

Set F1 = ThisWorkbook.Worksheets("Feuil1")

For i = 1 To UBound(T, 1)
    If T(i, 1) = "F" Then
        T(i, 1) = "1"
        Debug.Print T(i, 1)
    ElseIf T(i, 1) = "y" Then
    T(i, 1) = "Couleur"
    T(i, 1).Font.ColorIndex = 3
    Debug.Print T(i, 1)

    End If
Next i
        
' Colle version 1
F1.[B3].Resize(UBound(T, 1), UBound(T, 2)) = T

' Colle version 2 "Ici c'est faut ?"
F1.[C3].Resize(UBound(T, 1), UBound(T, 2)) = Application.Transpose(T)

' efface tous le Tableau T()
Erase T

End Sub

Je ne comprends pas non plus le comportement des ces deux façons de coller les informations ?

= T

Ou

= Application.Transpose(T)

Cela ne donne pas les mêmes choses, dans qu’elle cas appliquer l’un ou l’autre je suis perdu ?


Aussi, j’ai essaie d’affecter une couleur a la cellule (dans le tableau mais c’est pas reconnu).

T(i, 1).Font.ColorIndex = 3

Je vous remercie pour votre aide.


Laurent
 

Pièces jointes

  • CouleurTableaux.xls
    34 KB · Affichages: 44
Dernière édition:

MichD

XLDnaute Impliqué
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonjour,

Il s'agit tout simplement entrer la couleur dans le tableau.

Un petit exemple, à partir d'une plage dans la feuil1, tu colores la plage équivalente dans la Feuil2

VB:
'---------------------------------------
Sub test()
Dim T() As Long, C As Range, A As Integer, B As Integer

A = 1
With Feuil1.Range("A1:C6")
    ReDim Preserve T(1 To .Cells.Count)
    For Each C In .Cells
        T(A) = C.Interior.Color
        A = A + 1
    Next
End With

'applique les couleurs de la plage précédente vers une plage
'de même étendue dans la feuil2
B = 1
For Each C In Feuil2.Range("A1:C6")
    C.Interior.Color = T(B)
    B = B + 1
Next

End Sub
'-------------------------------------------------------------

'Je complète mon exemple en disant que tu peux mettre des objets "Range" dans un tableau.
'et la procédure peut s'écrire au moins de ces 2 façons :


Sub test()
Dim T() As Range, C As Range

A = 1
With Feuil1.Range("A1:C6")
    ReDim Preserve T(1 To .Cells.Count)
    For Each C In .Cells
        Set T(A) = C
        A = A + 1
    Next
End With

B = 1
For Each C In Feuil2.Range("A1:C6")
    C.Interior.Color = T(B).Interior.Color
    C.Value = T(B)
    B = B + 1
Next
End Sub
'--------------------------------------------------------------

Sub test1()
Dim T() As Range, C As Range, A As Integer, B As Integer

A = 1
With Feuil1.Range("A1:C6")
    ReDim Preserve T(1 To .Cells.Count)
    For Each C In .Cells
        Set T(A) = C
        A = A + 1
    Next
End With

B = 1
For Each C In Feuil2.Range("A1:C6")
    T(B).Copy C
    B = B + 1
Next
End Sub
'----------------------------------------
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonsoir à tous

laurent950
Il y avait un T de trop dans mon précédent message
[NOPARSE]
VB:
[/NOPARSE]
[COLOR=indigo][B]Mettre ici le code VBA de la macro[/B][/COLOR]
[NOPARSE]
[/NOPARSE]

Sinon tu peux aussi utiliser cet icône : code.png
Tu sélectionnes le code de ta macro dans ton message et tu cliques sur code.png

Ce qui donnera ces résultats
Avec HIGHLIGHT
VB:
Sub a()
'Déclarations
Dim MStr As String, QUI$, AMPM As Boolean

AMPM = Hour(Now()) > 18: QUI = Application.UserName
MStr = "Bon" & IIf(AMPM, "soir ", "jour ") & vbTab & QUI

'Affichage du MsgBox
MsgBox MStr, vbOKOnly, "Titre ici"
End Sub
Avec CODE (ce qui correspond à l'utilisation de : code.png)
Code:
Sub a()
'Déclarations
Dim MStr As String, QUI$, AMPM As Boolean

AMPM = Hour(Now()) > 18: QUI = Application.UserName
MStr = "Bon" & IIf(AMPM, "soir ", "jour ") & vbTab & QUI

'Affichage du MsgBox
MsgBox MStr, vbOKOnly, "Titre ici"
End Sub

EDITION: Bonsoir MichD, désolé pour la collision , je n'avais pas rafraichi :eek:
 

Pièces jointes

  • code.png
    code.png
    463 bytes · Affichages: 153
  • code.png
    code.png
    463 bytes · Affichages: 152

laurent950

XLDnaute Barbatruc
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonsoir MichD,

Je te remercie pour cette réponse.

Suite à la couleur dans le tableau, ont es obligé de passer par une boucle de type :
- for each

Pour le remplissage de la couleur d’un tableau.

Il n’y a pas la possibilité de paramétrer la couleur directement dans la boucle du Tableau.

Une boucle de type :

- for each (C’est assimilé à du tableau (ca travail avec la mémoire interne de l’ordi ?)

Réponse de MichD :
Je te remercie de cette aide MichD ------>>>> Pour ton poste #25 très explicite <<<-----------

Merci
Laurent
 
Dernière édition:

laurent950

XLDnaute Barbatruc
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonsoir MichD, Staple1600

Pour Staple1600 (merci j’ai corrigé avec les balsises) le poste #24

Pour MichD :
J’ai aussi cette autre question sur le comportement de :

- Application.Transpose ?

Je ne comprends pas bien plus la différence des résultats obtenue en fonction de :

= T ‘ Coller le tableau juste avec sont nom --->> ici T()

Ou

= Application.Transpose(T) ' Coller le tableau juste avec sont nom ---->> ici Application.Transpose(T)

Dans qu’elle cas appliquer l’un ou l’autre ?

code :

VB:
Sub Test()
Dim F1 As Worksheet
Dim T()
T = Range("A3:A18").Value

'Efface les valleur de la feuilles
Range("B1:Z150").ClearContents

Set F1 = ThisWorkbook.Worksheets("Feuil1")

For i = 1 To UBound(T, 1)
    If T(i, 1) = "F" Then
        T(i, 1) = "1"
        Debug.Print T(i, 1)
    ElseIf T(i, 1) = "y" Then
        T(i, 1) = "Couleur"
    Debug.Print T(i, 1)

    End If
Next i
        
' Colle version 1
F1.[B3].Resize(UBound(T, 1), UBound(T, 2)) = T

' Colle version 2 "Ici c'est faut ?"
F1.[C3].Resize(UBound(T, 1), UBound(T, 2)) = Application.Transpose(T)

' efface tous le Tableau T()
Erase T
End Sub
Je vous remercie pour votre aide.

Laurent
 
Dernière édition:

MichD

XLDnaute Impliqué
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonjour Misange,

Je m'étais contenté de lire la page que tu avais référée. J'étais loin d'avoir tout lu tout ce que tu as écrit sur le sujet.

Désolé pour cette méprise. Tu as fait du très bon boulot.
 

laurent950

XLDnaute Barbatruc
Re : Tableau (MesEleves) Redim à compléter avec ReDim Preserve (clef Concatenation)

Bonsoir MichD,

C'était dans le cours de Misange, j'ai fait divers test est j'ai enfin compris avec un peu de temps, c'est comme le collage spéciale avec Excel lorsque l'on fait un :

Collage spécial transpose.

‘ **************************************************************************

Cours de Misange : "Transpose"

On peut dans certains cas avoir besoin d'inverser les lignes et les colonnes.
L'instruction transpose le permet :

remplacer
Tblo = range("A1:C3").Value
par
Tblo = Application.WorksheetFunction.Transpose(range("A1:C3")).Value

Attention au nombre de lignes et de colonnes quand on fait une transposition dans l'idée de transférer ensuite dans la feuille : il faut que le nombre de lignes et de colonnes soit compatible avec la sortie.

‘ **************************************************************************

Merci à vous Misange et aussi à MichD

Si j’ai d’autre question je reviendrais sur ce poste complexe.

Laurent
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 127
Messages
2 116 505
Membres
112 765
dernier inscrit
SIDIANW