L'indice n'appartient pas à la selection
Bonsoir tout le monde!
j'ai un grand besoin de vos compétences
je vous explique, je dois gérer un portfeuille c'est à l'utilisateur de choisir les actifs quil veut dans son portefeuille et le code ci dessous , je voudrais qu'il permette de rentre dans un tableau virtuel actifs_choisis les valeurs à chaque instant des actifs sélectionnés par l'utilisateur mais vb a ne a decidé autrement
Sub creationTbl()
Dim l, c As Long
Dim marqueur, l2 As Integer
Dim actifs_choisis() As String
Dim feuil1, feuil2, data As Worksheets
ReDim actifs_choisis(l, c) As String
l = Worksheets("data").Columns(1).Find("*", , , , xlColumns, xlPrevious).Row - 7
c = Worksheets("feuil1").Columns(3).Find("*", , , , xlColumns, xlPrevious).Row - 2
' l2 As Long, c2 As Long, i As Long
For i = 1 To c + 2
marqueur = Application.Match(Worksheets("feuil1").Cells(c, 2), Worksheets("data").Rows(2), 0)
For l2 = 8 To l + 7
If i = 1 Then
actifs_choisis(l2 - 7, 1) = Worksheets("data").Cells(l2, 1)
Else
actifs_choisis(l2 - 7, i - 1) = Worksheets("data").Cells(l2, marqueur)
Worksheets("feuil2").Cells(l2 - 7, i) = actifs_choisis(l2 - 7, i - 1)
End If
Next l2
i = i + 1
Next i
- Messages
- 1'119
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
Bonjour sabrina75005
dans le code suivant
Sub creationTbl()
Dim l, c As Long
Dim marqueur, l2 As Integer
Dim actifs_choisis() As String
Dim feuil1, feuil2, data As Worksheets
ReDim actifs_choisis(l, c) As String
l = Worksheets("data").Columns(1).Find("*", , , , xlColumns, xlPrevious).Row - 7
c = Worksheets("feuil1").Columns(3).Find("*", , , , xlColumns, xlPrevious).Row - 2tu déclares ton tableau actifs_choisis avec les variables l et c qui ne sont pas encore initialisées DONC cela revient à déclarer un tableau à 0
il faut donc que tu donnes une valeur à l et c avant d'initialiser ton tableau tel que
Sub creationTbl()
Dim l, c As Long
Dim marqueur, l2 As Integer
Dim actifs_choisis() As String
Dim feuil1, feuil2, data As Worksheets
l = Worksheets("data").Columns(1).Find("*", , , , xlColumns, xlPrevious).Row - 7
c = Worksheets("feuil1").Columns(3).Find("*", , , , xlColumns, xlPrevious).Row - 2
ReDim actifs_choisis(l, c) As Stringpar contre je n'ai pas regardé la suite du code, mais déjà tu devrais pouvoir avancer...
merci beaucoup Andrea73. ta proposition a permis à vba de ne pas rencontrer d'ereeur
- Messages
- 1'119
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
Je n'ai pas suivi ce projet...
et j'avoue que je ne comprends pas très bien la finalité de ton code...
pourrais-tu expliquer ce que tu veux faire (quel résultat obtenir) à partir de quelles données avec un petit exemple !
merci de nouveau pour ta réponse
Sub creationTbl()
Dim l, c As Long
Dim marqueur, l2 As Integer
Dim actifs_choisis() As String
Dim feuil1, feuil2, data As Worksheets
l = Worksheets("data").Columns(1).Find("*", , , , xlColumns, xlPrevious).Row - 7
c = Worksheets("feuil1").Columns(3).Find("*", , , , xlColumns, xlPrevious).Row - 2
ReDim actifs_choisis(l, c + 1) As String
' l2 As Long, c2 As Long, i As Long
'l = Worksheets("data").Range("A8").End(xlDown).Row
'c = Worksheets("feuil1").Range("B3").End(xlDown).Row
For i = 2 To c
marqueur = Application.Match(Worksheets("feuil1").Cells(c + 1, 2), Worksheets("data").Rows(2), 0)
For l2 = 8 To l + 6
If i = 2 Then
actifs_choisis(l2 - 7, 1) = Worksheets("data").Cells(l2, 1)
actifs_choisis(l2 - 7, 2) = Worksheets("data").Cells(l2, marqueur)
Else
actifs_choisis(l2 - 7, i + 1) = Worksheets("data").Cells(l2, marqueur)
End If
Next l2
Next i
For j = 1 To c
For i = 1 To l
Worksheets("feuil2").Cells(i, j) = actifs_choisis(i, j)
Next i
Next j
End Sub
- Messages
- 1'119
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
ok
je viens de tester ton code... et moi j'ai quelque chose du genre :
07/01/2005 100 100 100
07/08/2005 98.99840826 98.99840826 98.99840826
15/07/2005 102.1571626 102.1571626 102.1571626
22/07/2005 105.0846366 105.0846366 105.0846366
29/07/2005 105.6238753 105.6238753 105.6238753
08/05/2005 101.7719031 101.7719031 101.7719031
08/12/2005 101.6948096 101.6948096 101.6948096
19/08/2005 101.2326644 101.2326644 101.2326644
26/08/2005 99.61474044 99.61474044 99.61474044
09/02/2005 100.9244983 100.9244983 100.9244983
09/09/2005 103.8519722 103.8519722 103.8519722
16/09/2005 105.8551557 105.8551557 105.8551557
23/09/2005 103.389827 103.389827 103.389827
30/09/2005 105.7009688 105.7009688 105.7009688
10/07/2005 102.3111418 102.3111418 102.3111418
14/10/2005 105.3157092 105.3157092 105.3157092
21/10/2005 101.9258822 101.9258822 101.9258822
28/10/2005 101.1555709 101.1555709 101.1555709
11/04/2005 103.0045674 103.0045674 103.0045674
11/11/2005 107.3959862 107.3959862 107.3959862mais ce j'aimerais savoir c'est "que faut-il mettre" dans le userform, où et comment chercher les données et comment les présenter ?
ah ba c'est un peu mieux.. comment se fait-il que je n'ai pas la meme chose? mais on retrouve l'ensemble des valeurs d'un seul actif du portefeuille alors qu'il y en a plusieurs (tu peux les retrouver dans mon tableau sur la "feuil1" jai re trafiqué mon code et maintenant jai ça..... concernant le userform tu peux cliquer sur le dossier que j'ai joint tu va y trouver le userform les données on les récupère sur la feuille "data" mais on récupere les noms des actifs sur la feuil "feuil1". comment faire en sorte quil prenne bien les vleurs des différents actifs?
merci encore
Sub creationTbl()
Dim l, c As Long
Dim marqueur, l2 As Integer
Dim actifs_choisis() As String
Dim feuil1, feuil2, data As Worksheets
l = Worksheets("data").Columns(1).Find("*", , , , xlColumns, xlPrevious).Row - 7
c = Worksheets("feuil1").Columns(3).Find("*", , , , xlColumns, xlPrevious).Row - 2
ReDim actifs_choisis(l, c + 1) As String
' l2 As Long, c2 As Long, i As Long
'l = Worksheets("data").Range("A8").End(xlDown).Row
'c = Worksheets("feuil1").Range("B3").End(xlDown).Row
For i = 2 To c + 1
marqueur = Application.Match(Worksheets("feuil1").Cells(c + 1, 2), Worksheets("data").Rows(2), 0)
For l2 = 8 To l + 7
If i = 2 Then
actifs_choisis(l2 - 7, 1) = CDate(Worksheets("data").Cells(l2, 1))
actifs_choisis(l2 - 7, 2) = Val(Worksheets("data").Cells(l2, marqueur))
End If
actifs_choisis(l2 - 7, i) = Val(Worksheets("data").Cells(l2, marqueur))
Next l2
Next i
For j = 1 To c + 1
For i = 1 To l
Worksheets("feuil2").Cells(i, j) = actifs_choisis(i, j)
Next i
Next j
End Sub
je sais pas si c'est tres clair pour toi donc je prefere completer ma reponse ci dessus
en fait sur ma feuil1 dnas mon taleau en dessous de actifs il y a le nom des actifs choisis par l'utilisateur, donc l'optique est de la gestion de portefeuille donc je vais etre amené à faire des calculs avec les données qui commence à la ligne 8 jusquà la fin de la colonne de ma feuil "data" donc ne fait je veux rentrer dans un tableau virtuel la base de données dont jai besoin pour mes calculs futurs i-e les valeurs des actifs choisis par l'utilisateur .....je laffiche ici pour justement voir si mes valeurs sont bien rentrées dans le tableau ( ce que jai bien fait de faire puisque apparemment les valeurs sont mal rentrées
Bonjour tout le monde,
j'ai avancé dans mon code donc j'arrive à afficher les dates et les valeurs de mes actifs dans la feuil2 mais le soucis c que les dates ne s'affichent pas correctement sur excel et mes valeurs affichées ne prennent paq la partie décimales. comment faire svp? une fois c pb résolu,je pourrais avancer.
merci encore et encore
Sab
mon code:
Sub creationTbl()
Dim l, c As Long
Dim marqueur, l2 As Integer
Dim actifs_choisis() As String
Dim feuil1, feuil2, data As Worksheets
l = Worksheets("data").Columns(1).Find("*", , , , xlColumns, xlPrevious).Row - 7
c = Worksheets("feuil1").Columns(3).Find("*", , , , xlColumns, xlPrevious).Row - 2
ReDim actifs_choisis(l, c + 1) As String
For i = 2 To c + 1
marqueur = Application.Match(Worksheets("feuil1").Cells(i + 1, 2), Worksheets("data").Rows(2), 0)
For l2 = 8 To l + 7
If i = 2 Then
actifs_choisis(l2 - 7, 1) = CDate(Worksheets("data").Cells(l2, 1))
actifs_choisis(l2 - 7, 2) = Val(Worksheets("data").Cells(l2, marqueur))
End If
actifs_choisis(l2 - 7, i) = Val(Worksheets("data").Cells(l2, marqueur))
Next l2
Next i
'partie à effacer une fois quon a vu que ca marché bien !
For j = 1 To c + 1
For i = 1 To l
Worksheets("feuil2").Cells(i, j) = actifs_choisis(i, j)
Next i
Next j
End Sub
Bonjour,
Sans entrer dans le vif du sujet (je n'ai pas lu), tu déclares tes variables en pensant sans doute que le type que tu indiques vaut pour celles énumérées dans la ligne, c'est FAUX !
Toute variable dont le nom n'est pas suivi de As type n'a pas de type déclaré (et donc est déclaré comme Variant).
Exemple:
Dim l, c As Longc sera de type Long, l sera de type Variant.
D'autre part rien ne t'empêche de déclarer sur la même ligne des variables de types différents (vu ton code, tu sembles penser que ce n'est pas faisable).
Autre chose:
Dim feuil1, feuil2, data As WorksheetsSi feuil1 et feuil2 sont de type Variant, data n'est pas de type objet feuille de calcul, tu ne l'as pas déclaré: As Worksheet, mais As Worksheets, soit comme objet Collection de feuilles de calcul. Je ne pense pas que c'est ce qui était souhaité.
Enfin (tant que j'y suis), pour raccourcir la longueur de tes lignes de déclarations, tu peux utiliser pour certaines variables (String, Integer, Long, Single et Double), leur caractère de déclaration de type (respectivement: $, %, &, !, #)
Dim l&, c&, marqueur%, l2%, actifs_choisis() As String
Dim feuil1 As Worksheet, feuil2 As Worksheet, data As WorksheetCordialement.
Merci Mferrand pour tes conseils et tes remarques car je ne savais pas tout ça
peux tu juste m'éclairer de nouveau sur le fait que mes dates s'affichent (image cap) ainsi alors que je fais un copier de date à partir d'une feuille où elles s'affichent correctement (image cap1)? peux tu me dire comment obtenir la meme forme?!
je te remercie
Sab
Tu as visiblement un mélange de dates en format (numérique) date [cadrées à droite] et de dates en format texte.
Il faudrait donc convertir en format numérique : on le fait en général en multipliant par 1. Dans les cas standard ça marche, sinon faut chercher pourquoi.
merci Mferrand pour tes remarques pertinentes
actifs_choisis(l2 - 7, 1) = Format(Worksheets("data").Cells(l2, 1), "mm/dd/yyyy")
Merci a vous tous et très bonne journée