Tag: 优化

Excel求解器忽略VBA中的约束

我正在尝试使用Solverfind一个简单投资组合的最大回报。 在工作表中使用Solver直接工作,但在VBA中设置命令时不会。 相反(正如你可以从screengrab看到的那样)忽略了其中一个约束(在T10中计算的权重总和应该等于1)。 有趣的是,如果我改变第三行来说: SolverAdd CellRef:="$T$10", Relation:=2, FormulaText:="100" 或“1”以外的其他整数。 (也可能忽略其他约束,但我不能检查这个)。 表格看起来像这样: 而我的代码是: Sub FindRange() SolverReset SolverOk SetCell:="$T$7", MaxMinVal:=1, ValueOf:="0", ByChange:="$O$10:$R$10" SolverAdd CellRef:="$T$10", Relation:=2, FormulaText:="1" SolverAdd CellRef:="$O$10:$R$10", Relation:=3, FormulaText:="0" SolverSolve UserFinish:=True SolverFinish KeepFinal:=1 Range("T9").Value = Range("T7").Value End Sub 任何build议感激地欢迎!

如何提高follownig代码的效率

任何人都可以帮助我优化以下简单的代码它需要永久完成执行。 也许我正在某个地方陷入无限循环。 它所做的仅仅是两个string,如果它们相等,那么就按照上面提到的单元格对位置进行混洗。 Sub sort() Dim astid As String Dim partno As String Dim FinalRow As Long Dim i, j As Integer FinalRow = Sheets("Combined Version").Range("H9000").End(xlUp).Row For i = 5 To FinalRow partno = Sheets("Combined Version").Cells(i, 7).Value For j = 5 To FinalRow astid = Sheets("Combined Version").Cells(j, 8).Value If astid = partno Then Cells(j, 8).Select […]

最快的方法在Excel VBA中复制大量的值

很简单,我想知道什么是最快的方法复制单元格值从一个表到另一个是。 一般来说,我将按列和/或行循环遍历单元格,并使用如下行: Worksheets("Sheet1").Cells(i,j).Value = Worksheets("Sheet1").Cells(y,z).Value 在其他情况下,我的范围不是连续的行/列(例如,我想避免覆盖已经包含数据的单元格),我要么在循环内有一个条件,要么用行列填充数组我想循环的数字,然后遍历数组元素。 例如: Worksheets("Sheet1").Cells(row1(i),col1(j)).Value = Worksheets("Sheet2").Cells(row2(y),col2(z)).Value 使用我想要复制的单元格和目标单元格来定义范围会更快吗,然后执行Range.Copy和Range.Paste操作? 有没有可能使用数组定义一个范围,而不必循环呢? 或者是否会更快地循环通过一个数组定义一个范围,然后复制粘贴的范围,而不是通过循环等同的单元格值? 我觉得可能无法像这样复制和粘贴范围(即它们需要通过矩形数组连续单元格并粘贴到相同大小的矩形数组中)。 这就是说,我认为有可能将两个范围的元素等同起来,而不用循环遍历每个单元格并且等同于这些值。

在每行之后插入n个空白单元的代码非常慢

这将是我的代码,但如果我有超过5000行和1列,则需要一生。 有没有办法减less查询时间? Sub InsertRows() Dim numRows As Integer Dim r As Long Application.ScreenUpdating = False r = Cells(Rows.Count, "A").End(xlUp).Row numRows = 11 For r = r To 1 Step -1 ActiveSheet.Rows(r + 1).Resize(numRows).Insert Next r Application.ScreenUpdating = True End Sub

macros观运行时间越来越长

我的代码工作正常,但问题在于运行时间越来越长,每次使用macros时都需要花费更多时间来完成计算。 我已经尝试了各种各样的变化和修改,但是由于我对VBA很新,所以我没有取得很大的进展。 这里是我正在运行的代码(注意,它作为子集运行,并且ScreenUpdate = False ): Public Sub deleteRows() Dim lastRow As Long Dim rng As Range With ActiveSheet .AutoFilterMode = False lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row '~~> Set the range of interest, no need to include the entire data range With .Range("B2:F" & lastRow) .AutoFilter Field:=2, Criteria1:="=0.000", Operator:=xlFilterValues .AutoFilter Field:=5, Criteria1:="=0.000", Operator:=xlFilterValues End With .Range("B1:F" […]

Excel的优化

这里是情况:在我的Excel工作表中,我有一个列名为1-name的条目。 我想删除数字,考虑到这个数字也可以是两位数字。 这本身不是一个问题,我得到它的工作,只是performance是如此糟糕。 因为现在我的程序每个单元格需要大约半秒的时间。 我的问题:我该如何提高性能? 这里是代码: Sub remove_numbers() Dim YDim As Long Dim i As Integer, l As Integer Dim val As String Dim s As String YDim = Cells(Rows.Count, 5).End(xlUp).Row For i = 8 To YDim val = Cells(i, 5) l = Len(val) s = Mid(val, 2, 1) If s = "-" Then val […]

在使用求解器EXCEL时保存目标函数值

