Tag: 性能

使用VBA将2维数组卸载到Excel工作表中的最快方法是什么?

我有一个运行很长的例程,因为在工作表中逐个单元格地写入值。 我以为我会很聪明,首先将所有内容加载到二维数组中,然后迅速将其转储到Excel表格中。 目标是加快速度。 发现我不能做我想做的事情。 xlsheet.Range("C2") = MASTER_OUT 发现以上不起作用。 MASTER_OUT是一个二维数组,有34列和不同的行。 我希望我不必循环访问数组,并在工作表中放置数据单元格,因为这样不会节省任何时间。

在Excel VBA中迭代一个类

我为一个名为Terminal的实体创build了一个类模块。 我有一个方法来填充这个类,通过175个单独的工作表,并从特定的单元格中提取正确的数据。 这个过程非常快(大约2秒),但是当我尝试将这个数据写回到一个新的工作表时,它花费了更长的时间(45秒)。 看起来,这个过程应该像填充课程一样快,因为它永远不必离开工作表,但事实并非如此。 下面是我用来将数据写入工作表的过程,我是否忽略了导致它运行得太慢的原因? Application.ScreenUpdating = False Dim rowNumber As Integer Dim colNumber As Integer Dim terminalCode As String Dim terminal As clsTerminal rowNumber = 7 colNumber = 1 For Each terminal In terminals 'Add hyperlink to each terminal code Sheets("Terminal Summary").Hyperlinks.Add Anchor:=Cells(rowNumber, colNumber), Address:="", _ SubAddress:=terminal.terminalCode + "!A1", TextToDisplay:=terminal.terminalCode Sheets("Terminal Summary").Cells(rowNumber, colNumber + […]

Delphi – Excel – 如何加快运行速度

我正在为Delphi XE6中的Excel编写一个插件。 我不得不从一张纸复制到另一张纸。 我面临的挑战是我的手术比我想象的要长。 例如,要将500行(23列)从一张纸复制到另一张需要28秒左右… 部分挑战是我必须逐行处理。 我有一个INT数组,每行一个INT。 INT值告诉我是否需要复制该行… …for loop i … through entire array…. …if row I am interested in… // Set the Original Sheet Active MasterOrigSheet.Select; // Build my row numbers SourceRangeCell := 'A' + IntToStr(i); DestRangeCell := 'A' + IntToStr(DestRowNumber); // Copy the row from source to destination MasterOrigSheet.Range[SourceRangeCell, SourceRangeCell].EntireRow.Copy (NewSheet.Range[DestRangeCell, DestRangeCell].EntireRow); […]

提高MS Excel写作的性能

