Redimensionner une variable tableau 3D sans perte de données

Bonjour à toutes et tous,

j'aimerai redimensionner une variable tableau tridimensionnelle, sans perte de données.
Mon redimensionnement concerne 2 des 3 dimensions (la première et la deuxième).

J'avais l'habitude de redimensionner des tableaux 2D à l'aide de ReDim Preserve, en transposant préalablement les 2 dimensions du tableau si je souhaitais redimensionner la 1ère dimension.
Mais dans le cas d'un tableau 3D, je ne vois pas comment faire, et je n'ai pas trouvé de piste de recherche.

Voici un peu plus de détails sur mon application : Je veux développer une macro qui va parcourir des feuilles de pointages d'employés, pour avoir comme résultat final un tableau Excel récapitulatif, listant en abscisse tous les employés et en ordonnée toutes les affaires sur lesquelles des heures ont été pointées, celles-ci découpées par année.
Dans le fichier joint, vous verrez le résultat que je souhaite obtenir.

Je n'ai aucun soucis pour la partie de code qui sert à boucler sur toutes les feuilles de pointage et parcourir les zones qui m'intéressent, par contre je suis coincé sur la partie "enregistrement des données dans une variable tableau tridimensionnelle". Je souhaite enregistrer mes données de la façon suivante :
+ 1ère dimension du tableau = Les affaires
+ 2ème dimension du tableau = Les personnes
+ 3ème dimension du tableau = Les années

Le nombre d'années, donc la 3° dimension du tableau, sera définit dès le début du traitement (Car mon application permettra de saisir une date de début et de fin de période pendant laquelle les feuilles de pointages doivent être scannées)

Mais les affaires et les personnes, vont être ajoutées au fur et à mesure du traitement des feuilles de pointage.
==> J'ai donc besoin de redimensionner soit la 1° dimension, soit la 2° dimension du tableau.

La variable tableau se présentera de cette façon :

Option Explicit
Option Base 1

Sub Test()

Dim Tableau()
ReDim Tableau(1 To 4, 1 To 4, 1 To 4)
' 1ère dimension du tableau = Les affaires
' 2ème dimension du tableau = Les personnes
' 3ème dimension du tableau = Les années

