ReDim Preserve plante sur un tableau à dimension (VB4)

- - Dernière réponse : AngeliusMefyrx
Messages postés
52
Date d'inscription
lundi 20 mars 2006
Statut
Membre
Dernière intervention
14 octobre 2007
- 1 avril 2006 à 21:43
J'essaie de changer la derniére dimension d'un tableau avec l'instruction :

Redim Preserve Tableau(n,n,t)

Et j'obtiens une erreur n°9 : "Indice en dehors de la plage"
Pourtant, dans le même module, aucun probléme pour un tableau à deux dimensions !

Je trouve pas ou j'ai gaffé, voilà un schéma de mon code :

[Module 1]
(Déclarations)
Type Session
Tab() as double
End Type
Public CalcSS as session

[Form 1]
(Déclaration)
Private aSession as session
(Sub)
Redim aSession.Tab(n,n,1)

aSession.Tab(i,j,1)=Valeur
<Next>
(Sub)
Module1.CalcSS=aSession
[Module 1]
(Sub)
Redim Preserve CalcSS.Tab(n,n,2)***

*** Et là, paf erreur n°9 !

Aargg, ça m'énerve !
Aidez moi s'il vous plait !
Merci, merci, merci !
Afficher la suite 

5 réponses

0
Merci
J'ai écrit un petit truc suivant ta structure et je n'ai pas trouvé.

la valeur de 'n' est t'elle bien définie?

dans la DOC il est dit qu'on ne peux pas redimensionner un tableau passé par référence... mais ta variable CalcSS est globale donc ce n'est pas ça.

La seule vraie faute est que 'Tab' est une fonction de VB et par conséquent moi j'ai utilisé 'Tab1' et tout vas. Pour trouver il faudrait que tu soit plus explicite sur ton code exact.
0
Merci
j'ai pas fais gaffe en écrivant le message, mais je n'ai pas utilisé 'Tab()' dans mon code mais exactement : Session.tAff()
la valeur 'n' est bien définie, comme : 'Session.NbInd'

Essayons d'être plus détaillé :

[mMain]
(Déclarations)
*** Ici, je déclare le type de variable 'Session' qui doit être déclarable de partout ***
Type Session
.tAff() as double
.NbInd as integer
.NbIter as integer
End Type
*** CalcSS doit pouvoir être accessible de n'importe où ***
Public CalcSS as session

[frmSession]
(Déclaration)
*** aSession reste privée car il peut exister plusieurs occurences de frmSession (feuille MDI-fille)***
Private aSession as session

(Sub : pRead)
Dim i as integer
Dim j as integer
aSession.NbInd= *Valeur*
Redim aSession.tAff(aSession.NbInd,aSession.NbInd,1)
For i=1 to aSession.NbInd
For j=1 to aSession.NbInd
aSession.tAff(i,j,1)=*Valeur*
Next j
Next i

(Sub : pReadToTab)
*** Cette procédure est appelée par une autre au niveau de la feuille MDI-mère par 'ActiveForm.pReadToTab'***
mMain.CalcSS=aSession

[mMain]
(Sub : pCalc)
Dim t as integer
*** Cette procédure est aussi appelée au niveau de la feuille MDI-mère ***
For t=2 to CalcSS.NbIter
Redim Preserve CalcSS.tAff(aSession.NbInd,aSession.NbInd,t)
*** Là, ça plante au premier t=2 ***
*** Mais si je 'ReDim' sans le 'Preserve', ça marche, mais bien sur, mon tableau est efface... ***
Next t

Tu me parles d'un pB de passage par référence, est-il possible que le fait d'affecter CalcSS dans une feuille fille puisse le faire passer comme ça ?
Sinon, j'ai VB en version 4, c'est peut être un bug ?
Aaaarrggg je commenbce à en avoir assez !

Aurais tu une idée pour contourner le pB ?

Merci de ton aide.
Messages postés
52
Date d'inscription
lundi 20 mars 2006
Statut
Membre
Dernière intervention
14 octobre 2007
0
Merci
J'ai le même */&$*&$(/(*$ de problème
Si je met pas le perserve, ça fonctionne.......mais j'en ai besoin
Sinon ma contourner le /(**()/$()/()*$ de bug en me créant un 2e tableau et copiant une a une les entrée après la redimension

-Module
Public Last_Keyword() as string

-Form Load
ReDim Last_Keyword(1 To 1, 1 To 2)

Je peux faire autant de redim que je veux dans le form load et ca fonctionne,,,,mais dès que j'ai des entrées dans ma table et que je veux la redimension avec un preserv..../()$/)($ d'erreur 9

ReDim Preserve Last_Keyword(1 To Int(Last_Keyword_H), 1 To 2)
Messages postés
52
Date d'inscription
lundi 20 mars 2006
Statut
Membre
Dernière intervention
14 octobre 2007
0
Merci
En fait en fesant des teste dans mon form load:

Dim tabarn() As Integer
ReDim tabarn(1 To 2, 1 To 2)
tabarn(1, 1) = 1
ReDim Preserve tabarn(1 to 5, 1 to 5) <--erreur 9

Dim tabarn() As Integer
ReDim tabarn(1 To 2)
tabarn(1) = 1
ReDim Preserve tabarn(1 to 5) <--- Fonctionne

wtf
Messages postés
52
Date d'inscription
lundi 20 mars 2006
Statut
Membre
Dernière intervention
14 octobre 2007
0
Merci
Bon j'ai trouvé le fuck, on peu seulement redimensionner la dernière colonne d'un tableau avec le preserv
Bon, j'aurai pas trop trop de problème à corriger `ca, ma inverser mon tableau de bord....comme je tentais de redimensionner la première et non la dernière

Merci à:



Re : Redim Preserve ???? Posté par : 17812 moustachu (Membre Club) le 12/05/2004 14:09:33




,
=17812 22 codes CS
/auteurdetail.aspx?ID=17812 En fait tu peux redimensionner même un tableau à plusieurs dimensions mais tu ne redimensionneras que la dernière dimension
cf MSDN
:
For example, if your array has only one dimension, you can resize that dimension and still preserve the contents of the array, because it is the last and only dimension. However, if your array has two or more dimensions, you can change the size of only the last dimension if you use Preserve.

The following example increases the size of the last dimension of a dynamic array without losing any existing data in the array, and then decreases the size with partial data loss:

Dim IntArray(10, 10, 10) As Integer
' ...
ReDim Preserve IntArray(10, 10, 20)
' ...
ReDim Preserve IntArray(10, 10, 15)
The first ReDim creates a new array, copying all the elements from the existing array. It also adds 10 more columns to the end of every row in every layer. The elements in these new columns are initialized to the default value of the element type of the array.

The second ReDim creates another new array, copying all the elements that fit. However, five columns are lost from the end of every row in every layer. This is not a problem if you have finished using these columns. Reducing the size of a large array can free up memory that you no longer need.

You can use ReDim on a property that holds an array of values.

Example
This example uses the ReDim statement to allocate and reallocate storage space for array variables.

Dim I, MyArray() As Integer ' Declare variable and array variable.
ReDim MyArray(5) ' Allocate 6 elements.
For I = 0 To UBound(MyArray)
MyArray(I) = I ' Initialize array.
Next I
The next statement resizes the array without saving the contents of the elements.

ReDim MyArray(10) ' Resize to 11 elements.
For I = 0 To UBound(MyArray)
MyArray(I) = I ' Initialize array.
Next I
The following statement resizes the array but saves the contents of the elements.

ReDim Preserve MyArray(15) ' Resize to 16 elements.
See Also
Const Statement | Dim Statement | Erase Statement