2015-06-23 51 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这样的函数。您通常可以使用二元决策变量模拟过滤器的功能,如果您想使用内置解算器,则可能需要此类移动。 –