Tag: 优化

使用VBA删除行的最有效的方法

我目前有一个macros,我用来删除一个logging,如果ID不存在于我从一个XML文档创build的ID列表中。 它的工作方式就像我想要的那样,但是我在电子表格中有超过1000个列(一年中的每一天一个,直到2015年底),因此需要时间来删除行,并且只能在1或2之前“Excel耗尽资源,不得不停止”。 下面是我正在使用的macros的代码,是否有另一种方法,我可以做到这一点,使Excel不运行的资源? Sub deleteTasks() Application.ScreenUpdating = False Dim search As String Dim sheet As Worksheet Dim cell As Range, col As Range Set sheet = Worksheets("misc") Set col = sheet.Columns(4) ActiveWorkbook.Sheets("Schedule").Activate ActiveSheet.Range("A4").Select ActiveSheet.Unprotect ActiveSheet.Range("A:C").EntireColumn.Hidden = False Do While ActiveCell.Value <> "" search = ActiveCell.Value Set cell = col.Find(What:=search, LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ […]

混合模型:石油生产

油混合 一家石油公司生产三种品牌的石油:Regular,Multigrade和Supreme。 每种品牌的油由四种原油中的一种或多种组成,每种原油具有不同的润滑指数。 有关原油的相关数据如下。 +————-+——————-+——————+————————–+ | Crude Stock | Lubrication Index | Cost (€/barrell) | Supply per day (barrels) | +————-+——————-+——————+————————–+ | 1 | 20 | 7,10 | 1000 | +————-+——————-+——————+————————–+ | 2 | 40 | 8,50 | 1100 | +————-+——————-+——————+————————–+ | 3 | 30 | 7,70 | 1200 | +————-+——————-+——————+————————–+ | 4 | 55 […]

用c#closuresexcel的问题

我有这个代码的unit testing: Excel.Application objExcel = new Excel.Application(); Excel.Workbook objWorkbook = (Excel.Workbook)(objExcel.Workbooks._Open(@"D:\Selenium\wszystkieSeba2.xls", true, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value)); Excel.Worksheet ws = (Excel.Worksheet)objWorkbook.Sheets[1]; Excel.Range r = ws.get_Range("A1", "I2575"); DateTime dt = DateTime.Now; Excel.Range cellData = null; Excel.Range cellKwota = null; string cellValueData = null; string cellValueKwota = null; double dataTransakcji = […]

在每个水箱的最大可能容量上查找保存最大数量的葡萄酒的最less数量的水箱

我的业务是在葡萄酒转售业务,我们有这个问题,我一直在努力解决。 我们随时可以储存50-70种葡萄酒,大约500个不同容量的葡萄酒jar。 每个jar子只能装一种酒。 我的工作是确定最less数量的葡萄酒,每个葡萄酒的种类尽可能接近其最大容量,也就是说,如果两个容量为60升和40升的葡萄酒不应该储存在200升的容器中也存在。 我一直在excel中手工完成这个工作,并想尝试自动化这个过程,但是使用macros和数组公式会很快失控。 我可以在C和Swift中编写一个简单的程序,但坚持find一个通用的algorithm。 而我可以开始的指针非常感谢。 一个完整的解决scheme,我会给你一瓶;) 编辑:澄清,我知道我有多less种types的葡萄酒和他们的总量,即黑比诺700l,美乐2000l等,这些变化每周。 然而,这些油箱有许多不同的容量(40,60,80,100,200升等),并且以不规则的间隔变化,因为它们必须被取出以进行清洁和更换。 简单地使用70个坦克来保存70种types是不可能的。 此外,总量的葡萄酒从来没有匹配坦克的总容量,我需要使用最less数量的坦克来保持最大量的葡萄酒。 在容量不足的情况下,留下的酒量必须尽可能小(它们很快就会变质)。 如果剩余,每种types剩余的数量必须与其数量成比例。 这个问题的简单例子是: Wine: ———- Merlot 100 Pinot 120 Tocai 230 Chardonay 400 Total: 850L Tanks: ———- T1 10 T2 20 T3 60 T4 150 T5 80 T6 80 T7 90 T8 80 T9 50 T10 110 T11 50 T12 50 Total: 830L

Excel – 文件优化

我正在处理一个相当大的Excel文档(〜9MB),其中有60多张,每个文档中都包含很多CUBEVALUE公式。 这个文件需要2分钟才能打开(不包括刷新值),而我读了很多build议,例如: 工作表的拆分(由于这个文件的性质而不可能) 较短的公式,(不可能) 在32位和64位上都testing过(性能不是很明显) 我想知道你们是否遇到过任何优化Excel的开放时间的方法,而不会显着改变其中的内容或任何进一步的build议。

Fastests方法将字典清空到Excel工作表中

将Scripting.Dictionary清空到Excel表格最快的方法是什么? 这就是我现在正在做的,但是对于一个有大约3000个元素的字典来说,这个字典显然很慢。 我已经做了每个我能想到的优化。 这是我的一个简单的版本: 'wordCount and emailCount are late bound "Scripting.Dictionary" objects Private Sub DictionaryToExcel(ByRef wordCount As Object, emailCount As Object) oExcel.EnableEvents = False oExcel.ScreenUpdating = False Set oWorkbook = oExcel.Workbooks.Add oExcel.Calculation = -4135 With oWorkbook.Sheets(1) iRow = 1 For Each strKey In wordCount.Keys() iWordCount = wordCount.Item(strKey) iEmailCount = emailCount.Item(strKey) If iWordCount > 2 And […]

