如何优化这个简单但可怕的实现?

时间:2011-07-27 12:40:22

标签: .net vb.net excel-vba vba excel

我基本上想要从单元格中删除公式,但希望保留计算值。

所以,我很容易实现它并且效果很好,但非常慢。(1800个单元约2分钟)

我有:

Dim col As Excel.Range = getRange()
For Each cell In col
    cell.Value = cell.Value
Next

我尝试对第一个单元格执行此操作,然后自动填充其余单元格,但是将第一个单元格的值复制到列中的其余单元格。

那么,我该怎样做才能让它变得快......

我认为必须有一些与自动填充有关的东西可以解决这个问题。

请帮助!!

7 个答案:

答案 0 :(得分:8)

有时Excel会在更改完成后重新计算整个工作表。在执行此类操作时暂时禁用自动重新计算可以显着缩短执行时间。

根据this forum post ,可以通过以下方式完成:

Application.Calculation = xlManual 
 ' code here
Application.Calculation = xlAutomatic

答案 1 :(得分:8)

如果你碰巧知道你的范围的确切地址,或者你可以得到它(可能使用getRange()?),这似乎对我来说从细胞中删除一个公式同时保持结果:

Worksheets("Sheet1").Range("A1:F15").Value = Worksheets("Sheet1").Range("A1:F15").Value

答案 2 :(得分:6)

我注意到在玩Excel VBA时,除了几行代码之外的任何东西都可以拖动,但到目前为止,“运行速度”的最大增幅是;

Sub NoScreenRePainting()
    Application.ScreenUpdating=False

    'Your code here.

    Application.ScreenUpdating=True
End Sub

其他建议:http://www.ozgrid.com/VBA/SpeedingUpVBACode.htm

答案 3 :(得分:4)

正如@Stuart所提到的......将Special粘贴为值......

Dim oRange As Excel.Range

Set oRange = getRange()

oRange.Copy
oRange.PasteSpecial xlPasteValues

请注意,使用剪贴板可能会很棘手......希望其他人知道(快速)方法不使用剪贴板。

答案 4 :(得分:3)

选择值范围Copy然后Paste Special / Values会不会更容易?用值代替公式,应该或多或少是瞬时的。

答案 5 :(得分:3)

确保所有公式都计算了它们的值,然后复制并粘贴为值以删除公式并仅保留计算值。这是一个例子:

Public Sub RemoveFormulas()

    Dim RangeWithFormulas As Range

    Set RangeWithFormulas = ThisWorkbook.Sheets("Test").Range("A1:A1800")

    RangeWithFormulas.Copy

    RangeWithFormulas.Range("A1").PasteSpecial xlPasteValues

End Sub

答案 6 :(得分:-2)

我建议您选择包含公式和粘贴值的所有单元格,试试这个:

Sub RemoveFormula()
Dim cell As Range
    'Excel function to select cells with formulas
    Selection.SpecialCells(xlCellTypeFormulas, 23).Select 

    For Each cell In Selection
        cell.Value = cell.Value
    Next cell
End Sub

清洁简单的结果。