我有一个Excel中设置的优化问题。 当我优化(使用gui)时,我得到目标函数的最终(最佳)值。 我可以看到,excel计算了很多点的目标函数值,并在最优的一个点上求解。 有没有办法将所有的目标函数值保存到Excel表格中的某个范围。 如果我可以使用求解器GUI来完成,那将是非常好的。 如果没有,基于VBA的解决scheme也可以。 谢谢。

什么是计算安装基数最有效的方法?

我有一个要求,在不同的“环境”多年的不同的国家/地区,通过分配给每个单位的一定的“退休率”来计算不同的出货单位的出货量。 展示位置,曲线定义和曲线分配存储在不同的数据库表中(下面的DDL和示例数据也在SQLFiddle.com上 )。 计算安装基数的公式如下: 其中1990年是我们拥有数据的第一年。 问题: 使用3到1600万行单位/国家/环境/年份布置组合的数据集进行这些计算需要比30秒到1分钟的目标加载/计算时间多得多的时间。 Sql Server的方法 当PIVOT每年成为自己的专栏时,我会从100,000到400,000个返回的原始数据(展示位置+费率)中获得任何地方,大约需要8-15秒。 但是,如果我要通过下面的SQL语句手动计算,至less需要10分钟。 我们还尝试了一种SQL触发器解决scheme,在每次修改展示位置或费率时更新已安装的基础,但是这会使批量更新的数据库更新过于缓慢,而且也不可靠。 如果这真的是最好的select,我想这可能值得更多的调查。 Excel-VSTO方法(到目前为止,最快的方法): 这些数据最终以C#VSTO驱动的Excel工作簿结束,其中的数据是通过一系列VLOOKUPs计算的,但是当6年VLOOKUPs每个单元大约20个VLOOKUPs加载150,000个位置(大约2000万个VLOOKUPs )时,Excel崩溃。 当VLOOKUPs以较小批量完成并且公式被转换成值时,它不会崩溃,但仍然需要比一分钟计算更长的时间。 问题是: 是否有一些math或程序结构可以帮助我通过C#或SQL更有效地计算这些数据? 蛮力迭代也太慢了,所以这也不是一个选项。 DECLARE @Placements TABLE ( UnitId int not null, Environment varchar(50) not null, Country varchar(100) not null, YearColumn smallint not null, Placement decimal(18,2) not null, PRIMARY KEY (UnitId, Environment, Country, YearColumn) ) DECLARE @CurveAssignments TABLE ( […]

VBA-Excel和大型数据集导致程序崩溃

第一次海报和一般编程新。 我有一个项目,我必须build立一个财务模型来挖掘excel中的数据。 我成功地在VBA上构build了这个模型。 我已经在3,000线数据集上进行了testing,并且成功了。 我将简要解释它的作用。 我在多个交易所的特定日子追踪给定的股票。 我下载的数据(大约935,000行)第一步是将一个给定的交易所(大约290,000)的所有数据复制到一个新的表(这大约需要8分钟),然后创build一个新的列logging买卖差价(12secs ),下一步是我有什么麻烦,我基本上sorting每行数据两次,一列的投标大小和一列的询问大小。 我创build了一个使用excel百分位数函数的函数,并根据给定的出价和询问大小的位置来进行排名。 到目前为止,我已经在最后的35分钟运行macros,还没有执行。 我不能尝试其他的macros,因为每个macros都依赖于前一个macros。 所以我的基本问题是,因为我的数据集很大,所以我的模型不断崩溃。处理testing数据时代码似乎很好,而且在运行程序时不会产生任何错误,但是使用更大的数据设置它只是崩溃。 有没有人有什么build议? 如此大量的数据是否正常? 提前致谢。 假 这里是给我麻烦的子和function,子接受所需的input运行function,然后popup到指定的单元格。 代码是假设重复三个单独的工作表的过程。 现在,我喜欢它在一张纸上工作,因此使用注释不包括循环 Sub Bucketting() Dim firstRow As Long Dim lastRow As Long Dim counter As Long Dim bidRange As Range Dim offerRange As Range Dim bidScroll As Range Dim offerScroll As Range Dim Ex As String Dim i […]

比较工作表1 col 1到工作表2 col 1工作表1 col 6中的值

第一次发布一个问题,所以请纠正我,如果我做任何我不应该! 我有一个button按下button来比较2张表中的2列,并输出第1页第6列中第2列第1列的值,或者如果不匹配,则输出第1列第6列中的“无”。 我的代码是越野车,需要很长时间才能运行(在工作表1和工作表2上的约5000条目)。 我的代码部分工作; 它只能在任何一张纸上左右三分之一左右。 Sub Find_Sup() Dim count As Integer Dim loopend As Integer Dim PartNo1 As String Dim PartNo2 As String Dim partRow As String Dim SupRow As String Dim supplier As String Let partRow = 2 Let SupRow = 2 'Find total parts to check Sheets("Linnworks Supplier Update").Select Range("A1").End(xlDown).Select loopend = Selection.row […]