2017-05-13 1 views
1

VBA에서 일부 행렬 곱셈을 시도하지만 오류가 계속 발생합니다. 모든 벡터 및 행렬을 정의하고 한 번에 한 번씩 계산을 시도했지만 = MMult 함수가 올바르게 작동하는 것처럼 보입니다. 그러나 SumProduct를 사용할 때 반환되는 값은 0입니다.VBA : Sumproductc에서 빈 값 반환 (행렬 곱셈)

이것은 내입니다. 이 하위에 대한 코드 (I는 일부 서식을 떠 났어요) :

Excel에서
Sub StockAnalysis() 
Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

Dim Stocks As Integer 
Dim TableStart As Integer 
Dim TableEnd As Integer 
Dim CorrTableStart 
Dim CovTableStart As Integer 
Dim InvCovTableStart As Integer 

Dim AuxiliaryA As Integer 
Dim AuxiliaryB As Integer 
Dim AuxiliaryC As Integer 
Dim AuxiliaryD As Integer 

'Count the amount of stocks 
Stocks = 0 
For i = 1 To 20 
    If Worksheets("MainSheet").Cells(i + 2, 2) <> 0 Then 
     Stocks = Stocks + 1 
    Else 
     Stocks = Stocks 
    End If 
Next 

'Deleting previous TempSheet 
For Each Worksheet In Application.ActiveWorkbook.Worksheets 
    If Worksheet.Name = "TempSheet" Then 
     Worksheet.Delete 
    End If 
Next 

'Defining start and end points of the tables 
TableStart = Stocks + 3 
TableEnd = TableStart + Stocks 
CorrTableStart = 9 
CovTableStart = CorrTableStart + Stocks + 2 
InvCovTableStart = 13 + (Stocks * 2) 
RiskFreeRateStart = InvCovTableStart + 2 + Stocks 

'Transposing Means are creating One Vector 
ActiveWorkbook.Sheets.Add.Name = "TempSheet" 
Worksheets("TempSheet").Visible = xlSheetHidden 
Worksheets("TempSheet").Cells(1, 1) = "Stocks" 
Worksheets("TempSheet").Cells(1, 2) = "Mean" 
Worksheets("TempSheet").Cells(1, 3) = "Vector" 
For j = 1 To Stocks 
    Symbol = Worksheets("All stocks").Cells(1, 1 + j) 
    Worksheets("TempSheet").Cells(j + 1, 1) = Symbol 

    Mean = Worksheets("All stocks").Cells(2, TableStart + j) 
    Worksheets("TempSheet").Cells(j + 1, 2) = Mean 

    Worksheets("TempSheet").Cells(j + 1, 3) = 1 
Next 

'--------------------Calculations-------------------- 

MeanVector = Worksheets("TempSheet").Range(Cells(2, 2), Cells(1 + Stocks, 2)) 
OneVector = Worksheets("TempSheet").Range(Cells(2, 3), Cells(1 + Stocks, 3)) 

ReDim MatrixInvCov(1 To Stocks, 1 To Stocks) 
For i = 1 To Stocks 
    For j = 1 To Stocks 
     MatrixInvCov(i, j) = Worksheets("All stocks") _ 
      .Cells(InvCovTableStart + i, TableStart + j).Value 
    Next 
Next 

AuxiliaryMeanMM = Application.WorksheetFunction.MMult(MatrixInvCov, MeanVector) 

AuxiliaryOneMM = Application.WorksheetFunction.MMult(MatrixInvCov, OneVector) 

AuxiliaryA = Application.WorksheetFunction.SumProduct(MeanVector, AuxiliaryMeanMM) 
AuxiliaryB = Application.WorksheetFunction.SumProduct(MeanVector, AuxiliaryMeanMM) 
AuxiliaryC = Application.WorksheetFunction.SumProduct(MeanVector, AuxiliaryOneMM) 
AuxiliaryD = AuxiliaryA - AuxiliaryC - AuxiliaryB^2 



Application.ScreenUpdating = True 
Application.DisplayAlerts = True 

End Sub 

"A"다음과 같이 기록 될 것입니다 :

= SUMPRODUCT (MeanVector, MMULT (MatrixInvCov, MeanVector))

행렬 및 벡터의 크기는 정확합니다. MatrixInvCov가 [3x3] 행렬 인 동안 AuxiliaryOneMM, AuxiliaryMeanMM, MeanVector 및 OneVectore는 [3x1]입니다.

다음은 지역 창에 대한 그림입니다. 벡터 및 행렬은 정확하지만 A, B, C 및 필요한 경우 D는 모두 0

enter image description here

TempSheet의 사진 및 모든 주식은 다음과 같습니다

enter image description here

enter image description here

답변

1
Dim AuxiliaryA As Integer 
Dim AuxiliaryB As Integer 
Dim AuxiliaryC As Integer 
Dim AuxiliaryD As Integer 

당신은 당신의 결과 As Integer를 디밍하고, 그들은 시계 창에서 값을 보면 1보다 적은 어떤 결과를 0이됩니다, 그들은 작은 값을 것 같다, 그래서 이것은이다 가능성이 가장 높은 이유. 과학적인 계산을 위해

Dim AuxiliaryA As Double, AuxiliaryB As Double, AuxiliaryC As Double, AuxiliaryD As Double 

, 난 당신이 모든 변수를 어둡게한다 As Double 당신이 어떤 합리적인 정당성이 없다면 생각합니다.

+1

감사합니다 당신이 아주 많이,이 문제를 해결했다! 변수의 밝기조차 살펴 보지 않았습니다. 나는이 부분을 조금 읽어야 할 필요가 있다고 생각한다. –

0

또한 엑셀 수식 (테스트하지) 평가 수 :

MatrixInvCovAddr = Cells(InvCovTableStart + 1, TableStart + 1).Resize(stocks,stocks).Address 

AuxiliaryMeanMM = Sheet("TempSheet").Evaluate("Sumproduct(B2:B" & 1 + Stocks & _ 
      ",MMULT('All stocks'!" & MatrixInvCovAddr & ", B2:B" & 1 + Stocks & "))")