Redim Preserve d'un tableau de Type

davgrenoble Messages postés 4 Date d'inscription mardi 29 mars 2011 Statut Membre Dernière intervention 30 mars 2011 - 29 mars 2011 à 16:13
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 30 mars 2011 à 20:37
Bonjour,

D'habitude, je trouve la réponse à mes problèmes sur le forum, mais pas cette fois-ci.
Voici mon souci : J'ai une erreur 'L'indice n'appartient pas à la sélection' sur le preserve qui suit le Redim. Sans Preserve, ça marche (mais évidemment, il me perd les données à chaque redimesionnement) Le code est le suivant:

Type InformationsAppels
    DateAppel As Date
    NbAppels As Double
    ComTech As String
    Activite As String
End Type

Sub ObtentionHistorique(ByRef Infos() As InformationsAppels)

ReDim Infos(0 To 1)

i = 1
continuer = True
While continuer
        Infos(i).NbAppels = ThisWorkbook.Sheets("DATABASE").Cells(i + 1, 3).Value
    continuer = (ThisWorkbook.Sheets("DATABASE").Cells(i + 2, 1).Value <> "")
    ReDim Preserve Infos(i To i+1)
    i = i + 1
Wend
  
End Sub


Merci pour votre aide

David
A voir également:

7 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 mars 2011 à 16:39
Salut

Tel que tu nous le montres, le paramètres Infos est déclaré, mais ne désigne pas une variable.
Pour pouvoir faire un ReDim, il faut d'abord avoir fait un Dim avant d'appeler la fonction.
Dim mesInfos() As InformationsAppels
Call ObtentionHistorique(mesInfos)
MsgBox UBound(mesInfos)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
davgrenoble Messages postés 4 Date d'inscription mardi 29 mars 2011 Statut Membre Dernière intervention 30 mars 2011
29 mars 2011 à 16:56
En fait, je n'avais pas mis tout le code pour essayer d'être plus clair.
Je mets cette fois-ci le code complet.

Option Explicit

'Définition du type
Type InformationsAppels
    DateAppel As Date
    NbAppels As Double
    ComTech As String
    Activite As String
End Type


Sub CalculPrev()

Dim month As Integer
Dim year As Integer
Dim i As Integer

'Définit le tableau d'enregistrement
Dim HistoricalData() As InformationsAppels
Dim Prev(62) As InformationsAppels

month = ThisWorkbook.Sheets("Summary").Cells(16, 3).Value
year = ThisWorkbook.Sheets("Summary").Cells(18, 3).Value

For i = 1 To 31
    If IsDate(i & "/" & month & "/" & year) Then
        Prev(i).DateAppel = i & "/" & month & "/" & year
    End If
Next i
For i = 32 To 62
    If IsDate(i & "/" & month & "/" & year) Then
        Prev(i).DateAppel = i & "/" & month & "/" & year
    End If
Next i

    ObtentionHistorique HistoricalData
    Previsions HistoricalData, Prev

End Sub


Sub ObtentionHistorique(ByRef Infos() As InformationsAppels)

Dim continuer As Boolean
Dim i As Long

ReDim Infos(0 To 1)
'Définit la taille du tableau
i = 1
continuer = True
While continuer
    'If ThisWorkbook.Sheets("DATABASE").Cells(i, 7).Value = "Global" Then
        Infos(i).DateAppel = ThisWorkbook.Sheets("DATABASE").Cells(i + 1, 1).Value
        Infos(i).NbAppels = ThisWorkbook.Sheets("DATABASE").Cells(i + 1, 3).Value
        Infos(i).ComTech = ThisWorkbook.Sheets("DATABASE").Cells(i + 1, 6).Value
        Infos(i).Activite = ThisWorkbook.Sheets("DATABASE").Cells(i + 1, 7).Value
   ' End If
    continuer = (ThisWorkbook.Sheets("DATABASE").Cells(i + 2, 1).Value <> "")
    ReDim Infos(1 To 2)
    i = i + 1
Wend
  
End Sub


Merci !
0
davgrenoble Messages postés 4 Date d'inscription mardi 29 mars 2011 Statut Membre Dernière intervention 30 mars 2011
29 mars 2011 à 16:58
Petite erreur dans le post précédent. Les dernière lignes sont bien celle-ci:


    ReDim Preserve Infos(i To i+1)
    i = i + 1
Wend
  
End Sub


Et c'est toujours sur ce Preserve que j'ai l'erreur !!
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
29 mars 2011 à 19:51
Bonjour,

Redim Preserve interdit de changer la borne inférieure.

ReDim Preserve Infos(0 To i+1)

Mon site
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 mars 2011 à 19:52
Pourquoi passer d'une base 0 à une base 'i' avec (i To i+1) ?
C'est surement là que ça cloche : on ne doit pas pouvoir changer de de base initiale.
A mon avis, ce serait plutôt (0 To i+1)
0
davgrenoble Messages postés 4 Date d'inscription mardi 29 mars 2011 Statut Membre Dernière intervention 30 mars 2011
30 mars 2011 à 17:37
En fait si, j'ai besoin de redimensionner de i à i+1 parce qu'à chaque boucle du While mon tableau croit.

En fait, je viens de me rendre compte que je pourrais faire 2 boucles ; une pour déterminer la taille du tableau (et ainsi ne redimensionner qu'une fois) et l'autre pour rentrer les données.

Mais à priori, je ne vois pas pourquoi je ne pourrais pas redimensionner le tableau dans la boucle...
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
30 mars 2011 à 20:37
Bonjour,

Si ton tableau croit, il faut que tu donne la dimension totale et pas seulement l'ajout.

Mon site
0
Rejoignez-nous