VBA tableau 2 dimensions [Résolu]

chrisnyc 25 Messages postés mardi 16 août 2005Date d'inscription 22 septembre 2005 Dernière intervention - 9 sept. 2005 à 16:41 - Dernière réponse : chrisnyc 25 Messages postés mardi 16 août 2005Date d'inscription 22 septembre 2005 Dernière intervention
- 12 sept. 2005 à 21:35
bonjour
voici mon probleme j ai besoins d alimenter un tableau 2 d mais dont la taille n est pas constante
les redim utilises ici me donne une erreur!!!!!
voici mon bout de code qui plante
Dim Price() As String
Dim OverFlds() As String
Dim cusip() As String
.........................
For compt2 = LBound(cusip) To UBound(cusip)

If cusip(compt2) <> "" Then
Sheets(3).Range("A1").Select
compt = 0
For n = 1 To nb_over
If ActiveCell.Offset(compt2 - 1, n).Value <> "" Then
'ReDim Preserve Price(compt2, compt)
'ReDim Preserve OverFlds(compt2, compt)
OverFlds(compt2, compt) = Override_mnem(0)
Price(compt2, compt) = ActiveCell.Offset(compt2 - 1, n).Value
compt = compt + 1
End If
Next n
End If
Next compt2
..........................................

Merci d avance pour vos conseils
cordialement
christophe
Afficher la suite 

7 réponses

Zlub 815 Messages postés mercredi 11 octobre 2000Date d'inscription 29 septembre 2010 Dernière intervention - 9 sept. 2005 à 16:55
+3
Utile
Salut Chris NYC,


C'est dans la synthaxe de ton ReDim que ça cloche :



voisi une expmple idiot : dans la case 1 le nombre, dans la case 2, le carré ;)





Dim t() As String



Dim i As Integer



For i = 1 To 10



If i = 1 Then

ReDim t(1 To 2, 1 To 1)

Else

ReDim Preserve t(1 To 2, 1 To i)

End If



t(1, i) = i

t(2, i) = i * i

Next i



For i = 1 To 10

Debug.Print "t(1," & i; ") " & t(1, i) & " t(2," & i; ") " & t(2, i)

Next i





++

Zlub
Cette réponse vous a-t-elle aidé ?  
vaneri2004 28 Messages postés mardi 20 janvier 2004Date d'inscription 17 février 2006 Dernière intervention - 9 sept. 2005 à 16:56
+3
Utile
le plus simple est d'utilisé un tableau de type

Type tabQQC
var 1 as integer
var 2 as integer

End type
dim tab() as tabQQC

redim tab(0)
redim preserve tab(2)

tab(1).var1 = 4
tab(2).var2 = 5

plus simple et plus lisible

ou alors un tableau dans le type

type tabQQC
var() as integer
End type

et le tour est jouer
Cette réponse vous a-t-elle aidé ?  
Zlub 815 Messages postés mercredi 11 octobre 2000Date d'inscription 29 septembre 2010 Dernière intervention - 11 sept. 2005 à 03:14
+3
Utile
Salut Chris NYC,

Ou si tu préféres avec le "PCPT Style"


Type Tableau
ligne() As String
col() As String
End Type

Sub tableaux()
Dim t() As Tableau
Dim tmp As Tableau

Dim i As Integer
For i = 1 To 10

' Ajouter une entrée au tableau principal
If i = 1 Then
ReDim t(1 To 1)
Else
ReDim Preserve t(1 To i)
End If

' Ajouter des infos pour inserer une ligne dans le tableau principale
Dim j As Integer
For j = 1 To 7
If j = 1 Then
ReDim tmp.ligne(1 To 1)
ReDim tmp.col(1 To 1)
Else
ReDim Preserve tmp.ligne(1 To j)
ReDim Preserve tmp.col(1 To j)
End If
tmp.ligne(j) = "Attribut " & j
tmp.col(j) = "Valeur " & j
Next j
t(i) = tmp
Next i

' On affiche le tout
For i = 1 To UBound (t)
tmp = t(i)
Debug.Print vbCrLf

For j = 1 To UBound (tmp.ligne)
Debug.Print "tab(" & i & ")" & ".col(" & j & ") = " & tmp.col(j)
Debug.Print "tab(" & i & ")" & ".ligne(" & j & ")= " & tmp.ligne(j)
Next j
Next i
End Sub







++

Zlub
Cette réponse vous a-t-elle aidé ?  
Zlub 815 Messages postés mercredi 11 octobre 2000Date d'inscription 29 septembre 2010 Dernière intervention - 10 sept. 2005 à 00:55
+2
Utile
Salut Chris NYC,


Tu ne peux redimensionner que la dernieredimension d'un tableau. Donc
pour un tableau une Dimension, forcement ça fonctionne bien, mais un
tableau 2D, seul la seconde est modifiable.