Tableau(2, 1, 1) = "Affaire 1"
Tableau(3, 1, 1) = "Affaire 2"
Tableau(4, 1, 1) = "Affaire 3"
Tableau(1, 2, 1) = "Nom 1"
Tableau(1, 3, 1) = "Nom 2"
Tableau(1, 4, 1) = "Nom 3"
Tableau(1, 1, 1) = "Année 1"
Tableau(1, 1, 2) = "Année 2"
Tableau(1, 1, 3) = "Année 3"
Tableau(1, 1, 4) = "Année 4"
Tableau(2, 2, 1) = 111 'Nombre d'heures de [Nom 1] sur [Affaire 1] durant [Année 1]
Tableau(2, 2, 2) = 112 'Nombre d'heures de [Nom 1] sur [Affaire 1] durant [Année 2]
Tableau(2, 2, 3) = 113 'Nombre d'heures de [Nom 1] sur [Affaire 1] durant [Année 3]
Tableau(2, 2, 4) = 114 'Nombre d'heures de [Nom 1] sur [Affaire 1] durant [Année 4]
Tableau(3, 2, 1) = 121 'Nombre d'heures de [Nom 1] sur [Affaire 2] durant [Année 1]
Tableau(3, 2, 2) = 122 'Nombre d'heures de [Nom 1] sur [Affaire 2] durant [Année 2]
Tableau(3, 2, 3) = 123 'Nombre d'heures de [Nom 1] sur [Affaire 2] durant [Année 3]
Tableau(3, 2, 4) = 124 'Nombre d'heures de [Nom 1] sur [Affaire 2] durant [Année 4]
Tableau(4, 2, 1) = 131 'Nombre d'heures de [Nom 1] sur [Affaire 3] durant [Année 1]
Tableau(4, 2, 2) = 132 'Nombre d'heures de [Nom 1] sur [Affaire 3] durant [Année 2]
Tableau(4, 2, 3) = 133 'Nombre d'heures de [Nom 1] sur [Affaire 3] durant [Année 3]
Tableau(4, 2, 4) = 134 'Nombre d'heures de [Nom 1] sur [Affaire 3] durant [Année 4]
Tableau(2, 3, 1) = 211 'Nombre d'heures de [Nom 2] sur [Affaire 1] durant [Année 1]
Tableau(2, 3, 2) = 212 'Nombre d'heures de [Nom 2] sur [Affaire 1] durant [Année 2]
Tableau(2, 3, 3) = 213 'Nombre d'heures de [Nom 2] sur [Affaire 1] durant [Année 3]
Tableau(2, 3, 4) = 214 'Nombre d'heures de [Nom 2] sur [Affaire 1] durant [Année 4]
Tableau(3, 3, 1) = 221 'Nombre d'heures de [Nom 2] sur [Affaire 2] durant [Année 1]
Tableau(3, 3, 2) = 222 'Nombre d'heures de [Nom 2] sur [Affaire 2] durant [Année 2]
Tableau(3, 3, 3) = 223 'Nombre d'heures de [Nom 2] sur [Affaire 2] durant [Année 3]
Tableau(3, 3, 4) = 224 'Nombre d'heures de [Nom 2] sur [Affaire 2] durant [Année 4]
Tableau(4, 3, 1) = 231 'Nombre d'heures de [Nom 2] sur [Affaire 3] durant [Année 1]
Tableau(4, 3, 2) = 232 'Nombre d'heures de [Nom 2] sur [Affaire 3] durant [Année 2]
Tableau(4, 3, 3) = 233 'Nombre d'heures de [Nom 2] sur [Affaire 3] durant [Année 3]
Tableau(4, 3, 4) = 234 'Nombre d'heures de [Nom 2] sur [Affaire 3] durant [Année 4]
Tableau(2, 4, 1) = 311 'Nombre d'heures de [Nom 3] sur [Affaire 1] durant [Année 1]
Tableau(2, 4, 2) = 312 'Nombre d'heures de [Nom 3] sur [Affaire 1] durant [Année 2]
Tableau(2, 4, 3) = 313 'Nombre d'heures de [Nom 3] sur [Affaire 1] durant [Année 3]
Tableau(2, 4, 4) = 314 'Nombre d'heures de [Nom 3] sur [Affaire 1] durant [Année 4]
Tableau(3, 4, 1) = 321 'Nombre d'heures de [Nom 3] sur [Affaire 2] durant [Année 1]
Tableau(3, 4, 2) = 322 'Nombre d'heures de [Nom 3] sur [Affaire 2] durant [Année 2]
Tableau(3, 4, 3) = 323 'Nombre d'heures de [Nom 3] sur [Affaire 2] durant [Année 3]
Tableau(3, 4, 4) = 324 'Nombre d'heures de [Nom 3] sur [Affaire 2] durant [Année 4]
Tableau(4, 4, 1) = 331 'Nombre d'heures de [Nom 3] sur [Affaire 3] durant [Année 1]
Tableau(4, 4, 2) = 332 'Nombre d'heures de [Nom 3] sur [Affaire 3] durant [Année 2]
Tableau(4, 4, 3) = 333 'Nombre d'heures de [Nom 3] sur [Affaire 3] durant [Année 3]
Tableau(4, 4, 4) = 334 'Nombre d'heures de [Nom 3] sur [Affaire 3] durant [Année 4]
21redim-array3d.xlsm (14.97 Ko)

Auriez-vous une piste s'il vous plait ?

Bonjour,

Je n'ai actuellement pas de PC avec moi.

Cependant si tu créé un tableau 3D passerelle Dans lequel tu recopie les valeurs actuelles de ton tableau.

Tu le redimentionne et tu réécris les valeur de la passerelles a ton tableau ?

A bientôt

Bonjour,

c'est une idée effectivement d'utiliser un tableau temporaire pour stocker mes données,
mais n'y a t'il pas de solution "plus propre" et qui ne m'obligeront pas à faire cette copie autant de fois ?
Car avec cette méthode, je vais devoir "transvaser" mon tableau vers le temporaire et vice versa autant de fois que j'aurai d'entrées...

Si aucune autre méthode n'est proposée, j'avancerai avec solution. Merci pour ton aide.

zut, j'ai effacé mon message !

J'ai attendu et réfléchi avant de répondre ... je pense ne effet qu'il n'y a pas de solution globale, c'est une solution d fourmi mais avec des array le temps est quasi instantané.

J'aimerais bien avoir la réponse concrète quand quelqu'un aura développé (je vais m'y mettre aussi).

Bonjour,

Si au lieu d'utiliser un tableau 3D, tu utilises une feuille de données masquée et dédiée ?

Alors oui il y a toute une programmation à refaire mais tu peux réécrire des données comme il te convient.

Bonjour,

Au départ, ce qui m'intéressait dans le sujet, c'était de manipuler un tableau 3D.

Mais maintenant je ne suis plus sûr de comprendre le sujet, sa finalité. Car un tableau 3D n'est qu'un moyen éphémère de calcul, un fois excel fermé il disparaît ! Ce qu'il reste ce sont les données dans des cellules.

Je veux développer une macro qui va parcourir des feuilles de pointages d'employés, pour avoir comme résultat final un tableau Excel récapitulatif, listant en abscisse tous les employés et en ordonnée toutes les affaires sur lesquelles des heures ont été pointées, celles-ci découpées par année.

Dans ce cas, il me semble plus simple de lister dans un seul onglet, à la queue leu leu, les valeurs et de faire un ou des TCD desquels on peut ensuite extraire facilement des données.

6redim-array3d.xlsm (23.98 Ko)

Au départ, ce qui m'intéressait dans le sujet, c'était de manipuler un tableau 3D.

Bonjour,

moi aussi ce qui m'intéresse, c'est de trouver une solution en manipulant un tableau 3D .

Concernant la finalité, je vais ensuite parcourir la variable 3D pour coller les données dans des cellules, car le résultat final souhaité est exactement le tableau sous la forme qu'il a sur la Feuil1. (Car d'autres fichiers utilisent ensuite les données de ce tableau)

