2016-01-03 1 views
0

Je souhaite écrire un code dans un fichier VBA Excel. J'ai préparé l'algorithme qui est montré ci-dessous, mais je ne sais pas exactement comment je vais l'écrire dans VBA:/ Quelqu'un peut-il m'aider avec cela?Codage VBA - Génération de variable aléatoire

1) Attribuer des valeurs initiales: le courant est 1, l'année est 0, le résultat est une chaîne vide.

2) Générer une variable aléatoire u à partir de U (0,1);

3) Si Current est 1 et u ≤ 0,23, attribuez 0 à Current. Si Current est 0 et u> 0,86, attribuez 1 à Current. Sinon, ne faites rien.

4) Augmenter l'année de 1. Ecrire le courant à la fin de la chaîne de résultat.

5) Si la valeur Année est inférieure à la cellule ("A2"), passez à l'étape (2). Sinon retour Résultat

Répondre

2

Voici une UDF (fonction définie par l'utilisateur) qui peut être utilisé directement sur la feuille de calcul:

Function Chain(years As Long) As String 
    Dim i As Long, result As String 
    Dim u As Single 
    Dim current As Long 

    Randomize 
    Application.Volatile 

    current = 1 
    For i = 1 To years 
     u = Rnd() 
     If (current = 1 And u <= 0.23) Or (current = 0 And u > 0.86) Then 
      current = 1 - current 
     End If 
     result = result & current 
    Next i 
    Chain = result 
End Function 

year est juste un compteur et votre algorithme décrit en effet une simple boucle for. En VBA, il est plus idiomatique de faire une boucle de 1 à n que de 0 à n-1 pour un simple compteur - bien que ce soit principalement une question de goût. En outre - j'ai changé year à i pour empêcher l'observation accidentelle de la fonction intégrée year()

VBA a des valeurs par défaut pour les variables naturelles, donc je ne l'ai pas besoin d'initialiser explicitement result.

J'ai fait la fonction volatile - donc il recalcule à chaque fois que la feuille de calcul. Cela correspond à RAND() fonctionne dans Excel. Si vous ne le souhaitez pas, supprimez la ligne Application.Volatile.

Une capture d'écran:

enter image description here

+0

Si je veux que le résultat soit dans des cellules séparées? Est-ce que chaque numéro est dans une cellule différente, dans la colonne B comme votre capture d'écran? – Jonathan

+0

Possibilités: 1) il est possible que la fonction renvoie un tableau et l'utilise comme une formule matricielle. 2) il est possible d'utiliser un sub plutôt qu'une fonction si vous passez le sous-plan où la sortie doit être. 3) Il est possible de le laisser tel quel et d'utiliser des fonctions de tableur pour extraire les chiffres successifs. 4) Il est possible de contourner entièrement VBA. Dans B2, entrez 1, puis C2 entrez la formule '= IF (B2 = 1, IF (RAND() <= 0,23,0,1), IF (RAND()> 0,86,1,0))' et copiez-la pour le nombre de colonnes souhaité, mais sans modification, cela ne serait pas mis à jour avec A2. –

2

Cela se traduit par votre anglais VBA

Sub Jona() 
    Dim Current As Long, Yearr As Long 
    Dim u As Double, Result As String 

    Current = 1 
    Yearr = 0 

    While Yearr < Range("A2").Value 
     u = Rnd() 
     If Current = 1 And u <= 0.23 Then 
     Current = 0 
     ElseIf Current = 0 And u > 0.86 Then 
     Current = 1 
     End If 
     Yearr = Yearr + 1 
     Result = Result & Current 
    Wend 

    MsgBox Result 
End Sub 
+0

Merci beaucoup :) Il fonctionne! – Jonathan

+1

Nice - quand j'ai vu votre code, j'ai réalisé que j'avais occulté accidentellement 'Année()' d'une manière essentiellement inoffensive mais néanmoins mal avisée. –

+0

Aussi si je veux que le résultat apparaisse dans une plage dans Excel (par exemple dans la colonne C) ce que je dois écrire dans la dernière phrase? – Jonathan