Analiza Wrażliwości VBA

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 5

Sub AnalizeGrades()

Dim gradesToAnalize As Variant


gradesToAnalize = Array(0.2, 0.2, 0.5)

' tworzę object nowe_wagi z trzema wagami zamienionymi z gradesToAnalize


Dim nowe_wagi As Object
Set nowe_wagi = CreateObject("Scripting.Dictionary")

nowe_wagi("Cena") = gradesToAnalize(0)
nowe_wagi("Godziny otwarcia") = 0.05
nowe_wagi("Dostępność różnego rodzaju kwiatów") = gradesToAnalize(1)
nowe_wagi("Jakość kwiatów") = gradesToAnalize(2)
nowe_wagi("Zakres usług dodatkowych") = 0.1
nowe_wagi("Ubezpieczenie w zakresie towaru / Reklamacje / Zwrot") = 0.05
nowe_wagi("Obszar dostawy kwiatów") = 0.05
nowe_wagi("Obsługa klienta") = 0.05

' poszczególne oceny dla Silesia Flo


Dim silesia_flo As Object
Set silesia_flo = CreateObject("Scripting.Dictionary")

silesia_flo("Cena") = 0
silesia_flo("Godziny otwarcia") = 100
silesia_flo("Dostępność różnego rodzaju kwiatów") = 0
silesia_flo("Jakość kwiatów") = 0
silesia_flo("Zakres usług dodatkowych") = 0
silesia_flo("Ubezpieczenie w zakresie towaru / Reklamacje / Zwrot") = 0
silesia_flo("Obszar dostawy kwiatów") = 0
silesia_flo("Obsługa klienta") = 0

' poszczególne oceny dla Róża sp.Z.o.o


Dim roza_spZoo As Object
Set roza_spZoo = CreateObject("Scripting.Dictionary")

roza_spZoo("Cena") = 60
roza_spZoo("Godziny otwarcia") = 95
roza_spZoo("Dostępność różnego rodzaju kwiatów") = 80
roza_spZoo("Jakość kwiatów") = 90
roza_spZoo("Zakres usług dodatkowych") = 80
roza_spZoo("Ubezpieczenie w zakresie towaru / Reklamacje / Zwrot") = 50
roza_spZoo("Obszar dostawy kwiatów") = 0
roza_spZoo("Obsługa klienta") = 40

' poszczególne oceny dla Śląska Giełda Kwiatowa


Dim slaska_gielda_kwiatowa As Object
Set slaska_gielda_kwiatowa = CreateObject("Scripting.Dictionary")

slaska_gielda_kwiatowa("Cena") = 100
slaska_gielda_kwiatowa("Godziny otwarcia") = 0
slaska_gielda_kwiatowa("Dostępność różnego rodzaju kwiatów") = 100
slaska_gielda_kwiatowa("Jakość kwiatów") = 100
slaska_gielda_kwiatowa("Zakres usług dodatkowych") = 0
slaska_gielda_kwiatowa("Ubezpieczenie w zakresie towaru / Reklamacje / Zwrot")
= 50
slaska_gielda_kwiatowa("Obszar dostawy kwiatów") = 0
slaska_gielda_kwiatowa("Obsługa klienta") = 60

' poszczególne oceny dla JMP Flowers


Dim jmp_flowers As Object
Set jmp_flowers = CreateObject("Scripting.Dictionary")

jmp_flowers("Cena") = 80
jmp_flowers("Godziny otwarcia") = 5
jmp_flowers("Dostępność różnego rodzaju kwiatów") = 60
jmp_flowers("Jakość kwiatów") = 80
jmp_flowers("Zakres usług dodatkowych") = 100
jmp_flowers("Ubezpieczenie w zakresie towaru / Reklamacje / Zwrot") = 100
jmp_flowers("Obszar dostawy kwiatów") = 100
jmp_flowers("Obsługa klienta") = 100

' poszczególne oceny dla Śląskie Centrum Florytyczne Rekpol


