Tag: 优化

删除具有一个特定列的空白行

我做了一个代码,将在我的表(table1)的所有行中search,并在某一列中find一个空白的单元格,该行将复制另一个表(表2),并从table1擦除。 当我把代码运行vb保持“不运行”,我需要强制停止,但是当我在Excel中查看表,我看到他复制一些行(不删除,因为我强制停止之前,他到达那里)。 我在一个有95k行的桌子上做这个,花了很多时间,我需要那么快。 所以这是代码: Function DeleteRows() Debug.Print Time Dim shtSrc As Worksheet, shtDest As Worksheet Dim lRow As Long, Row As Long Dim rw As Range, rngDel As Range Application.ScreenUpdating = False viewmode = ActiveWindow.View ActiveWindow.View = xlNormalView Application.EnableEvents = False Application.DisplayStatusBar = False ActiveSheet.DisplayPageBreaks = False Row = 2 lRow = Range("A" & Rows.Count).End(xlUp).Row […]

在Excel中有1000x1000matrix时如何提高效率?

使用OpenSolver ,我试图解决问题大小为1000的基本分配问题 。 所以excel文件有一个1000×1000的matrix。 matrix内的每个值可以是0或1。 解决一个样本问题需要超过10个小时才能完成,并有100个样本。 但我有一个星期完成整个事情。 我怀疑效率低下的主要原因是由matrix造成的,Excel如何处理它。 有什么办法可以加快这个过程吗? 有任何想法吗? 任何帮助表示赞赏! 谢谢。

Excel求解不提供一致的结果

我试图用求解器来解决非线性问题,但是结果并不一致,并且在一定的条件下会发生变化。 使用Risk Solver Platform时不存在此问题,但在使用常规Excel求解器时不存在此问题。 优化和约束并不复杂,所以我不明白是怎么回事。 这是文件: temp.xlsm 请注意,运行解算器的button附带有macros。 复制问题: 打开文件 点击Months选项卡 最初的感染率应该是11% 点击Optimize Net Revenue (正确的最佳条件,这是好的) 将初始感染率改为1% 点击Optimize Net Revenue 将初始感染率改回到11% 点击Optimize Net Revenue 注意:最佳净收入现在较低,在最后一个月,最后一列为负,应为零。 似乎求解器每次都需要重新设置,或者有一个错误,但我无法弄清楚。 这是macros: Sub Monthly_Solver() Application.Run "SolverReset" Application.Run "SolverOk", "$T$18", 1, "0", "$F$6:$F$17,$N$6:$N$17", 1, "GRG Nonlinear" Application.Run "SolverAdd", "$F$6:$F$17", 5, "binary" Application.Run "SolverAdd", "$N$6:$N$17", 1, "$M$6:$M$17" Application.Run "SolverAdd", "$N$6:$N$17", 3, "0" […]

从非连续行中提取数据并将其添加到连续行中的其他表单中

我试图从一个范围(A1:A:2000)中提取任何引用关键字的数据,而不pipe范围在哪里,并将结果转换为从A1向下连续行的新工作表。 一个很好的例子就是电影剧本。 如果电影中的所有行都在表格的A栏中:“完整的电影脚本”,我只想把单个人的行移动到新的表格中:“迈克的脚本”。 原始的“完整的电影脚本”工作表可能如下所示: A1 Mike: Blah Blah Blah A2 Paul: Blah Blah Blah Blah Blah Blah A3 Jerry: Blah Blah Blah Blah A4 Mike: Blah A5 Jerry: Blah Blah Blah A6 Mike: … 我想用VBA做的事情就是通过使用关键字“Mike”将Mike的行移到新表中: 迈克的脚本 A1 Mike: Blah Blah Blah A2 Mike: Blah A3 Mike: … 我知道我可以在第二页中使用IF语句并对数据进行sorting但理想情况下,我希望能够做到这一点,而不必过滤和sorting来获得输出。 我正在探索在Visual Basic中的选项,但有人可能知道如何做到这一点。

search和删除VBA代码需要优化

