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é ...
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
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
@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
@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