2017-07-28 3 views
-2

J'essaie de modéliser un taux de natalité dans une ville où, après chaque année, T + 0 à T + n, où n est le nombre de nœuds. Ainsi, tous les +1 ans, il peut y avoir 101% de la population, 100% ou 99% de la population restant dans la ville. Pour ajouter à la complexité, le nombre de personnes dans la ville doit être dynamique à tout moment. Ainsi, par exemple, nous connaissons le chemin de la 5ème année où nous obtenons + 1% de la population chaque année. donc à la 5ème année nous devrions avoir (1.01)^5 personnes. Toutefois, étant donné que cette ville est dynamique, il peut y avoir des gens qui quittent la ville ou y pénètrent, de sorte que les ajustements manuels à la population de la ville doivent être pris en compte.Excel-VBA, Simulation d'arbres avec 2 variables

E.G. À la 5ème année, 5000 ont quitté la ville à un autre endroit. La feuille de calcul doit donc être assez dynamique pour ajuster le nœud du 5ème niveau de (1.01)^5 à (1.01)^5 - 5000. Et le 6ème nœud continue à partir de là .... en ramifiant à nouveau.

Je ne sais pas si j'ai expliqué cela assez clairement. Mais cela semble vraiment difficile à coder avec mes compétences de vba amateur. Est-ce possible?

je pensais à ce sujet et ont fait face aux problèmes suivants, je me demandais si cela a un sens ou si son même faisable:

1) L'insertion de la ligne pour construire un « arbre » est informatiquement cher, rien autour de lui. Bien que ce soit bien pour un petit nombre de nœuds, un arbre plus grand prendrait juste des heures pour un clic de la macro! (J'ai l'intention de l'utiliser jusqu'à 11/12 nœuds, ce qui prend beaucoup trop de temps!) - Est-il possible de construire une solution où les calculs macro utilisent le même "arbre" une fois qu'il a été généré une fois, plutôt que de régénérer le arbre chaque clic. c'est-à-dire que pour lancer les processus, je courrais un arbre avec 12 nœuds au début. Et après quoi l'ajustement des valeurs d'entrée génère simplement des valeurs qui s'affichent dans l'arbre, plutôt que de nettoyer les feuilles et d'insérer de nouvelles lignes à nouveau.

2) Laissez-moi illustrer ce qui se passe ici de la meilleure façon possible. La valeur initiale de 100, qui a été utilisée pour ce test, sera remplacée par une formule. Appelons cette formule, (A B Sqrt (C) + 6/X), où A, B, sont des constantes et X est l'entrée initiale de% déplacement dans la feuille sur laquelle les branches de l'arbre sont basées. C est le bit délicat - ceci est supposé être constant jusqu'à ce qu'une intervention manuelle entre en jeu.

Supposons un instant un modèle d'arbre simple, avec 5 nœuds - donnant la structure suivante. 1, 3, 9, 27, 81, 243 ... 3^n, où n est le nombre de nœuds. Exécution de cette formule avec une entrée initiale de 2%, X = 2%. Nous obtenons un joli petit arbre avec des valeurs à ce moment-là. J'essaie de construire un arbre plus dynamique ici, où je peux intervenir par ex. sur la deuxième valeur du nœud 3, ajustez l'entrée pour C et voyez comment les nœuds dépendants changent. Tout cela sans affecter la valeur C précédemment supposée sur les nœuds 1 & 2, et les nœuds qui ne sont pas directement affectés par le chemin aller de cette valeur particulière.

Donc, dans cette image ci-dessous, seuls les chemins bleus doivent être affectés par la nouvelle entrée de valeur C. Est-ce que c'est quelque chose possible? Je suis coincé ...

enter image description here

Option Explicit 

Public Sub test() 
Dim startvalue As Double, levels As Integer, levelchange As Double 
Dim counterforlevel As Double, j As Long, i As Long, k As Long 
Application.ScreenUpdating = False 
startvalue = Sheets("Sheet1").Range("A2") 
levels = Sheets("Sheet1").Range("B2") 
levelchange = Sheets("Sheet1").Range("c2") 
Sheets("Sheet2").Activate 
Cells.ClearContents 
Range("A1") = startvalue 
For j = 2 To levels 
    counterforlevel = 3^(j - 2) 
    For k = Cells(Rows.Count, j - 1).End(xlUp).Row To 1 Step -1 
     If k Mod 10 = 0 Then Application.StatusBar = "Level: " & j & Space(5) & "Processing " & Format(1 - k/counterforlevel, "#0.0%") 
     If Cells(k, j - 1) <> "" Then 
      Rows(k + 1).Insert shift:=xlDown 
      Cells(k + 1, j).Formula = "=" & Cells(k, j - 1).Address(False, False) & "*" & Format(1 - levelchange, "0%") 
      Cells(k, j).Formula = "=" & Cells(k, j - 1).Address(False, False) 
      Rows(k).Insert shift:=xlDown 
      Cells(k, j).Formula = "=" & Cells(k + 1, j - 1).Address(False, False) & "*" & Format(1 + levelchange, "0%") 
     End If 
     DoEvents 
    Next k 
Next j 
Application.StatusBar = False 
End Sub 
+0

je suis en train de comprendre ce que vous essayons de faire. Y a-t-il une valeur de solution finale? Est-ce un exercice de construction d'arbres? ... vous pouvez simplement utiliser des formules cellulaires pour l'ensemble. Chacune des cellules remplies dans votre exemple aurait une formule. les ajustements manuels pourraient être entrés dans des cellules comme C14 pour le 3ème nœud ou C12 pour le 4ème nœud, ou des ajustements manuels pourraient être entrés dans la rangée supérieure (déplacer tout vers le bas) – jsotola

+0

@jsotola Merci pour vos commentaires. J'essaie d'exécuter une simulation ici, donc le besoin d'être dynamique. C'est à dire. Quels sont les résultats possibles si la 2ème valeur au 5ème nœud subit soudainement un afflux de 5000 personnes, ou si le facteur de maladie, C change de 20%. etc. Être capable de voir ce qui arrive au «côté droit» de l'arbre et d'ajuster dynamiquement toutes les autres entrées (peut-être réduire le facteur de maladie après sa guérison etc.), pour voir à quoi ressemblerait le changement de pop après le nième nœud. En bref, je veux des valeurs. Mais aussi le chemin et les scénarios qui devraient être réglables manuellement en cognant la formule. – james

+0

@jsotola Le fait d'utiliser des ajustements manuels dans ce sens n'affecterait-il pas les résultats de l'arbre? c'est-à-dire si j'ajuste la 2ème valeur du 3ème nœud, le reste de l'arbre ne devrait pas changer, seulement les dépendants du côté droit de celui-ci. – james

Répondre

0

Je comprends un peu ce que vous essayez de faire.il ne sait pas encore comment vous avez l'intention d'utiliser les données du dernier nœud (comment allez-vous pour visualiser les résultats)

vous avez besoin peut-être d'utiliser quelque chose comme ça

   110 121 132 143 154  10% increase per year 
      100 100 100 100 100 100  these 3 rows are a reference dataset 
       90 81 73 66 59  10% decline per year  



       +10% +10% +10% +10% +10%  this can be manually adjusted 
upper bound  110 125 136 147 158 
      100 100 105 105 105 105  scenario 
lower bound  90 86 76 69 62 
       -10% -10% -10% -10% -10% 
manual adjust +5     


have multiple scenarios on worksheet 

could use VBA to fill in the percentage values and transfer the result into another worksheet