我有一个Excel工作簿2张(ProductList和CurrentProducts) 我有以下代码: Sub Macro1() Dim Lastrow As Integer Dim x As Integer Dim BinNo As String Dim MyCell As Range Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Lastrow = Sheets("ProductsList").Range("A65536").End(xlUp).Row For x = Lastrow To 2 Step -1 BinNo = Sheets("ProductsList").Range("A" & x).Value With Sheets("CurrentProducts").Range("A:A") Set MyCell = .Find(What:=BinNo, _ After:=.Cells(.Cells.Count), _ LookIn:=xlValues, […]

VBA优化3个循环的性能

首先,我想检查“Sheet1”列D的每一行中的值是否与“Accepted”列A的任何一行匹配。 如果匹配,我想将“Sheet1”那一行的B列中的值复制到“Accepted”的D列中。 但是,由于“Sheet1”的B列中有2个可能的值,所以我想将这些值分成两列“Accepted” – 列D和E.因此,下一个循环,如果列D中的值为“接受“不是”限制“,然后将该值复制到E列并删除D列的内容。 代码工作正常,它可以帮助我实现我的目标,但是,这个过程花费了很长时间,经过一些调查,我发现延迟只发生在最后一个循环。 我想知道如果我能加快这个过程,谢谢! Dim i As Long Dim j As Long Dim k As Long 'to speed up the VBA code With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With AcceptedLastRow = ActiveWorkbook.Worksheets("Accepted").Range("A" & Rows.Count).End(xlUp).Row Sheet1LastRow = ActiveWorkbook.Worksheets("Sheet1").Range("D" & Rows.Count).End(xlUp).Row For j = 1 To AcceptedLastRow For i = 1 […]

C#Excel读取优化

我的应用程序将build立一个项目列表,并从Excel文件中获取必要的数据(例如:价格,客户项目代码)。 这个参考excel文件有650行和7列。 应用程序将在一次运行时读取10-12个项目的行。 逐行读取订单项会更明智吗? 或者,我应该首先读取excel文件中的所有行项目到一个列表/数组,并从那里进行search? 谢谢

为什么这个Power Query操作需要花费很多时间才能完成?

在前面的线程中 ,我从@teylyn那里得到了一些帮助,让这段代码运行起来。 对于查询的操作时间,我遇到了一些麻烦。 任务: 任务是将两个单独的联系人列表合并成一个全新的列表。 我还需要删除共享相同名称和公司名称的重复项。 最后,我需要删除共享相同CompanyID但公司名称不同的联系人。 主要清单中的联系人应保存以防发生冲突。 下面的代码工作,但需要很长时间才能完成。 该列表总共包含大约8500个联系人。 迭代每个联系人需要2.5秒,这个联系人将upp添加到大约6小时直到完成。 我的问题: 为什么这个操作需要这么长时间,有什么办法可以让它更快? let Source = Table.Combine({PrimaryContacts, SecondaryContacts}), #"Removed duplicates" = Table.Distinct(Source, {"CompanyID", "FirstName", "LastName"}), #"Sorted rows" = Table.Sort(#"Removed duplicates",{{"CompanyID", Order.Ascending}, {"Email", Order.Descending}}), #"Filtered rows" = Table.SelectRows(#"Sorted rows", each ["FirstName"] <> null and ["FirstName"] <> ""), #"Added index" = Table.AddIndexColumn(#"Filtered rows", "Index", 10000, 1), #"Renamed […]

如何在Excel 2003中使用VBA对混合date和一般格式数据的列进行sorting

首先,如果我在最好的VBA练习中犯了很多错误,我很抱歉。 特别是我一直在学习这个项目的语言,可能有很多事情我做错了,如果我让任何人感到惭愧,那么很抱歉。 接下来是问题。 我想按照date排列一个范围(保存在一列中),就像在sorting“看起来像一个数字的数字的东西”时工具菜单上的sorting函数一样。 该列是英国本地语言date和文本string混合在“一般”格式的单元格中,基本上只是date。 换句话说,像这样简单的事情: Range(rngFirstCell, rngLastCell).Sort Key1:= 2, Order1:=xlAscending, _ DataOption1:=xlSortTextAsNumbers, Header:=xlYes 应该做的伎俩。 事实上,我认为唯一的例外是录制的代码使用xlGuess作为Header,并且包含OrderCustom的值为1,正是macros录制器产生的。 不用说,我试过logging的代码,结果相同。 问题是,而不是得到: Type Date gen 01/3/2008 date 02/4/2008 date 17/4/2008 gen 25/7/2009 我得到: Type Date date 02/4/2008 date 17/4/2008 gen 01/3/2008 gen 25/7/2009 由于这在更高版本的Excel中起作用,因此我认为这是2003年的一个bug。我当前的解决scheme是首先将列中所有单元格的NumberFormat属性设置为“d / m / yyyy”,然后迭代在它们上面,用CDate(Cell.Value)的结果replace每个值。 它使sorting工作。 由于表单和VBA之间有太多的交互(从我读过的很慢),所以还需要10秒来重新格式化一个包含20个条目的列。 因为我需要按代码sorting的一些数据集完全有可能是数百个单元,我需要更快一些。 任何人都可以build议一个更好的方式做到这一点 为了清楚起见,我目前使用的代码看起来非常像: Range(rngFirstCell, rngLastCell).Columns(2).NumberFormat = "d/m/yyyy" Dim intIndex […]

为什么函数SUMIFS比迭代(for)

如果其他工作簿已closures,Excel SUMIFS函数将无法执行。 所以,我做了一个SUMIFS函数打开我的工作簿,迭代通过“for”循环,并validation值列是否需要添加在我的总variables。 我做了另一个函数,删除我的'for'循环,并使用“WorksheetFunction.SumIfs(…)”。 我的新function比旧的function跑得最快。 什么是Excel函数和VBA迭代背后的魔力?