2015-06-23 50 views
0

我有一個大的數據集和一些當前的VBA代碼來進行一些計算。我的代碼執行以下操作:使用VBA求解器與嵌套循環結合使用

  1. 它包括兩個嵌套的循環和複製和粘貼結果在Excel中一些方程爲大彙總表。
  2. 然後代碼對數據進行排序並應用一些高級篩選器以及許多標準來得出解決方案。

我想知道是否可以使用VBA解算器代碼通過改變高級過濾器標準與當前循環的組合來最大化我的解決方案?此時我必須手動迭代它,但希望能夠包含求解器以消除手動迭代並確定最佳濾波器標準以最大化解決方案。

我意識到求解器的基本功能的偉大工程,如果我有在Excel中像mx + b = c一個簡單的等式,我想通過改變mb最大化的c價值。但我不確定是否可以,或者如何在當前循環中應用求解器? 我的主要問題是,如果有人認爲VBA求解器(或類似的)可以用於我的應用程序。

如果以下需要的是我當前的代碼,並且要注意我在VBA中自學,所以我的代碼可能不是最有效的。

Sub Builder() 

Dim LastRow As Long 
Dim FirstRow As Long 
Dim UsedRng As Range 
Dim FirstYr As Integer 
Dim LastYr As Integer 
Dim Counter1 As Single 
Dim DeleteRow As Long 

Windows("Model.xlsm").Activate 
Sheets("Full List").Select 
Set UsedRng = ActiveSheet.UsedRange 

LastRow = UsedRng(UsedRng.Cells.Count).Row 
Sheets("ModelSummary").Range("F1").Value = LastRow 

FirstYr = Sheets("ModelSummary").Range("w5").Value 
LastYr = Sheets("ModelSummary").Range("w6").Value 

Windows("Portfolio.xlsm").Activate 
Sheets("Builder").Select 
Range("A7:R23").Select 
Selection.ClearContents 

Windows("Model.xlsm").Activate 
Counter1 = 0 

For j = FirstYr To LastYr 

    Sheets("Model").Range("o15").Value = j 
    Sheets("Full List").Select 
    Range(Cells(2, 1), Cells(LastRow + 1, 1)).Select 
    Selection.Copy 
    Sheets("ModelSummary").Select 
    Cells(8, 1).Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
    Cells(6, 1).Value = j 

    Sheets("Model").Select 
    Range("H5:H24").Select 
    Selection.Copy 
    Sheets("ModelSummary").Select 
    Cells(7, 1).Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=True 

    Cells(8, 1).Select 

For i = 1 To (LastRow - 1) 
    Selection.Copy 
    Sheets("Model").Select 
    Range("C3").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
    Range("I6:I24").Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    Sheets("ModelSummary").Select 
    ActiveCell.Offset(0, 1).Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=True 
    ActiveCell.Offset(1, -1).Select 
Next 

Range(Cells(7, 1), Cells(LastRow + 6, 20)).Select 
ActiveWorkbook.Worksheets("ModelSummary").Sort.SortFields.Clear 
ActiveWorkbook.Worksheets("ModelSummary").Sort.SortFields.Add Key:=Range(_ 
    Cells(7, 14), Cells(LastRow + 5, 14)), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _ 
    xlSortNormal 
With ActiveWorkbook.Worksheets("ModelSummary").Sort 
    .SetRange Range(Cells(7, 1), Cells(LastRow + 6, 20)) 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 

DeleteRow = Application.Match(Range("o1").Value, Range(Cells(8, 14), Cells(LastRow + 6, 14)), 0) + 7 
Range(Cells(DeleteRow, 1), Cells(LastRow + 6, 20)).Clear 

Windows("Model.xlsm").Activate 
Sheets("ModelSummary").Select 
Range(Cells(7, 1), Cells(LastRow + 6, 20)).Select 
Range(Cells(7, 1), Cells(LastRow + 6, 20)).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ 
    Range("E2:T3"), Unique:=False 
Range("A6").Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Copy 
Windows("Portfolio.xlsm").Activate 
Sheets("Builder").Select 
Cells(7, 1 + Counter1).Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Windows("Model.xlsm").Activate 
Range("A6").Select 
Selection.ClearContents 
Range(Cells(7, 1), Cells(LastRow + 6, 20)).Select 
Selection.ClearContents 

Counter1 = Counter1 + 1 

Next 

Windows("Portfolio.xlsm").Activate 
Sheets("Builder").Select 
Range("S2").Select 
Selection.Copy 
Sheets("Summary").Select 
Range("A3").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 

End Sub 
+0

你有沒有試過打開「記錄宏」做你想做的解決方案,然後看代碼?我從來沒有這樣做過,但如果記錄宏,記錄一些東西,我會從那裏開始。 –

回答

0

如果你想最大限度的解決方案是,依賴於對標準內容的電子表格單元格範圍內,那麼,當然,你可以使用解算器,試圖找到那些範圍的最佳設置。如果依賴性不是線性的,那麼你不可能找到全局最優,但Excel的求解器現在包含一個可以處理高度非線性函數關係的演化算法。求解器可以由VBA控制。除了您可以輕鬆找到的各種在線教程之外,我還推薦S. Christian Albright編寫的「VBA for Modelers」(http://www.amazon.com/VBA-Modelers-Developing-Decision-Microsoft/dp/1285869613/)。這是我所知道的少數幾本深入使用VBA自動化解算器的書籍之一。它甚至有一個關於在投資組合優化中使用VBA的章節(這似乎是你正在做的事情)。

+0

感謝您的回覆。約翰,我會在亞馬遜看看那本書。解決方案單元取決於標準範圍,但不通過Excel方程式和公式直接鏈接。它僅基於應用於結果表的條件/過濾器進行鏈接,然後提供各種解決方案。這就是說,你認爲我可能有機會獲得一些求解代碼的工作? – jcarl20

+0

而不是篩選 - 如果您需要選擇一些但不是所有潛在投資(或者您正在嘗試執行的任何操作),則可以使用一列0-1變量和像SUMPRODUCT這樣的函數。您通常可以使用二元決策變量模擬過濾器的功能,如果您想使用內置解算器,則可能需要此類移動。 –