XL 2010 [RESOLU] Redim Preserve

cp4

XLDnaute Barbatruc
Bonjour,

J'arrive à alimenter mon tableau en bouclant sur toutes les feuilles et lignes répondant à un critères (en colonne H--> Facture envoyé).
Mais j'ai voulu au préalable mettre dans le tableau le titre des entêtes avant de commencer la boucle qui l'alimente à partir des feuilles.
Si je fais comme ci-dessous le code plante sur Tb(1,1)= "Mois" avec message d'erreur "l'indice n'appartient pas à la sélection"
VB:
Dim Tb()
Tb(1, 1) = "Mois": Tb(2, 1) = "No Chantier": Tb(3, 1) = "Entreprise": Tb(4, 1) = "PV"
Par contre, si je dimensionne le tableau comme ceci: Dim Tb(1 To 4, 1 To 1)
J'ai une erreur de compilation sur la ligne ReDim Preserve Tb(1 To 4, 1 To n), indiquant tableau déjà dimensionné.
Un peu perdu, votre aide me sera salutaire.

Avec mes remerciement anticipés.
 

Pièces jointes

  • Redim Preserve.xlsm
    94.9 KB · Affichages: 9
Solution
Bonjour cp4, Lolote83,

Au lieu de dimensionner le tableau avec Dim utiliser ReDim :
VB:
Dim ws As Worksheet, dl As Long, i As Long, n As Long
ReDim Tb(1 To 4, 1 To 1)
Tb(1, 1) = "Mois": Tb(2, 1) = "No Chantier": Tb(3, 1) = "Entreprise": Tb(4, 1) = "PV"
n = 1
A+

Lolote83

XLDnaute Barbatruc
Bonjour CP4,
je patauge aussi beaucoup avec les tableaux mais effectivement, tu dimensionnes au départ ton tableau
Dim Tb(1 To 4, 1 To 1)
puis tu souhaites ensuite le redimensionner par
ReDim Preserve Tb(1 To 4, 1 To n)
et c'est là que tout va mal
Par contre en faisant comme ça, je n'ai pas d'erreur.
VB:
Sub Remplir_Tablo()
    Dim ws As Worksheet, dl As Integer, i As Integer
    'Dim Tb(1 To 4, 1 To 1)
    Dim Tb()
    'Tb(1, 1) = "Mois": Tb(1, 2) = "No Chantier": Tb(1, 3) = "Entreprise": Tb(1, 4) = "PV"

   
    With Worksheets("Diagrame année")
        For Each ws In ThisWorkbook.Worksheets    ' on parcourt toutes les feuilles du classeur
            If ws.Name <> "Diagrame année" Then
                dl = ws.Cells(Rows.Count, 1).End(xlUp).Row
                For i = 2 To dl
                    If ws.Range("H" & i) = "Facture envoyé" Then    'condition à vérifier
                        n = n + 1
                        ReDim Preserve Tb(1 To 4, 1 To n)
                        Tb(1, n) = ws.Name
                        Tb(2, n) = ws.Range("A" & i)
                        Tb(3, n) = ws.Range("B" & i)
                        Tb(4, n) = ws.Range("G" & i)
                  End If
                Next i
                ''---------------------------------------------------------------------------------------------
            End If
        Next ws
.[a1].CurrentRegion.Clear
.[a1].Resize(UBound(Tb, 2), UBound(Tb)) = Application.Transpose(Tb)
   End With
    MsgBox "Process terminé!"
End Sub
Par contre, n'étant pas a l'aise avec les tableaux, il y a peut être autre chose à voir.
Bon courage
@+ Lolote83
 

job75

XLDnaute Barbatruc
Bonjour cp4, Lolote83,

Au lieu de dimensionner le tableau avec Dim utiliser ReDim :
VB:
Dim ws As Worksheet, dl As Long, i As Long, n As Long
ReDim Tb(1 To 4, 1 To 1)
Tb(1, 1) = "Mois": Tb(2, 1) = "No Chantier": Tb(3, 1) = "Entreprise": Tb(4, 1) = "PV"
n = 1
A+
 

cp4

XLDnaute Barbatruc
Bonjour CP4,
je patauge aussi beaucoup avec les tableaux mais effectivement, tu dimensionnes au départ ton tableau

puis tu souhaites ensuite le redimensionner par

et c'est là que tout va mal
Par contre en faisant comme ça, je n'ai pas d'erreur.
VB:
Sub Remplir_Tablo()
    Dim ws As Worksheet, dl As Integer, i As Integer
    'Dim Tb(1 To 4, 1 To 1)
    Dim Tb()
    'Tb(1, 1) = "Mois": Tb(1, 2) = "No Chantier": Tb(1, 3) = "Entreprise": Tb(1, 4) = "PV"

  
    With Worksheets("Diagrame année")
        For Each ws In ThisWorkbook.Worksheets    ' on parcourt toutes les feuilles du classeur
            If ws.Name <> "Diagrame année" Then
                dl = ws.Cells(Rows.Count, 1).End(xlUp).Row
                For i = 2 To dl
                    If ws.Range("H" & i) = "Facture envoyé" Then    'condition à vérifier
                        n = n + 1
                        ReDim Preserve Tb(1 To 4, 1 To n)
                        Tb(1, n) = ws.Name
                        Tb(2, n) = ws.Range("A" & i)
                        Tb(3, n) = ws.Range("B" & i)
                        Tb(4, n) = ws.Range("G" & i)
                  End If
                Next i
                ''---------------------------------------------------------------------------------------------
            End If
        Next ws
.[a1].CurrentRegion.Clear
.[a1].Resize(UBound(Tb, 2), UBound(Tb)) = Application.Transpose(Tb)
   End With
    MsgBox "Process terminé!"
End Sub
Par contre, n'étant pas a l'aise avec les tableaux, il y a peut être autre chose à voir.
Bon courage
@+ Lolote83
Bonjour Lolotte83;),

Merci pour ton retour. J'avais fais comme tu le proposes et ça fonctionne correctement.
Moi aussi, je ne suis pas très à l'aise avec les tableaux d'où mon pataugeage.
En fait, je voulais remplir le tableau avec des titres d’entêtes et ensuite récupérer au fur et à mesures les données. c-à-d à chaque tour ajouter une colonne plus-qu’on ne peut modifier que la dernière dimension.
Pas du tout simple pour moi. Je n'arrive pas à bien maitriser ces notions.

Merci quand même.

Bonne journée.
 

cp4

XLDnaute Barbatruc
Bonjour cp4, Lolote83,

Au lieu de dimensionner le tableau avec Dim utiliser ReDim :
VB:
Dim ws As Worksheet, dl As Long, i As Long, n As Long
ReDim Tb(1 To 4, 1 To 1)
Tb(1, 1) = "Mois": Tb(2, 1) = "No Chantier": Tb(3, 1) = "Entreprise": Tb(4, 1) = "PV"
n = 1
A+
Bonjour Job75:cool:,

Tu es génial. C'est parfait.
Merci de nous éclairer et nous faire profiter de tes connaissances.
On préconise de toujours déclarer les variables, mais là tu as redimensionné directement.
Merci de nous expliquer Stp.
 

Discussions similaires

Statistiques des forums

Discussions
312 304
Messages
2 087 067
Membres
103 451
dernier inscrit
Souleymane