简化VBA代码

我有一个macros在同一个工作簿中读取和写入两张数据。 是否有可能清理和简化代码/陈述,以提高可读性和协助debugging工作? 即使使用space-underscore方法来使用多行,这些陈述变得如此漫长,以至于难以阅读。 一个已经变得笨拙的陈述的例子: Range("mx_plan").Cells(WorksheetFunction.Match(sortedAircraft.Item(i).tailNumber, Range("aircraft")), WorksheetFunction.Match(currentWeekId, Range("week_id")) + weekly_hours_col_offset) = (acft_hoursDNE / acft_weeksRemaining) 我故意试图避免明确引用单个单元格或范围。

VBA – 代码执行速度非常慢

我有一个相当简单的代码,我正在使用循环的Excel数据表。 基本上,我有超过150,000行的数据,我想删除每一行,除了那些“仪器故障”,在这种情况下,我想这行和紧上面和下面的一个(可能包含有关的细节失败)。 这是我的代码: Sub UnsignedFailure() Application.ScreenUpdating = False 'Start point Set r = Range("E1") 'Loop, total rows is a function, executes quickly For t = 3 To TotalRows 'Check for a failure k = InStr(1, r.Cells(t, 1).Value, "Instrument Failure") 'Verify that it corresponds to a GC b = InStr(1, r.Cells(t, 1).Offset(0, -3).Value, "GC") If k […]

Excel VBA优化 – 转置数据

我已经在Excel中以卷起的方式接收了一个报告,我需要将其导出到Access中。 以下是该行的示例: 客户帐户和姓名需要转换为与“凭证”行相邻,需要复制,因此每个凭证行都具有此信息。 转换之后,数据应该是这样的: Customer Account | Name | Date | Voucher | Invoice | Transation Text | Currency 请注意,以“USD”开头的行表示该客户的logging结束。 我已经成功实现了以下代码: Sub Process_Transactions() 'turn off some Excel functionality so code runs faster Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.DisplayStatusBar = False Application.EnableEvents = False Dim i As Long For i = 1 To 731055 'Move […]

Excel VBA:数据处理macros运行时间越来越慢越慢

我正在使用32位Excel 2010中的QuantlibXl库分析大量的历史财务数据。 我的典型工作表包含长达一百万行的经验数据的长列。 我的macros通常需要遍历从顶部到底部的每一行,并执行一些Quantlib典型的财务分析,比如重估安全性,这要求在每一行都创build一个Quantlib对象。 分析的东西包含在单元格中作为公式。 所以在开始的时候,我试着select顶部有公式的单元格,然后把右下angular拖到表单底部来填充它们。 已经在这里,处理时间与所涉及的行数呈指数增长。 所以我想我必须写一个macros,一次处理更小的行块。 macros基本上是照顾一次只填充100行的第一行。 这和一些优化(下面解释)肯定会大大提高速度,但处理时间仍然呈指数级增长。 问题是,尽可能多的我试图优化我的macros,他们越来越慢,他们跑得越来越慢。 我跟踪状态栏中的处理行,例如,如果在启动macros时每分钟处理2000行(计算相当复杂),则在整个运行期间其速度会不断下降,例如每个行只有100行60,000行之后。 在那个节奏下,它永远不会看到工作表的结尾。 所以实际上,在某个时候,最好是放弃它,然后从停止的地方重新开始。 我也分割了这些文件,让他们同时运行在不同的计算机上,这在pipe理上是一个痛苦的屁股。 我已经实现了大量的优化: – 屏幕更新和自动计算closures。 – 我只对正在处理的行进行计算。 – 垃圾收集:Quantlib对象在不再使用后立即被删除。 我以为是他们吃了所有的自由记忆导致了减速。 – 我到目前为止已经将相关结果(单元格)写入文本文件,并删除不再需要的行。 再说一遍,这个macros在开始的时候速度非常快,如果像70,000行之后再没有变得更慢的话,它会在几个小时内运行到最后。 事实上,我曾希望在运行时增加速度,因为行被删除,表单缩小,但是不会发生。 所以我只停留在六万行的过程中,再次启动它,但它却令人厌烦。 我想弄清楚是什么原因导致Excel的行为不能线性处理大量的数据,需要重新启动,以及如何避免它。 如果有人遇到类似的麻烦,并find解决办法,我很高兴听到这个消息。 编辑:每当我停止进程再次加速通过重新开始,我注意到,我必须重新启动Excel,否则恢复就像以前一样慢。 我目前的假设是在某些时候数据没有被正确清理。 如果是这样的话,你的解决scheme会给我带来更多。 Quantlib库有一个方法来查看有多less对象仍然驻留在称为ohRepositoryObjectCount()的内存中。 在每次计算之后,我都会调用ohRepositoryDe​​leteAllObjects()函数,并根据其他方法有效删除它们,但可能仍然有一些泄漏未被发现。 编辑2:我现在确信存在内存泄漏,因为在长时间批处理后,任务pipe理器显示3或4个Excel进程占用大约1.5 GB的内存。 当退出Excel,它崩溃(与“Excel不再工作了”的消息),并进程持续,所以我不得不杀死他们手动。