Hallo,
Ik zit een probleem wat ik graag bij jullie wil voorleggen. Het gaat om het volgende:
Via mijn studie heb ik een excelsheet (.xls bestand 97-2003) met ingebouwde macro gekregen. In de sheet kun je een aantal variabelen invoeren, met een 'knop' (waar de macro achter zit) gaat ie vervolgens berekeningen maken. In Excel 2003 werkt de macro nog gewoon (nog getest op een andere computer). Echter, in Excel 2007 krijg ik een foutmelding zodra ik met mijn muis over de 'knop' beweeg. Ik krijg de volgende melding:
Systeem:
- Windows XP Professional SP3
- Office 2007 SP2
Ik ben onbekend met VBA of het programmeren van macro's. Mogelijk dat het een simpel probleem is in de code maar ik kan dit hier niet uithalen. Ik hoop dat jullie met verder kunnen helpen. Mocht het noodzakelijk zijn, kan ik de excelsheet uploaden.
Alvast erg bedankt voor jullie hulp.
            Ik zit een probleem wat ik graag bij jullie wil voorleggen. Het gaat om het volgende:
Via mijn studie heb ik een excelsheet (.xls bestand 97-2003) met ingebouwde macro gekregen. In de sheet kun je een aantal variabelen invoeren, met een 'knop' (waar de macro achter zit) gaat ie vervolgens berekeningen maken. In Excel 2003 werkt de macro nog gewoon (nog getest op een andere computer). Echter, in Excel 2007 krijg ik een foutmelding zodra ik met mijn muis over de 'knop' beweeg. Ik krijg de volgende melding:
Wat ik heb gedaan:Compileerfout: Lid bestaat al in een objectmodule waar van deze objectmodule is afgeleid
- Beveiliging: "Alle macro's inschakelen (wordt niet aanbevolen omdat mogelijk schadelijke programmacode kan worden uitgevoerd)" + aangevinkt "Toegang tot het objectmodel van het VBA-project vertrouwen"
- Bestand opgeslagen als Excel 2007 (.xlsx) en Excelbestand 2007 met ingeschakelde macro's (.xlsm), beide zonder resultaat
- Verschillende forums nagezocht over dit probleem maar nog geen passende oplossing kunnen vinden
code:
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 | Option Explicit
Private Sub CommandButton1_Click()
Dim n As Long 'iteration
Dim m As Integer 'number of stocks
Dim rfr As Single 'risk-free rate
Dim sum As Single
Dim iRow As Long, iCol As Long
Dim i As Long, j As Long, k As Long
Dim index1 As Long, index2 As Long
n = Range("C3").Value
rfr = Range("C4").Value
iCol = 3
Do While Cells(6, iCol).Value <> ""
    iCol = iCol + 1
Loop
m = iCol - 3
ReDim w(n, m) As Single 'weights
ReDim r(m) As Single 'returns of stocks
ReDim r_portf(n) As Single 'returns of portffolios
ReDim Cov(m, m) As Single 'covariance matrix
ReDim SD_portf(n) As Single 'variances of portffolios
ReDim Sharpe(n) As Single ' Sharpe indices
ReDim Mtemp1(n) As Single, Mtemp2(n) As Single 'temporary matrices
For i = 1 To m
    r(i) = Cells(6, i + 2).Value
    For j = 1 To m
        If j >= i Then
            Cov(i, j) = Cells(8 + i, 2 + j).Value
        Else
            Cov(i, j) = Cells(8 + j, 2 + i).Value
        End If
    Next j
Next i
Randomize
For i = 1 To n
    sum = 0
    For j = 1 To m
        w(i, j) = Rnd
        sum = sum + w(i, j)
    Next j
    For j = 1 To m
        w(i, j) = w(i, j) / sum
        r_portf(i) = r_portf(i) + w(i, j) * r(j)
    Next j
    For j = 1 To m
        For k = 1 To m
            SD_portf(i) = SD_portf(i) + w(i, j) * w(i, k) * Cov(j, k)
        Next k
    Next j
    SD_portf(i) = Sqr(SD_portf(i))
    Mtemp1(i) = SD_portf(i)
    Sharpe(i) = (r_portf(i) - rfr) / SD_portf(i)
    Mtemp2(i) = Sharpe(i)
Next i
Range("C22:O23").ClearContents
Range("T:V").ClearContents
Range("T1").Value = "portffolio #"
Range("U1").Value = "SD"
Range("V1").Value = "Mean Return"
For iRow = 1 To n
    Cells(iRow + 1, 20).Value = iRow
    Cells(iRow + 1, 21).Value = SD_portf(iRow)
    Cells(iRow + 1, 22).Value = r_portf(iRow)
Next iRow
Range("Z2").Value = Range("D4").Value
'getting the number of the portfolio that has the minimum standard deviation of all portfolios
index1 = Sort(Mtemp1, n, 0) '(matrix, size, min-max indicator)
'getting the number of the portfolio that has the maximum Sharpe index value of all portfolios
index2 = Sort(Mtemp2, n, 1) '(matrix, size, min-max indicator)
For iCol = 1 To m
    Cells(22, iCol + 2).Value = w(index1, iCol)
    Cells(23, iCol + 2).Value = w(index2, iCol)
Next iCol
Range("M22").Value = r_portf(index1)
Range("M23").Value = r_portf(index2)
Range("N22").Value = SD_portf(index1)
Range("N23").Value = SD_portf(index2)
Range("O22").Value = Sharpe(index1)
Range("O23").Value = Sharpe(index2)
Range("X2").Value = 0
Range("Y2").Value = Range("C4").Value
Range("X3").Value = Range("N23").Value
Range("Y3").Value = Range("M23").Value
Range("X4").Value = Mtemp1(n)
Range("Y4").Value = Range("Y2").Value + (Range("Y3").Value - Range("Y2").Value) _
/ (Range("X3").Value - Range("X2").Value) * Mtemp1(n)
End Sub
Private Sub CommandButton2_Click()
Range("C3").Value = " "
Range("C4").Value = " "
Range("C6:L6").ClearContents
Range("C9:L18").ClearContents
Range("C22:L23").ClearContents
Range("T:V").ClearContents
Range("R1").Value = "portffolio #"
Range("S1").Value = "SD"
Range("T1").Value = "Mean Return"
End Sub
Private Function Sort(matrix() As Single, number As Long, indicator As Boolean)
'(matrix, size, min-max indicator)
'ascending as indicator = 0, decending as indicator = 1
Dim temp1 As Single, temp2 As Long
Dim i As Long, j As Long
ReDim index(number) As Long
For i = 1 To number
    index(i) = i
Next i
For i = 2 To number
    temp1 = matrix(i)
    temp2 = index(i)
    For j = i - 1 To 1 Step -1
        If indicator = 0 Then
            If matrix(j) <= temp1 Then
                Exit For
            End If
        Else
            If matrix(j) >= temp1 Then
                Exit For
            End If
        End If
        matrix(j + 1) = matrix(j)
        index(j + 1) = index(j)
    Next j
    matrix(j + 1) = temp1
    index(j + 1) = temp2
Next i
Sort = index(1)
End Function | 
Systeem:
- Windows XP Professional SP3
- Office 2007 SP2
Ik ben onbekend met VBA of het programmeren van macro's. Mogelijk dat het een simpel probleem is in de code maar ik kan dit hier niet uithalen. Ik hoop dat jullie met verder kunnen helpen. Mocht het noodzakelijk zijn, kan ik de excelsheet uploaden.
Alvast erg bedankt voor jullie hulp.
/u/28468/librarian2.png?f=community)