在从/向MS-Excel单元读取/写入数据时,我遇到性能问题。 我正在使用MS Excel 11.0对象库与VB.NET自动化。 目前,从Excel文件读取和写入需要花费太多时间。 (10分钟读取1000行:()。看起来单元格的读写方式并不是那么高效。是否有任何方式使用批量操作来读/写数据?

Excel列表 – 对象VBA性能错误?

我在使用列表对象(AKA Excel表格)的Excel应用程序中遇到问题。 我怀疑这可能是一个错误,但尽pipe我谷歌search我找不到任何参考。 我已经为我的应用程序开发了一个解决方法,但是我感兴趣的是如果任何人都可以提供任何洞察,为什么会发生这种情况。 注意:我在Windows Vista上使用Excel 2007。 设置如下:我有一个电子表格,其中保存的数据列表对象,VBA代码可以通过命令button启动; 此代码可能会对工作表上的任意数量的单元格进行多次编辑,因此在任何编辑之前,Excel的“计算”模式都设置为“手动”。 我遇到的问题是,如果当前活动的单元格在列表对象中,那么将计算模式设置为手动似乎没有任何效果。 所以,如果用户在同一个实例中碰巧有一个繁重的计算工作簿打开,那么VBA代码运行非常缓慢。 我实际上不得不拉我的申请,发现这是由活动单元格造成的; 我用这个场景的简单版本创build了一个新的工作簿,以确认我的应用程序没有某种forms的损坏。 我已经做了一些testing用例,下面是我发现的结果: 虽然看起来一般与计算有关,但当计算模式在“手动”和“自动”之间切换时,仍然存在时间差… 手动= 7.64秒 自动= 9.39秒 手动模式比自动模式less了20%。 但我的期望是他们会差不多,考虑到即使在手动模式下,问题似乎也是开始计算。 比较,当活动单元格不在列表对象,并且结果是巨大地不同… 手动= 0.14秒 自动= 3.23秒 现在,“手动”运行速度提高了50倍,“自动运行”显示计算时间不应超过3.2秒! 所以现在第一个testing看起来好像在手动模式下可能运行了两次计算,在自动模式下运行了近三次。 再次重复这个testing,这次是在没有任何单元格的计算公式的情况下,突然它似乎不是很糟糕, 活动单元格是List Object&Calc手动= 0.17秒 活动单元格是List Object&Calc是Automatic = 0.20秒 活动单元格为空并且Calc是手动= 0.14秒 活动单元格为空并且Calc自动= 0.18秒 这个速度还是比较慢,但是现在只有10-20%,不会让人觉察。 但是这确实表明这个问题必须以某种方式与计算相关,否则就应该和第一次testing一样长。 如果有人想创build这些testing来自己看,设置如下: 添加了List对象的新工作簿(不必链接到任何数据) 加一些计算公式(我刚做'= 1 * 1'重复了3万次) 写一个快速的VBA代码, (i)循环数百次单元格的简单编辑,(ii)并logging花费的时间 然后在更改列表对象和空单元格之间的活动单元的同时运行代码 我会非常感兴趣的是,如果有人能够解释为什么Excel会以这种方式行事,并且是一个错误,或者是否有一些与List对象有关的function,这些function实际上有一些真正的用途? 谢谢,斯图尔特

如何使用VBA将符号/图标格式化为单元格而不使用条件格式

我使用VBA代码来放置条件格式来覆盖大表中的值,我使用每个单元2个公式来确定要使用的3个符号中的哪一个。 我需要检查每个单元格的值与不同的单元格取决于列,因此,据我所知,我必须将我的条件格式规则分别在每个单元格,以确保公式是正确的每个。 这是因为条件格式不能使用相对地址,所以你必须给它每个单元格的确切地址…是正确的? 大量的条件格式化实例在很大程度上减慢了我的计算机。 是否可以将条件格式使用的符号放入单元格中而不使用条件格式? 也许有点像一个图像,但同时保留下面的单元格值,可以使用条件格式。 下面我给出了我用来把条件格式化的代码。 很感谢任何forms的帮助!! Dim AIs As Range Dim rng As Range Dim cl As Range Set AIs = ActiveSheet.Range("Table") For Each cl In AIs.Columns For Each rng In cl.Cells rng.FormatConditions.AddIconSetCondition rng.FormatConditions(rng.FormatConditions.Count).SetFirstPriority With rng.FormatConditions(1) .ReverseOrder = False .ShowIconOnly = True .IconSet = ActiveWorkbook.IconSets(xl3Symbols2) End With With rng.FormatConditions(1).IconCriteria(1) .Icon = xlIconYellowExclamationSymbol End […]

构build一个用于多键查找的快速Excel VBA UDF

我在一个工作簿中有几个相当大的数据表,需要使用Excel用户定义的函数来查找这些表中的数据。 我需要能够提供可变数量的键列和键值来search,并且函数需要find第一个匹配的行,然后使用此偏移量在相应的数据列中查找值。 有点像VLOOKUP的多键版本。 我知道你可以创build一个单一的键,由第1栏中的各个键组成,但是我想避免这样做。 我已经创build了这个函数的几个版本,到目前为止最好的版本工作正常,除了它很慢 ! 我的一个表格是接近9000行11列,我正在使用一个6字段的键。 我有大约18000次这个公式,重新计算工作表大约需要3分钟(我计算出有9.7亿个计算公式,所以当然会很慢)。 它使用了Evaluate()和我所见过的许多解决scheme。 代码如下: Function KeyLookup(datatable As Variant, datacol As String, _ key1table As Variant, key1 As String, _ Optional key2table As Variant, Optional key2 As String, _ Optional key3table As Variant, Optional key3 As String, _ Optional key4table As Variant, Optional key4 As String, _ Optional key5table As […]

暂停VBA并重新运行会导致更快的执行

我们有一个macros观的分析,因为我们希望能够看看这个过程,由于这个原因超出范围,我们被迫在macros中使用Activate和Select 。 我和我的同事都知道使用这种方法的缺点。 同时,testing显示编码和避免select和激活不是主要原因。 在其中一个子模块中 ,我在下面发布它的(伪)代码,我们基本上从表单中获取数据并将其复制到另一个模块中。 问题 问题是这个过程是如此缓慢,但是当我暂停macros( Esc )时,点击debugging,逐步( F8 ) for-loop一个或两个步骤,再次运行( F5 )它运行得更快。 这不会发生在我的for循环或特定工作表的具体步骤,所以没有任何关系我的数据和它的结构。 问题:这有什么可能的原因? 暂停/步骤运行是否导致内存清除或其他可能的情况使其运行得更快? 我怎样才能解决这个问题(让它运行得很快而不需要暂停,等等)? 重要的提示 如上所述,使用“ Select和“ Activate不是减慢过程的主要原因。 我很抱歉发布这个,但需要让你知道我知道如何使用显式选项,设置范围,设置值而不是复制等。我已经改变了我的代码,以避免select,看看是否能解决问题,但情况并非如此。 它仍然缓慢地运行,直到停顿,再次踏入并跑步。 如果您仔细查看问题并说明问题背后的原因,我将不胜感激。 或者至less让我知道为什么这个,我的意思是这个特定的问题,将暂停和再次运行后,正在发生,为什么它与Select/Activate 。 这是整个运行程序的一个更大的主要模块的一部分,但这是导致问题的部分。 我在主模块中使用了一些优化技术。 Sub Copy_ModelInputs(RootDir, FileName, TranID, ModOutDir, Angle, x, y, Method, TypeN) 'For each 150 storms, step through model event tabs and copy into runup tabs FileName […]

VBA ScreenUpdate和效率

我创build了一个“驱动程序”电子表格,用于控制(打开并运行等)其他工作簿上的macros。 由于我正在使用的文件非常大,不能进一步修改,因此我要求效率。 我读过应用程序屏幕更新设置为false帮助。 我已经将驱动程序电子表格屏幕更新设置为false(一旦整个过程完成,则返回true)。 但是,当我运行驱动macros,屏幕会定期更新(看起来像打开另一个子/macros/工作表时更新屏幕)。 驱动程序打开的其他子/macros/工作簿也会在启动时将屏幕更新设置为false,并在最后返回true。 除了驱动程序之外,是否可以将屏幕更新设置为false(而不是在完成时还原为true)? 我一直在阅读,我必须始终回到真实…所以这让我担心。

VBA嵌套循环效率

我正在试图find在VBA中执行任务的最快方法。 目前,我把它写成一个嵌套for循环,可以是非常缓慢的。 我循环了一个唯一的数字列表,并将它们与不同列表中的数字进行匹配。 如果我得到一个匹配,我将信息存储在一个multidimensional array中,因为可以有多个匹配,我想跟踪所有这些。 不幸的是,这意味着当使用for循环,如果只有1000个唯一的数字和5000个数字来寻找匹配我的循环可以最终迭代1000 * 5000 = 5000000次。 正如你所看到的,这可能会很快造成问题。 我问是否有更好的方法来处理这个问题,而留在VBA。 我已经做了所有的窍门,如设置screenUpdating到虚假和计算到manaul。 这是我的代码: For x = 0 To UBound(arrUniqueNumbers) Dim arrInfo() As Variant ReDim Preserve arrInfo(0) If UBound(arrInfo) = 0 Then arrInfo(0) = CStr(arrUniqueNumbers(x)) End If For y = 2 To Length UniqueString = CStr(arrUniquePhoneNumbers(x)) CLEARString = CStr(Sheets(2).Range("E" & y).Value) If UniqueString = CLEARString […]