Redim Preserve d'un tableau de Type

Messages postés
4
Date d'inscription
mardi 29 mars 2011
Statut
Membre
Dernière intervention
30 mars 2011
- - Dernière réponse : NHenry
Messages postés
14597
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
2 décembre 2019
- 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
Afficher la suite 

7 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
62
0
Merci
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)
Commenter la réponse de cs_Jack
Messages postés
4
Date d'inscription
mardi 29 mars 2011
Statut
Membre
Dernière intervention
30 mars 2011
0
Merci
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 !
Commenter la réponse de davgrenoble
Messages postés
4
Date d'inscription
mardi 29 mars 2011
Statut
Membre
Dernière intervention
30 mars 2011
0
Merci
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 !!
Commenter la réponse de davgrenoble
Messages postés
14597
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
2 décembre 2019
137
0
Merci
Bonjour,

Redim Preserve interdit de changer la borne inférieure.

ReDim Preserve Infos(0 To i+1)

Mon site
Commenter la réponse de NHenry
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
62
0
Merci
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)
Commenter la réponse de cs_Jack
Messages postés
4
Date d'inscription
mardi 29 mars 2011
Statut
Membre
Dernière intervention
30 mars 2011
0
Merci
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...
Commenter la réponse de davgrenoble
Messages postés
14597
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
2 décembre 2019
137
0
Merci
Bonjour,

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

Mon site
Commenter la réponse de NHenry