Dim slaskie_centrum_florystyczne_rekpol As Object
Set slaskie_centrum_florystyczne_rekpol = CreateObject("Scripting.Dictionary")

slaskie_centrum_florystyczne_rekpol("Cena") = 40
slaskie_centrum_florystyczne_rekpol("Godziny otwarcia") = 97
slaskie_centrum_florystyczne_rekpol("Dostępność różnego rodzaju kwiatów") = 40
slaskie_centrum_florystyczne_rekpol("Jakość kwiatów") = 50
slaskie_centrum_florystyczne_rekpol("Zakres usług dodatkowych") = 90
slaskie_centrum_florystyczne_rekpol("Ubezpieczenie w zakresie towaru /
Reklamacje / Zwrot") = 0
slaskie_centrum_florystyczne_rekpol("Obszar dostawy kwiatów") = 100
slaskie_centrum_florystyczne_rekpol("Obsługa klienta") = 30

Dim i As Long
Dim numIterations As Long
numIterations = Range("N126").Value

' tablice dla wartości oceny


Dim silesia_flo_gradesList() As Double
ReDim silesia_flo_gradesList(1 To numIterations)

Dim roza_spZoo_gradesList() As Double


ReDim roza_spZoo_gradesList(1 To numIterations)

Dim slaska_gielda_kwiatowa_gradesList() As Double


ReDim slaska_gielda_kwiatowa_gradesList(1 To numIterations)

Dim jmp_flowers_gradesList() As Double


ReDim jmp_flowers_gradesList(1 To numIterations)

Dim slaskie_centrum_florystyczne_rekpol_gradesList() As Double


ReDim slaskie_centrum_florystyczne_rekpol_gradesList(1 To numIterations)

' pętla, w której najpierw jest ustawiana wartość początkowa dla tablicy z
wartościami wag do analizy po czym wywoływany jest funkcja ShuffleValues
' następnie nowe wartości wag są przypisane do objektu ze wszystkimi wagami
' przy każdej iteracji dla każdej giełdy jest dodawana wartość wygenerowanej
wagi
For i = 1 To numIterations
gradesToAnalize = Array(0.2, 0.2, 0.5)
ShuffleValues gradesToAnalize

nowe_wagi("Cena") = gradesToAnalize(0)
nowe_wagi("Dostępność różnego rodzaju kwiatów") = gradesToAnalize(1)
nowe_wagi("Jakość kwiatów") = gradesToAnalize(2)

silesia_flo_gradesList(i) = CalculateFinalGrade(silesia_flo, nowe_wagi)


roza_spZoo_gradesList(i) = CalculateFinalGrade(roza_spZoo, nowe_wagi)
slaska_gielda_kwiatowa_gradesList(i) =
CalculateFinalGrade(slaska_gielda_kwiatowa, nowe_wagi)
jmp_flowers_gradesList(i) = CalculateFinalGrade(jmp_flowers, nowe_wagi)
slaskie_centrum_florystyczne_rekpol_gradesList(i) =
CalculateFinalGrade(slaskie_centrum_florystyczne_rekpol, nowe_wagi)
Next i

' dla każdej giełdy jest brana suma wag podzielona przez ich ilość
' następnie ta średnia jest brana i ograniczana do dwóch miejsc po przecinku i
wyświetalana w tabeli wyników
Dim averageFor_silesia_flo As Double
averageFor_silesia_flo = 0
For i = 1 To numIterations
averageFor_silesia_flo = averageFor_silesia_flo +
(silesia_flo_gradesList(i) / numIterations)
Next i
averageFor_silesia_flo = Round(averageFor_silesia_flo, 2)
Range("AF133").Value = averageFor_silesia_flo

Dim averageFor_roza_spZoo As Double


averageFor_roza_spZoo = 0
For i = 1 To numIterations
averageFor_roza_spZoo = averageFor_roza_spZoo + (roza_spZoo_gradesList(i) /
numIterations)
Next i
averageFor_roza_spZoo = Round(averageFor_roza_spZoo, 2)
Range("AF135").Value = averageFor_roza_spZoo

Dim averageFor_slaska_gielda_kwiatowa As Double


averageFor_slaska_gielda_kwiatowa = 0
For i = 1 To numIterations
averageFor_slaska_gielda_kwiatowa = averageFor_slaska_gielda_kwiatowa +
(slaska_gielda_kwiatowa_gradesList(i) / numIterations)
Next i
averageFor_slaska_gielda_kwiatowa = Round(averageFor_slaska_gielda_kwiatowa, 2)
Range("AF137").Value = averageFor_slaska_gielda_kwiatowa

Dim averageFor_jmp_flowers As Double


averageFor_jmp_flowers = 0
For i = 1 To numIterations
averageFor_jmp_flowers = averageFor_jmp_flowers +
(jmp_flowers_gradesList(i) / numIterations)
Next i
averageFor_jmp_flowers = Round(averageFor_jmp_flowers, 2)
Range("AF139").Value = averageFor_jmp_flowers

Dim averageFor_slaskie_centrum_florystyczne_rekpol As Double


averageFor_slaskie_centrum_florystyczne_rekpol = 0
For i = 1 To numIterations
averageFor_slaskie_centrum_florystyczne_rekpol =
averageFor_slaskie_centrum_florystyczne_rekpol +
(slaskie_centrum_florystyczne_rekpol_gradesList(i) / numIterations)
Next i
averageFor_slaskie_centrum_florystyczne_rekpol =
Round(averageFor_slaskie_centrum_florystyczne_rekpol, 2)
Range("AF141").Value = averageFor_slaskie_centrum_florystyczne_rekpol
End Sub

Sub ShuffleValues(ByRef listToShuffle As Variant)


' tablica dla wartości przesunięć wag
Dim adjustments() As Double
Dim i As Long
' przypisanie jej rozmiaru listToShuffle
ReDim adjustments(LBound(listToShuffle) To UBound(listToShuffle))
' zapełniam tablicę wartościami od 0,05 do 0,15
For i = LBound(adjustments) To UBound(adjustments)
adjustments(i) = WorksheetFunction.RandBetween(5, 15) / 100
Next i

' tutaj dodaje lub odejmuje dzięki funckji GetRandomSign wartości z adjustments
Dim randomSign As Integer
randomSign = GetRandomSign()
For i = LBound(listToShuffle) To UBound(listToShuffle)
listToShuffle(i) = listToShuffle(i) - (adjustments(i) * randomSign)
Next i

' tworzę zmienną sumę i sumuje wartości w mojej tablicy


Dim sum As Double
sum = 0
For i = LBound(listToShuffle) To UBound(listToShuffle)
sum = sum + listToShuffle(i)
Next i
' upeniam się że suma wartości nie przekroczy 0.7 mnożąć wartość razy 0.7 i
dzieląc przez sumę
For i = LBound(listToShuffle) To UBound(listToShuffle)
listToShuffle(i) = listToShuffle(i) * 0.7 / sum
Next i

'For i = LBound(listToShuffle) To UBound(listToShuffle)


' listToShuffle(i) = Round(listToShuffle(i), 2)
'Next i
End Sub

Function GetRandomSign() As Integer


' Initialize the random number generator
Randomize

' Generate a random number between 0 and 1


Dim randomNumber As Double
randomNumber = Rnd()

' Adjust the random number to become either -1 or 1


If randomNumber < 0.5 Then
GetRandomSign = -1
Else
GetRandomSign = 1
End If
End Function

Function CalculateFinalGrade(dictToEvaluate As Object, gradeWeight As Variant) As


Double

Dim sum As Double


Dim key As Variant
sum = 0

' iteruj przez kolejne klucze i wartości w obu objektach i obliczam sumę
For Each key In dictToEvaluate.Keys
sum = sum + dictToEvaluate(key) * gradeWeight(key)
Next key

CalculateFinalGrade = sum
End Function

You might also like