XL 2016 VBA - Erreur de redimensionnement de mon tableau

JL9

XLDnaute Nouveau
Bonjour,

J'espère que vous allez bien et que le sujet n'a pas déjà été traité.

Ce que je cherche à faire :
Transférer un tableau structuré dans un tableau VBA pour diminuer mes temps de calculs et de traitement de données.

Pour illustrer mon problème, je vous joins un exemple contenant moins de données que dans le fichier que je traite normalement.

Dans cet exemple, j'ai transposé mes données de mon tableau structuré vers mon tableau VBA, puis j'ai effectué quelques modifications de données. Malheureusement je n'arrive pas à ajouter de nouvelle ligne à mon tableau VBA et je ne sais pas si mon code me permettra de transférer mon tableau VBA vers mon tableau structuré avec cette syntaxe. Seriez-vous en mesure de m'aider sur ce point ci svp ?

Par la même occasion et si vous avez le temps, je prends toute remarque constructive me permettant d'améliorer ma syntaxe.

Merci du temps que vous m'accorder.

Cordialement,

Jonas

ci-dessous le code :
VB:
Option Explicit

Sub Mon_Tableau()
Dim monTableau()

'Copier le tableau structuré dans un tableau VBA
monTableau() = Range("T_Tableau")

'Changer une valeur dans le monTableau
monTableau(2, 2) = "ARTICLE10" 'ARTICLE01 --> ARTICLE10

'Vérifications
Debug.Print UBound(monTableau)
Debug.Print monTableau(2, 2)
Debug.Print monTableau(1, 1) & Chr(10)

'Ajouter une ligne
ReDim Preserve monTableau(UBound(monTableau) + 1)

Debug.Print UBound(monTableau) 'Vérifications

monTableau(7, 1) = 7
monTableau(7, 2) = ART07
monTableau(7, 3) = 10

'Actualiser le tableau structuré
Range("T_Tableau") = monTableau

End Sub
 

Pièces jointes

  • Problème de tableau VBA.xlsm
    18.9 KB · Affichages: 7
Solution
Bonjour
bien que je ne vois pas l’intérêt de de bidouiller une variable tableau 2 dim
pour ajouter une ligne a un TS
je vous donne ma vision
redim preserve et tout i cointi vous oubliez !!!!!!!!!!!!


il y a une méthode bien plus simple
ben c'est simple en plus !!! vous utilisez la méthode s dans vos demo mais a la fin :D

on prend le tableau structuré par son (range+resize) et non listobject
déjà on a notre variable tableau avec sa ligne en plus
on alimente la ligne(ubound) avec les new données
on ajoute une row a listrows
ben on fini par .value=tablo
démonstration
VB:
Sub test()
    With Range("Tableau1")    ' on le prend en tant que range et non listobject au depart
    'on obtient donc le...

ChTi160

XLDnaute Barbatruc
Bonjour
je pense que tu ne peux pas redimensionner un tableau temporaire de cette Façon ,tu peux redimensionner le Nombre de Colonne mais pas de Ligne !
pourquoi pas ajouter une Ligne de données directement dans le Tableau "T_Tableau"
jean marie
 
Dernière édition:

BrunoM45

XLDnaute Barbatruc
Bonjour le fil,

ChTi160 à poser une bonne question ;)

Mais pour le fun voici mon code pour ajouter une ligne dans un tableau VBA à 2 dimensions ✌️
VB:
Sub Mon_Tableau()
  Dim MonTableau() As Variant
  Dim TabTemp() As Variant
  Dim Inc As Long
  'Copier le tableau structuré dans un tableau VBA
  MonTableau() = Range("T_Tableau")
  'Changer une valeur dans le monTableau
  MonTableau(2, 2) = "ARTICLE10" 'ARTICLE01 --> ARTICLE10
  ' Quelle taille à mon tableau
  Inc = UBound(MonTableau)
  ' Redimensionner le tbaleau temporaire avec cette taille
  ReDim TabTemp(3, 1 To Inc)
  ' Transposer MonTableau dans TabTemp = Lignes=>Colonnes
  TabTemp = Application.Transpose(MonTableau)
  ' Ajouter un indice
  Inc = Inc + 1 ' Ajouter une colonne
  ' Redimensionner le TabTemp en gardant les valeur
  ' Preserve ne sait le faire que sur la dernière dimension d'où la transpoisition
  ReDim Preserve TabTemp(1 To 3, 1 To Inc)
  ' Inscrire les valeurs dans TabTemp
  TabTemp(1, Inc) = Inc
  TabTemp(2, Inc) = "ART" & Format(Inc, "00")
  TabTemp(3, Inc) = 10
  ' Redimensionner MopnTableau avec le nouvel indice = efface tout
  ReDim MonTableau(1 To Inc, 3)
  ' Retransposer TabTemp dans MonTableau
  MonTableau = Application.Transpose(TabTemp)
  'Actualiser le tableau structuré
  ActiveSheet.ListObjects("T_Tableau").ListRows.Add
  Range("T_Tableau") = MonTableau
End Sub

@+
 

ChTi160

