2017-10-09 212 views
1

我需要製作一個宏,它可以更改3個單元格中的值,運行求解器以適應不斷變化的約束,然後將求解值粘貼到列中。重複。Excel VBA - 更改公式值

在單元格L78,79和81中,我分別參考了列L,R和P。

這裏基本上是我在做什麼,每次我更新值:

L78 = **L4**, 
L79 = **R4**, 
L81 = **P4**, 

Run Solver 

Objective: $M$73 
By changing variable: $L$80 

Constraint: $M$73=**M4** 

Solve 

Copy $M$73 

Paste **N4** 

我會再增加在所有的值** 1行和重複。

第一次在這裏,所以我道歉任何可憐的格式。

+0

您是否嘗試錄製宏,看到它做什麼? –

+0

我有,它工作正常,但我不知道如何使它每次更新行值。因爲它會一遍又一遍地複製相同的單元格。 –

+0

不錯,你已經成功完成了這項工作。稍後,您將能夠改進您的代碼,例如通過不使用選擇或激活,而是直接引用。 一個旁註,沒有看到你的問題,它可能可以使用更優雅的矩陣代數來解決它。我在本科生論文中學習了VBA求解器,僅僅在第一天在我的主人學習中,我所需要的就是正確的數學(一旦你意識到超級簡單)。 –

回答

0

所以,我設法想出了一些基本的VBA,做到了這一點。因爲它使用的是複製和粘貼(lol),所以它並不完美,但它適用於我的目的,即運行二項期權定價模型並收集幾百個選項的隱含波動率。

代碼是:

Sub Macro1() 
Worksheets("Filtered Puts").Activate 
RowCount = 3 
Do While Not IsEmpty(Worksheets("Filtered Puts").Range("H" & RowCount)) 
    Range("L" & RowCount).Select 
    Selection.Copy 
    Range("L78").Select 
    ActiveSheet.Paste 
    Range("R" & RowCount).Select 
    Selection.Copy 
    Range("L79").Select 
    ActiveSheet.Paste 
    Range("P" & RowCount).Select 
    Selection.Copy 
    Range("L81").Select 
    ActiveSheet.Paste 
    Range("O73").Select 
     SolverReset 
    SolverOptions precision:=0.001 
    SolverOk SetCell:="$M$117", _ 
     MaxMinVal:=1, _ 
     ValueOf:=0, _ 
     ByChange:="$L$80" 
    SolverAdd CellRef:=Range("M" & RowCount), _ 
     Relation:=2, _ 
     FormulaText:="$M$117" 
    SolverSolve userFinish:=True 
    SolverFinish keepFinal:=1 
     Range("$L$80").Select 
    Selection.Copy 
    Range("N" & RowCount).Select 
    ActiveSheet.Paste 
    RowCount = RowCount + 1 
    Loop 
End Sub