Créer des variables dans une Macro
Bonjour à tous et à toutes,
Je suis un grand novice en VBA j'aimerai savoir comment faire pour mettre des variables dans une macro.
Je joins le fichier car je ne suis pas sur d'être très clair dans mes explications.
J'ai créé une petite macro me permettant de lancer plusieurs simulations de portefeuille dans mon fichier Excel. Pour chaque simulation des statistiques sont copiées/collées (valeurs) dans une autre feuilles.
Il s'agit des statistiques du tableaux 'Simulations!N5:N8'.
Cette macro fonctionne correctement.
J'aimerai cependant ajouter un système me permettant de faire varier le poids de mes actifs dans le portefeuille.
Je m'explique : je souhaite simuler différente trajectoire pour un portefeuille avec différentes compositions.
J'aimerai augmenter la part d'actifs monétaires de 10% en 10% et alouer le restant avec des obligations et des actions.
Par exemple :
1er portefeuille : 0% d'actifs monétaires, 50% actions, 50% obligations
2ème portefeuille : 10% actifs monétaires, 90% (du restant à alouer) actions, 10% (du restant à alouer) obligations.
Le pas d'augmentation des actifs monétaires serait de 10% à chaque fois et l'allocation des actions diminuerai de 5% à chaque fois (donc les obligations augmenterais de 5%)
Il y aurai donc 400 portefeuilles d'allocations différentes.
10 portefeuilles d'allocations d'actifs monétaires différentes et dans chacun, 20 allocations Actions/obligations différentes.
Je peux le faire en manuel mais une macro me simplifierai grandement la chose... mais je ne sais pas si cela est possible.
Merci d'avance pour votre aide
Salut et bienvenue sur le Forum,
Je ne comprends pas bien ton soucis. Tout d'abord tu as une erreur dans la cellule O14 de la feuille Simulation qui empêche de lancer ta macro correctement.
Ensuite j'ai compris que lorsque tu lances cette macro, ton tableau de la feuille Résultat est remplacé.
Mais comme en plus tu as une (ou des) formule aléatoire quelque part, à chaque recalcule, toute ta feuille est différente.
Maintenant, est-ce que tu voudrais que ta macro soit lancée 400 fois ???
Si oui, peux-tu nous fournir les 5 chiffres exacts des 5 premières combinaisons ? D'après ce j'ai compris ça serait :
0 % - 50 % - 50 %
10 % - 81 % (90% de 90%) - 9 % (le solde)
10% - 76.5 % (85 % de 90%) - 13.5 % (le solde)
20 % - 72 % (90 % de 80 %) - 8 % (le solde)
etc. ??????
Et toujours si ta macro doit être lancée 400 fois, veux-tu les résultats à la suite sur la feuille Résultat (c'est à dire 4000 lignes) ?
A te relire.
Oui c'est exactement ça.
Je crois que j'ai trouvé la solution.
J'ai créé un tableau dans l'onglet "donnée" recensant toutes les possibilités d'allocations que je souhaite obtenir.
A partir de là j'ai fait 1 simulation que j'ai C/C et j'ai exécuter la macro qui est la suivante :
Sub lancesimulation2()
Dim Nsimul As Integer, i As Integer
Dim TabResult() As Double
Dim colParametres As Integer, colResultat As Integer
Dim L As String, M As String
Application.ScreenUpdating = False
Application.EnableEvents = False
colParametres = 9
For j = 1 To 110
L = convertirLettre(colParametres)
Sheets("Données").Select
Range(L & "9:" & L & "12").Select
Selection.Copy
Sheets("Simulations").Select
Range("C5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Nsimul = 1
ReDim TabResult(1 To 4, 1 To 1)
For i = 1 To Nsimul
Calculate
TabResult(1, i) = Range("N5")
TabResult(2, i) = Range("N6")
TabResult(3, i) = Range("N7")
TabResult(4, i) = Range("N8")
Next i
colResultat = (j - 1) + 1
M = convertirLettre(colResultat)
Sheets("Resultats").Select
Sheets("Resultats").Range(M & "2").Resize(4, 1) = TabResult
colParametres = colParametres + 1
Next j
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Function convertirLettre(L As Integer) As String
Dim i As Integer, j As Integer
If L > 26 Then
i = Int(L / 26)
j = (L Mod 26)
If j = 0 Then
i = i - 1
j = 26
End If
convertirLettre = Chr(64 + i) & Chr(64 + j)
Else
convertirLettre = Chr(64 + L)
End If
End Function
Function colonne(col As Integer) As String
If col > 26 Then colonne = Chr(64 + Int(col / 26)) Else colonne = ""
colonne = colonne & Chr(64 + (colonne Mod 26))
End Function
Ca m'a pris pas mal de temps mais ça marche à peu près comme je le veux.
Merci d'avoir répondu