J'ai appliqué la méthode proposé par Moul : je sauvegarde toutes les données du tableau avant redimensionnement, puis je restaure les données, le tout en utilisant 3 boucles imbriquées.

Par soucis de clarté du code, et aussi de réutilisation de cette méthode, j'essaie de faire une fonction.
La fonction ci-dessous fonctionne, mais génère une erreur à la toute fin, lors de l'éxecution de la ligne End Function
Erreur d'éxecution 13 : Incompatibilité de type

Option Explicit
Option Base 1
'========================================================================
'Cette fonction permet d'ajouter x lignes dans n'importe quelle Dimension d'un tableau à 3 Dimensions
'sans perte de données.
Function Ajout_Elements_dans_Tableau_3D(Tableau, Dimension As Integer, NbElement As Integer) As Variant
Dim Tableau_Copie()
Dim x, y, z As Integer
Dim NbElementDim1, NbElementDim2, NbElementDim3 As Integer

'Copie du tableau dans un tableau temporaire pour préserver les données avant Redimensionnement
ReDim Tableau_Copie(LBound(Tableau, 1) To UBound(Tableau, 1), LBound(Tableau, 2) To UBound(Tableau, 2), LBound(Tableau, 3) To UBound(Tableau, 3))
For x = LBound(Tableau, 1) To UBound(Tableau, 1)
    For y = LBound(Tableau, 2) To UBound(Tableau, 2)
        For z = LBound(Tableau, 3) To UBound(Tableau, 3)
            Tableau_Copie(x, y, z) = Tableau(x, y, z)
        Next z
    Next y
Next x

'Redimensionnement du tableau
If Dimension = 1 Then
    NbElementDim1 = NbElement
ElseIf Dimension = 2 Then
    NbElementDim2 = NbElement
ElseIf Dimension = 3 Then
    NbElementDim3 = NbElement
End If
ReDim Tableau(LBound(Tableau, 1) To UBound(Tableau, 1) + NbElementDim1, LBound(Tableau, 2) To UBound(Tableau, 2) + NbElementDim2, LBound(Tableau, 3) To UBound(Tableau, 3) + NbElementDim3)

'Récupération des valeurs sauvegardées du tableau
For x = LBound(Tableau_Copie, 1) To UBound(Tableau_Copie, 1)
    For y = LBound(Tableau_Copie, 2) To UBound(Tableau_Copie, 2)
        For z = LBound(Tableau_Copie, 3) To UBound(Tableau_Copie, 3)
            Tableau(x, y, z) = Tableau_Copie(x, y, z)
        Next z
    Next y
Next x

End Function

'========================================================================
Sub Test()

Dim Tableau()
ReDim Tableau(1 To 4, 1 To 4, 1 To 4)

'Redim de la Dimension 1 du Tableau (Ajout d'un affaire)
Tableau = Ajout_Elements_dans_Tableau_3D(Tableau, 1, 1)

End Sub

Connaissez-vous la cause de cette erreur ?

Enlève les parenthèses à la définition de Tableau

Dim Tableau

Enlève les parenthèses à la définition de Tableau

Dim Tableau

Si j'enlève les parenthèses, la variable tableau se retrouve vide en sortie de Fonction (Type Variant/Empty)

Bonjour,

Ajoute ceci a la fin de ta fonction.

Ajout_Elements_dans_Tableau_3D = Tableau

A bientot.

PS : Pour info, il existe le "Redim Preserve". Cependant il fonctionne uniquement si tu change la taille de la dernière dimension et préserve toutes les informations de ton tableau. Mais que pour modifier la dernière dimension malheureusement...

Merci Moul, la fonction fonctionne correctement maintenant.

Oui je connais le Redim Preserve que j'utilise pour les Array 1D ou 2D, mais pour l'array 3D, je n'ai pas trouvé comment utiliser cette méthode.

Merci à tous pour vos réponses.

Rechercher des sujets similaires à "redimensionner variable tableau perte donnees"