XLDnaute Barbatruc
Re
ce que j'ai bidouillé sans passé par le Tableau Temporaire "TabTemp"
à tester Lol
là j'ajoute deux Lignes !
VB:
Sub Mon_Tableau_2()
  Dim MonTableau() As Variant
  Dim Inc As Long
  Erase MonTableau
  'Copier le tableau structuré dans un tableau VBA en l'inversant
  MonTableau = Application.Transpose(Range("T_Tableau"))
  'Changer une valeur dans le monTableau
  MonTableau(2, 2) = "ARTICLE10" 'ARTICLE01 --> ARTICLE10
  ' Quelle taille à mon tableau
  Inc = UBound(MonTableau, 2)
  ' Ajouter un indice
        Inc = Inc + 1     ' Ajouter une colonne  
  ' Preserve ne sait le faire que sur la dernière dimension 
  ReDim Preserve MonTableau(1 To 3, 1 To Inc)
  ' Inscrire les valeurs dans MonTableau
  MonTableau(1, Inc) = Inc
  MonTableau(2, Inc) = "ART" & Format(Inc, "00")
  MonTableau(3, Inc) = 10
      Inc = Inc + 1      ' Ajouter une colonne 
  ReDim Preserve MonTableau(1 To 3, 1 To Inc)
  MonTableau(1, Inc) = Inc
  MonTableau(2, Inc) = "ART" & Format(Inc, "00")
  MonTableau(3, Inc) = 10 
'On redimmensionne le tableau Structuré et l'on y colle le Tableau en l'inversant
  Range("T_Tableau").Resize(UBound(MonTableau, 2), UBound(MonTableau, 1)) = Application.Transpose(MonTableau)
End Sub
Bonne fin de Soirée
Jean marie
 

laurent950

XLDnaute Accro
Bonsoir,

'Ajouter une ligne
monTableau = Application.Transpose(monTableau)
ReDim Preserve monTableau(LBound(monTableau, 1) To UBound(monTableau, 1), LBound(monTableau, 2) To UBound(monTableau, 2) + 1)
monTableau = Application.Transpose(monTableau)


VB:
Option Explicit

Sub Mon_Tableau()
Dim monTableau() As Variant

'Copier le tableau structuré dans un tableau VBA
    monTableau() = Range("T_Tableau")

'Changer une valeur dans le monTableau
    monTableau(2, 2) = "ARTICLE10" 'ARTICLE01 --> ARTICLE10

'Vérifications
    Debug.Print UBound(monTableau)
    Debug.Print monTableau(2, 2)
    Debug.Print monTableau(1, 1) & Chr(10)

'Ajouter une ligne
    monTableau = Application.Transpose(monTableau)
    ReDim Preserve monTableau(LBound(monTableau, 1) To UBound(monTableau, 1), LBound(monTableau, 2) To UBound(monTableau, 2) + 1)
    monTableau = Application.Transpose(monTableau)
    
    Debug.Print UBound(monTableau) 'Vérifications

    monTableau(7, 1) = 7
    monTableau(7, 2) = "ART07"
    monTableau(7, 3) = 10

'Actualiser le tableau structuré
    Range("T_Tableau").Resize(UBound(monTableau, 1), UBound(monTableau, 2)) = monTableau
End Sub
 

patricktoulon

XLDnaute Barbatruc
Bonjour
bien que je ne vois pas l’intérêt de de bidouiller une variable tableau 2 dim
pour ajouter une ligne a un TS
je vous donne ma vision
redim preserve et tout i cointi vous oubliez !!!!!!!!!!!!


il y a une méthode bien plus simple
ben c'est simple en plus !!! vous utilisez la méthode s dans vos demo mais a la fin :D

on prend le tableau structuré par son (range+resize) et non listobject
déjà on a notre variable tableau avec sa ligne en plus
on alimente la ligne(ubound) avec les new données
on ajoute une row a listrows
ben on fini par .value=tablo
démonstration
VB:
Sub test()
    With Range("Tableau1")    ' on le prend en tant que range et non listobject au depart
    'on obtient donc le databodyrange(sans le header)

'on redimensionne la variable directement avec une ligne en plus
        tablo = .Resize(.Rows.Count + 1, .Columns.Count).Value

        'on ajoute les données sur la derniere ligne de la variable tablo
        tablo(UBound(tablo), 1) = "trucbidule"
        tablo(UBound(tablo), 2) = "toto"
        tablo(UBound(tablo), 3) = "36"

        'on ajoute la ligne au tableau structuré
        .ListObject.ListRows.Add

        'on remet les valeur de la variable tablo dans le tableau structuré
        .ListObject.DataBodyRange = tablo
    End With
End Sub
demo7.gif


mais je vous le redis je n'en vois pas l’intérêt même pour des eventuels calculs
normalement on ajoute une ligne et on y place les données

le range de la nouvelle ligne c'est
Code:
with range ("tableau1").listobject
.listrows.add
 MsgBox .ListRows(.ListRows.Count).Range.Address
end with

bref vous l'avez compris on peut se simplifier la vie
c'est d'ailleurs pour ca que les TS existent (me semble t il!!) et non le contraire;)
 

JL9

XLDnaute Nouveau
Merci à tous pour vos réponses.

Je cherche à passer par un tableau temporaire pour diminuer mes temps de calculs. Il me semble que les temps de calculs sont moindre avec les tableaux temporaire qu'avec les tableaux structurés. Le fichier que j'ai envoyé n'est qu'une illustration comparé aux données que je traite.

J'ai retenu la solution de patricktoulon qui me semblait simple et efficace à mettre en place. Cependant je garde toutes les autres solutions pour les cas où j'aurais besoin de redimensionner mon tableau.

Je vous remercie tous pour votre aide.

A bientôt,

JL6
 

Discussions similaires

Haut Bas