如何推迟表单渲染,直到操作结束?
我正在使用Excel来graphics化地检查embedded式遥测数据。 为此,我使用embedded式软件将内存arrays以hex格式转储为文本文件。 然后我使用Excel的“文本导入向导”导入文件的内容,使用剪切和粘贴。
在Excel中,我使用VBAmacros将hexstring转换为十进制值,然后再操作和绘制它们。 对于每个源hex单元格,我有一个“图像”单元格包含hex到十进制翻译公式。
数组由几百个到几千个数值组成。 因此,当在“input”区域上导入/粘贴hex数据时,使用macros自动计算“输出”区域。 问题是Excel在每次计算后刷新表格(显然)。 我发现这个问题 ,解决了执行macros期间的更新。 然而,我的工作表做了数百个简单而短暂的计算,所以这不是有效的。
在“粘贴”操作结束之前,如何防止更新表单? 请注意,我可以禁用自动更新全部。 但是,我确实希望保持此选项启用,除了特定的文本导入操作。
更新 :这是我使用的macros:
Type MyHex Lng As Long End Type Type MySingle sng As Single End Type Function Hex2Ieee754(i As Long) Dim h As MyHex Dim s As MySingle h.Lng = i LSet s = h Hex2Ieee754 = s.sng End Function
把你的整个代码放进去
Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Application.EnableEvents = False ' .... your code goes here Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Application.EnableEvents = True
但是,在这样做之前,请先彻底testing您的代码,因为如果执行时间过长,禁用事件会使您的应用程序无法使用。
更新:
代码的瓶颈是单元格更新的方式,而不是内部计算本身。 以下步骤可以用于
- 在单个操作中从电子表格中提取所有值
- 通过一次操作将所有计算值推送到电子表格
码:
Dim InputRng as Range Set InputRng = ActiveSheet.Range("A1:A10") Dim InputVar() as Variant InputVar = InputRng ' All data fetched in a single operation 'Now InputVar(1,1) contains the top left element of the range ie content of A1 cell 'You may use code such as Dim LngVariable as Long LngVariable = CLng(InputVar(1,1) + 23.232) ' etc..... Dim OutputVar() as Variant ReDim OutputVar(1 to 10, 1 to 1) ' You need to output a range of 10 rows and 1 column 'Set elements of OutputVar to what you would like your Output range to be ' OutputVar(1,1) will be the top left element, etc. Dim OutputRng as Range Set OutputRng = ActiveSheet.Range("B1:B10") OutputRng = OutputVar ' All data pushed onto sheet in a single operation
这个代码将比你原来的代码快几个数量级。 你可以修改这个以适应你的程序逻辑。