""# "" # $ % $ & " &'" & " "()" *+ " " $ $ *+" $ %"&'" "( "",- $. + /"&'"-0 $ " # 1 &' " +"%
$ %'('" 2 ' ) )030 )030) * )033 " )033 // " " 1 1 41 ")035)036 5- " " " *+773,8 *+ % " "
)035& " )036& " 1 %" "/
)03,/ $ &) '*+"#"" 2 '())0301 )035)036/)03,/1 " $6$7)03, )039/ )039/ 1 )03:. ;0, (<4*+ =4*+#
>-?*+@- " )03:1 % $, -" % +) &' "* +&' )037 )037+&'
$,$. #/" " ) ) " 4A 2)&" ) Private Sub Workbook_Open() Dim sht As Worksheet Worksheets("Forklaring").Activate Range("F4").Select For Each sht In ActiveWorkbook.Worksheets If sht.name <> "Forklaring" Then sht.visible = False Next SolverForm.Show. ) $0 "&'#"#-". ' +) " / #2;.&@" ) %B;B " )% " ""#2 ; * * #2 #2 ; ;.; #2;$C % >? " 44'' D*+'>*? 4'
)03E+) $0$ (" "'#1#2"+&3#-" #2 &@) #2F;>? #2 G% #2 C ; 2 Private Sub OKButton_Click() ' Vær sikker på at boksen ikke er tom, og at den indeholder et tal. If NProjBox = "" Or Not IsNumeric(NProjBox) Then MsgBox "Indtast et positivt antal projekter.", _ vbinformation, " Fejl i indtastningen" NProjBox.SetFocus Exit Sub NProjects = NProjBox ' Tjek at antallet af projekter er imellem 1 og 50. If NProjects < 1 Or NProjects > 50 Then MsgBox "Indtast et tal imellem 1 og 50.", _ vbinformation, "Fejl i indtastningen" NProjBox.SetFocus Exit Sub Unload Me Private Sub CancelButton_Click() Unload Me End & 2 ( Private Sub UserForm_Initialize() NProjBox = "".% (
Occurs after an object is loaded, but before it's shown. Syntax Private Sub object_initialize() The object placeholder represents an object expression that evaluates to an object in the Applies To list. Remarks The Initialize event is typically used to prepare an application or UserForm for use. Variables are assigned initial values, and controls may be moved or resized to accommodate initialization data. $4 %5 "- " "* ) > 1? />?./>?"+) " $4$ 6 ("(#" Option Explicit Option Base 1 ' Definitioner af modulniveau variable ~ globale variable: ' NProjects - antallet af potentielle projekter (<=50) ' ZeroOne - binært array, indikerer hvilket projekt som vælges af heuristikken ' LeftoverHeur - budgetoverskud som heuristik ikke udnytter ' TotNPVHeur - total NPV fundet af heuristik ' LeftoverOpt - budgetoverskud som optimal løsning ikke udnytter ' TotNPVOpt - total NPV fundet ved den optimale metode Public NProjects As Integer, ZeroOne(50) As Integer, LeftoverHeur As Single, _ TotNPVHeur As Single, LeftoverOpt As Single, TotNPVOpt As Single $4$ 6 " Sub Main() Application.ScreenUpdating = False ' Få antallet af projekter. ProjectsForm.Show ' Udregn tilfældig inputs, som skal indgå i modellen _ ' (NPV værdier, omkostninger og budgettal). Call GetInputs ' Sorter projekter. Call SortProjects ' Udregn den optimale investeringsstrategi. Call RunSolver ' Udregn investeringsstrategi med heuristisk metode. Call Heuristic
' Reporter resultater. Call CreateReport $4$ "& " D. &'%1*. *+ 4 " B%B 2. = & " $.C0 Sub GetInputs() Dim i As Integer ' Vis og aktiver Model arket. With Worksheets("Model").Visible = True.Activate End With With Range("A4") ' Fjern gammel data og range navne. Range(.Offset(0, 1),.Offset(4, 1).End(xlToRight)).ClearContents For i = 1 To NProjects.Offset(0, i) = i Next Range(.Offset(1, 1),.Offset(1, NProjects)).Name = "InvLevel" Range(.Offset(2, 1),.Offset(2, NProjects)).Name = "NPV" Range(.Offset(3, 1),.Offset(3, NProjects)).Name = "InvCost" ' Udregn ratiet NPV / investeringsomkostninger. Range(.Offset(4, 1),.Offset(4, NProjects)).FormulaR1C1 = "=R[-2]C/R[-1]C" End With ' Generer tilfældigt NPV-værdier, omkostninger og budgetter. Anvend Round ' funktionen med andet argument -2, så tallene afrundes ' til nærmeste 100. Hver NPV er normalfordelt med middelværdi på 25000 og ' standardafvigelse på 6000. Range("NPV").Formula = "=Round(NORMINV(RAND(),25000,6000),-2)" ' Hver omkostning er imellem 10% og 40% af korresponderende NPV. Range("InvCost").Formula = "=Round(NPV*(.1+.3*RAND()),-2)" ' Budgettet er mellem 30% og 90% af de totale omkostninger af alle investeringer. Range("Budget").Formula = "=Round(SUM(InvCost)*(.3+.6*RAND()),-2)" ' "Frys" de tilfældige tal. With Union(Range("NPV"), Range("InvCost")).Copy.PasteSpecial Paste:=xlValues End With With Range("Budget").Copy.PasteSpecial Paste:=xlValues End With ' fjern de stiblede linier rundt om det kopierede område. Application.CutCopyMode = False ' Initial løsning => alle sættes lig 1.
Range("InvLevel") = 1 ' Udregn den total investeringsomkostning og den total NPV. Range("TotCost").Formula = "=Sumproduct(InvCost,InvLevel)" Range("TotNPV").Formula = "=Sumproduct(NPV,InvLevel)" $4$, #1#2"+& " + *+= # Sub SortProjects() ' Sorter projekterne i stigende orden i fht. NPV/investeringomkostninger. With Range("A4") Range(.Offset(1, 1),.Offset(4, NProjects)).Sort _ Key1:=Range("B8"), Order1:=xlAscending, _ Orientation:=xlLeftToRight, Header:=xlNo End With $4$0 ("# " 1 "&'"/.4-# " " " Sub RunSolver() ' Opstil og kør løseren for at finde en optimal heltallig løsning. SolverReset SolverOK SetCell:=Range("TotNPV"), MaxMinVal:=1, ByChange:=Range("InvLevel") ' De to forgående linier gentages nu - BUG i løserens VBA funktioner. SolverReset SolverOK SetCell:=Range("TotNPV"), MaxMinVal:=1, ByChange:=Range("InvLevel") ' Tilføj ligninger og kør løseren. SolverOptions IntTolerance:=0, AssumeLinear:=True SolverAdd CellRef:=Range("TotCost"), Relation:=1, FormulaText:="Budget" SolverAdd CellRef:=Range("InvLevel"), Relation:=5 SolverSolve UserFinish:=True ' Opfag den totale NPV og budgetoverskuddet. TotNPVOpt = Range("TotNPV") LeftoverOpt = Range("Budget") - Range("TotCost") $4$4 7"#& " "%")"H#%- )"" *+
H#>?0 " Sub Heuristic() ' Find den heuristiske løsning ved at vælge investeringerne i faldende orden af ' NPV/inv.Omk. Dim i As Integer ' Initialiser værdier så ingen projekter p.t. er valgte og så budgettet er ' tilrådig. For i = 1 To NProjects ZeroOne(i) = 0 Next TotNPVHeur = 0 LeftoverHeur = Range("Budget") ' Loop igennem alle projekter i faldende orden af NPV/inv.Omk. Includer projektet ' hvis omkostningen er mindre end budget som p.t. er tilrådighed. For i = NProjects To 1 Step -1 If Range("InvCost").Cells(i) <= LeftoverHeur Then LeftoverHeur = LeftoverHeur - Range("InvCost").Cells(i) TotNPVHeur = TotNPVHeur + Range("NPV").Cells(i) ZeroOne(i) = 1 Next $4$8 9#"""# " ;1 "1 ")" """.)" " I " &1 $ Sub CreateReport() Dim i As Integer, InvestOpt As String, InvestHeur As String, NOpt As Integer, NHeur As Integer, _ Counter1 As Integer, Counter2 As Integer ' Skjul Model arket og vis og aktiver Report arket. Worksheets("Model").Visible = False With Worksheets("Report").Visible = True.Activate End With Range("A1").Select ' Find antallet af investeringer fundet af den optimale plan (NOpt) og fundet af suboptimale plan (NHeur). NOpt = 0 NHeur = 0 For i = 1 To NProjects If Range("InvLevel").Cells(i) = 1 Then
NOpt = NOpt + 1 If ZeroOne(i) = 1 Then NHeur = NHeur + 1 Next ' Dan strengene InvestOpt og InvestHeur som skal holde de investeringer der deltages i af de to metoder. ' Først initialiseres strenge og tællere. InvestOpt = "" InvestHeur = "" Counter1 = 0 Counter2 = 0 ' Loop igennem alle projekter. For i = 1 To NProjects ' Tjek om dette projekt er i den optimale løsning. If Range("InvLevel").Cells(i) = 1 Then Counter1 = Counter1 + 1 ' Tilføj et komma til strengen hvis dette projekt ikke er det sidste projekt. If Counter1 < NOpt Then InvestOpt = InvestOpt & i & "," Else InvestOpt = InvestOpt & i ' Tjek om dette projekt er med i den heuristiske løsning. If ZeroOne(i) = 1 Then Counter2 = Counter2 + 1 ' Tilføj et komma til strengen hvis dette projekt ikke er det sidste projekt. If Counter2 < NHeur Then InvestHeur = InvestHeur & i & "," Else InvestHeur = InvestHeur & i Next ' Skriv resultaterne i Report arket - range navnene blev defineret på designtidspunktet. Range("InvestOpt") = InvestOpt Range("InvestHeur") = InvestHeur Range("LeftoverOpt") = LeftoverOpt Range("TotNPVOpt") = TotNPVOpt Range("LeftoverHeur") = LeftoverHeur Range("TotNPVHeur") = TotNPVHeur $4$: ( " " " Sub ViewReport() Worksheets("Report").Activate Range("A1").Select
Sub ViewModel() With Worksheets("Model").Visible = True.Activate End With Range("A2").Select $8 &- % " $: ("# 0? D. "( Range("NPV").Formula = "=Round(NORMINV(RAND(),25000,6000),-2)" %*+ / B%B & )"" "%( RandNPV = Round(Application.NormInv(Rnd, 25000, 6000), -2) C*+1*+ " B%B #D. " % 1J% 3? ""( % K" L 5? D %*+ 6? >?
"( " " & " C " ( % *+=