Tag: 优化

Excel索引与偏移/间接 – 我不明白为什么偏移/间接在这种情况下更快

我有一个工作簿设置第一个选项卡包含参数列表。 每一列是不同实例的一组参数。 然后我有一个实例的模板工作表,用户使这个模板的许多副本。 模板所做的一件事就是dynamic地从第一张表中拉出参数。 用户input一个列号(1到n),该列中的参数从第一个工作表拉出,用于该实例。 然后该实例使用这些参数运行数十万行计算。 参数表 示例实例 我的问题似乎与波动有关。 对于大量实例,如果使用偏移或间接来获取参数,则工作簿中任何单元格中的任何更改都会导致在每个实例工作表上重新检索参数,因此每次都会重新计算每个工作表的整体,每当进行更改时,将工作簿冻结约3秒钟。 我以为我可以通过使用索引来减轻这一点。 每个工作表参数引用包含该参数的第一个工作表上的行,并将列号作为索引参数提取。 这解决了导致重新计算的任何变化的问题。 现在只有参数范围的变化会导致重新计算,但由于某些原因,情况会更糟糕。 现在,更改工作簿中的随机单元格不再导致整个事情在重新计算时冻结3秒钟,但更改参数范围中的相关单元格将导致每个表单重新计算,并需要大约10秒钟。 为什么这个方法慢得多。 在技​​术上应该像以前一样做相同的事情,只是在相关参数改变的时候。 有什么办法可以设置它,以便当前面板上的参数发生变化时,只有受该参数影响的纸张才会重新计算? 解决scheme 我考虑过涉及VBA的复杂解决scheme,于是复制模板实例监视其“实例号”单元。 当它被更改时,VBA代码可以将相应的参数复制到工作表并在这里硬拷贝这些值。 我还需要VBA监视主参数表上的更改事件。 当任何东西被改变时,它将不得不检查列号,迭代所有的模板,并重新复制值,如果该实例编号被引用。 我想避免这个解决scheme的原因是使VBA保持不变,但如果没有办法让excel的重新计算变得更加智能化,那么可能有必要这样做。

Excel VBA高效获取文件名function

我需要在Excel 2010中使用VBA从远程服务器上的文件夹获取文件集合。我有一个可以工作的function,在大多数情况下,它可以完成这项工作,但是远程服务器经常有可怕的, 可怕的networking性能问题。 这意味着循环说300文件将他们的名字到一个集合可能需要10分钟,该文件夹中的文件数量可能会增长到数千,所以这是行不通的,我需要一种方法来获取所有的文件名在一个单一的networking请求,而不是循环。 我相信它连接到远程服务器是花费时间,所以一个请求应该能够获得一个通过所有的文件很快。 这是我现在的function: Private Function GetFileNames(sPath As String) As Collection 'takes a path and returns a collection of the file names in the folder Dim oFolder As Object Dim oFile As Object Dim oFSO As Object Dim colList As New Collection Set oFSO = CreateObject("Scripting.FileSystemObject") Set oFolder = oFSO.GetFolder(folderpath:=sPath) For Each oFile […]

基准VBA代码

什么被认为是最准确的基准VBA代码(在我的情况下,我在Excel中testing代码)? 除了下面的2之外,还有其他的用于testing代码的技术吗?如果是,那么这个方法的优缺点是什么? 这里有两种stream行的方法。 第一: 计时器 Sub TimerBenchmark() Dim benchmark As Double benchmark = Timer 'Do your code here MsgBox Timer – benchmark End Sub 和Tick (我认为这是最准确的): Option Explicit Private Declare Function GetTickCount Lib "kernel32" () As Long Sub TickBenchmark() Dim Start As Long Dim Finish As Long Start = GetTickCount() 'Do your code here Finish […]

屏幕更新的效果

我一直在玩围绕测量代码执行时间来衡量执行我的脚本本地和我的服务器之间的差异。 有一次,我忘了禁用screen updating ,并感谢我对闪光灯不敏感之前,更详细地考虑它: 当我第一次开始使用VBA我总是认为它只是被使用,所以它不会吓着最终用户认为自己的电脑即将崩溃。 当我开始更多地阅读提高代码的效率时,我明白了这是什么原因,但screen updating对于代码执行时间有多大影响?

使用Interop从Excel文件中删除空行和列的最快速的方法

我有很多包含数据的Excel文件,它包含空行和空列。 如下图所示 我正在尝试使用互操作从Excel中删除空行和列。 我创build了一个简单的winform应用程序,并使用下面的代码,它工作正常。 Dim lstFiles As New List(Of String) lstFiles.AddRange(IO.Directory.GetFiles(m_strFolderPath, "*.xls", IO.SearchOption.AllDirectories)) Dim m_XlApp = New Excel.Application Dim m_xlWrkbs As Excel.Workbooks = m_XlApp.Workbooks Dim m_xlWrkb As Excel.Workbook For Each strFile As String In lstFiles m_xlWrkb = m_xlWrkbs.Open(strFile) Dim m_XlWrkSheet As Excel.Worksheet = m_xlWrkb.Worksheets(1) Dim intRow As Integer = 1 While intRow <= m_XlWrkSheet.UsedRange.Rows.Count If […]