XL 2016 Selection colonne tableau vba

Jass932

XLDnaute Nouveau
Bonjour,

Je rencontre un problème sur l"un de mes codes.
J'ai sur une page excel les prix de cloture de plusieurs actions. Mon but est de calculer la correlations des rendements de ces actions. J'ai pour cela stocker les rendements de ces dernieres dans un tableau vba nomme tabrend(). Mon souci se trouve au niveau de la selection de la colonne de ce tableau lors de l 'appel de la fonction correl. Quelle syntaxe dois-je utiliser?
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Jass,
Comme ça, difficile de répondre.
Pouvez vous donner un morceau de code, ce sera plus simple.
Sinon l'accès à un tableau en VBA est du type Valeur=tabrend(x,y) avec x N° de ligne et y N° de colonne, comme par exemple avec l'image ci dessous Tabrend(3,5)="E3"
1650404015155.png
 

Jass932

XLDnaute Nouveau
Bonsoir,
Merci de votre aide. Pour mon code, j'essaie de faire une boucle comme ceci :

Nombreserie étant la variable contenant le nombre d'actions.

For j = 1 to nombreserie

For i = to nombreserie

Sheets("resultat").Cells(1+i,1+j) = worsheet.function.correl(tabrend(,j),tabrend(,i))

Next

Next

Le but est d'obtenir les correlations entre chaque actions sous la forme d'une matrice.
J'essaie de faire en sorte que toute la colonne du tableau tabrend() soit prise en compte par la fonction. Je n'ai visiblement pas la bonne syntaxe lol.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Jass,
Hors contexte, difficile de cerner le problème, mais :
- For i = to nombreserie, il manque la borne de départ comme : For i = 1 to nombreserie
- Je ne suis pas sur de votre syntaxe tabrend(,j), il manque l'indice ligne comme par ex tabrend(i,j)
- Nombreserie est il obtenu avec ubound(tabrend) ou ubound(tabrend,2) car comme utilisé votre tableau fait une ligne de "Nombreserie" colonnes.
- Si vous parlez de la colonne Tabrend, alors votre syntaxe est fausse puisque c'est le premier indice qui donne la ligne.
faire en sorte que toute la colonne du tableau tabrend
La syntaxe devrait être soit tabrend(i), si tabrend n'a qu'une colonne ou tabrend(i,1) si tabrend a plusieurs colonnes.
- Votre code génère t il une erreur, et si oui sur quelle ligne ?

Pouvez vous donnez un petit fichier test, ou à défaut tout le code pour voir comment est alimenté le tableau tabrend, comment sont consommé les variables par correl ?
( pour le code utilisez la balise </> ( à droite de l'icone GIF ) c'est plus lisible, comme cid dessous )
VB:
Sub essai()
    tabrend = Sheets("feuil1").Range("A1:C16")
    nombreserie = UBound(tabrend)
    For j = 1 To nombreserie
        For i = 1 To nombreserie
            Sheets("resultat").Cells(1 + j) = worsheet.Function.Correl(tabrend(1, j), tabrend(1, i))
        Next i
    Next j
End Sub
 

Jass932

XLDnaute Nouveau
Bonjour,

l'erreur se trouve au niveau de la boucle des worksheet.function car je n'arrive pas à trouver la bonne syntaxe pour que la fonction s'exécute sur l'ensemble des valeurs de chaque colonne.

VB:
Option Base 1

Sub Main()
Dim tabrend() As Double
Sheets("resultat").Range("C:Z") = ""

'déterminer le nombre d'action et le nombre de période

Taille = Sheets("data").Cells(1, 2).End(xlDown).Row - 1
nombreserie = Sheets("data").Cells(1, 2).End(xlToRight).Column - 1


'création des entetes des tab réponses

For i = 1 To nombreserie
Sheets("resultat").Cells(2, i + 4) = Sheets("DATA").Cells(1, 1 + i)
Sheets("resultat").Cells(i + 2, 4) = Sheets("DATA").Cells(1, 1 + i)
Sheets("resultat").Cells(6 + nombreserie, 4 + i) = Sheets("DATA").Cells(1, 1 + i)
Sheets("resultat").Cells(i + 6 + nombreserie, 4) = Sheets("DATA").Cells(1, 1 + i)
Next

' création et affectation des valeurs des rendements dans tabrend()

ReDim tabrend(Taille - 1, nombreserie)

For j = 1 To nombreserie+1
    For i = 1 To Taille - 1
        tabrend(i, j) = (Sheets("DATA").Cells(i + 2, j + 1) - Sheets("DATA").Cells(1 + i, j + 1)) / Sheets("DATA").Cells(1 + i, j + 1)
    Next
Next

'création des tab covar et corel réponses

For j = 1 To nombreserie
   For i = 1 To nombreserie
        Sheets("resultat").Cells(2 + j, i + 4) = WorksheetFunction.Covar(tabrend(j), tabrend(i))
        Sheets("resultat").Cells(6 + j + nombreserie, i + 4) = WorksheetFunction.Correl(tabrend(j), tabrend(i))
   Next
Next


End Sub
 

Pièces jointes

  • Calcul covar corel.xlsm
    24.5 KB · Affichages: 1

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Jass,
1- Moi je trouve une erreur avant, sur la ligne
VB:
tabrend(i, j) = (Sheets("DATA").Cells(i + 2, j + 1) .....
En fait votre tableau Tabrend est à 2 dimension. Or nombreserie=2, normal, mais pour j vous allez jusqu'à nombreserie+1, donc à j=3 il génère une erreur.
Si vous mettez nombreserie au lieu de nombreserie+1 ça marche.
2- Vous appelez la fonction Covar avec :
Code:
WorksheetFunction.Covar(tabrend(j), tabrend(i))
Ca ne peut pas marcher car le tableau est à 2 dimensions. Donc syntaxe de type tabrend(x,y).
Mais je ne sais pas quelles sont les valeurs à utiliser donc vous pouvez tenter :
Code:
 WorksheetFunction.Covar(tabrend(j, 1), tabrend(i, 1))
 ou
  WorksheetFunction.Covar(tabrend(j, 2), tabrend(i, 2))
 

Jass932

XLDnaute Nouveau
merci pour votre aide mais au vu de la syntaxe, le code semble prendre que une la 1ere valeur du tabrend mais je voudrais que les 40 valeurs soient prise en compte. il me faudrait un code me permettant de faire :


VB:
 WorksheetFunction.Covar(tabrend(all, j), tabrend(all, i))

le all bien sur n'est pas possible mais c'est pur que vous puissiez comprendre ce que je souhaite faire.
 

Discussions similaires