Pour contourner, faut par exemple utiliser des types







Type Tableau

ligne() As String

col() As String

End Type



Sub tableaux()

Dim t() As Tableau

Dim tmp As Tableau



Dim i As Integer

For i = 1 To 10



' Ajouter une entrée au tableau principal

If i = 1 Then

ReDim t(1 To 1)

Else

ReDim Preserve t(1 To i)

End If



' Ajouter des infos pour inserer une ligne dans le tableau principale

Dim j As Integer

For j = 1 To 7

If j = 1 Then

ReDim tmp.ligne(1 To 1)

ReDim tmp.col(1 To 1)

Else

ReDim Preserve tmp.ligne(1 To j)

ReDim Preserve tmp.col(1 To j)

End If

tmp.ligne(j) = "Attribut " & j

tmp.col(j) = "Valeur " & j

Next j

t(i) = tmp

Next i



' On affiche le tout

For i = 1 To UBound(t)

tmp = t(i)

Debug.Print vbCrLf



For j = 1 To UBound(tmp.ligne)

Debug.Print "tab(" & i & ")" & ".col(" & j & ")= " & tmp.col(j)

Debug.Print "tab(" & i & ")" & ".ligne(" & j & ")= " & tmp.ligne(j)

Next j

Next i

End Sub




++

Zlub
Zlub 815 Messages postés mercredi 11 octobre 2000Date d'inscription 29 septembre 2010 Dernière intervention - 9 sept. 2005 à 17:27
0
Utile
Salut,

Forcément, avec un type, c'es plus élégant ...



Sauf que son probléme, c'est le redim dynamique ... d'où mon exemple
idiot, pour presenter comment ça fonctionne. Apres, c'est clair que
l'utilisation de type est préférable ... Pour ne nombreuse raison, dont
la lisibilitée du code...

++

Zlub
chrisnyc 25 Messages postés mardi 16 août 2005Date d'inscription 22 septembre 2005 Dernière intervention - 9 sept. 2005 à 18:24
0
Utile
Voici toute ma procedure

Sub Get_Cusips(Cusips() As String, Fields() As String, Fields_mnem() As String, Override() As String, Override_mnem() As String, Curve() As String, nb_cusip As Integer, nb_curve As Integer, nb_field As Integer, nb_over As Integer)

Dim Price() As String
Dim OverFlds() As String
Dim cusip() As String
Dim RngCusips As Range
Dim RngCell As Range

Dim n As Integer
Dim m As Integer
Dim compt As Integer
Dim compt2 As Integer


Dim ligne As Integer


ligne = 10


Sheet3.Select
Sheets(3).Range("A10").Select
For compt = 0 To nb_curve - 1
'CREATE CURVE
If Curve(compt) <> "" Then Call Module10.create_curve_bloomberg(Curve(compt), compt + 1)


'DEFINE ATTRIBUTE
For compt2 = 0 To nb_cusip - 1
ReDim Preserve cusip(ligne + compt2)

'JE RAJOUTE UNE CASE POUR CHAQUE CUSIP
ReDim Preserve Price(ligne + compt2)
ReDim Preserve OverFlds(ligne + compt2)
cusip(ligne + compt2) = Cusips(compt2)

Next compt2
ligne = ligne + 6 + nb_cusip
If compt <> nb_curve - 1 Then ActiveCell.Offset(ligne, 0).Select
Next compt

For compt2 = LBound(cusip) To UBound(cusip)

If cusip(compt2) <> "" Then
Sheets(3).Range("A1").Select
compt = 0
For n = 1 To nb_over

'JE VEUX RAJOUTER UNE DIMENSION SI LA CASE EST REMPLIE
If ActiveCell.Offset(compt2 - 1, n).Value <> "" Then
ReDim Preserve Price(0 to compt2, 0 To compt)
ReDim Preserve OverFlds(0 to compt2, 0 To compt)
OverFlds(compt2) = Override_mnem(0)
Price(compt2) = ActiveCell.Offset(compt2 - 1, n).Value
compt = compt + 1
End If
Next n
End If
Next compt2


'SEND TO BLP
Set DataControl = New Class1
Call DataControl.Get_OAS(cusip, Price, OverFlds, Fields_mnem, ligne)

Sheets(3).Range("A10").Select


End Sub
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
En fait le probleme est certainement que ma table doit avoir autant de colonne sur chaque ligne?
dans ce cas me serait il possible de mettre un tableau dans un tableau?
de quel type doit etre le premier tableau (tableau contenant l autre)
merci pour vos conseils
cordialement
chrisnyc 25 Messages postés mardi 16 août 2005Date d'inscription 22 septembre 2005 Dernière intervention - 12 sept. 2005 à 21:35
0
Utile
Zlub
Merci pour votre aide
cordialement
chris

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.