【问题标题】:How to optimize this simple but horrible implementation?如何优化这个简单但可怕的实现?
【发布时间】:2011-07-27 12:40:22
【问题描述】:

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

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

我有:

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

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

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

我认为一定有一些与自动填充相关的东西可以解决问题。

请帮忙!!

【问题讨论】:

  • 我正在做很多复杂的任务,所有这些都是在几秒钟内完成的,只有这个简单的任务需要几分钟。请帮忙!
  • cell.Value = cell.Value --- 这行是干什么用的?
  • 这条线基本上..保留了单元格的值并在此过程中丢失了公式..它就像一个摆脱公式的巧妙方法!
  • 这种行为看起来很奇怪,你可能是对的,但 x = x 通常不会以任何方式改变 x,我想好的 ole' VBA 是不同的。
  • 嗯,你不是完全正确,也不是完全错误。它就像无法解释它是如何发生的。你需要阅读 API !

标签: .net vb.net excel vba


【解决方案1】:

如果你碰巧知道你的范围的确切地址,或者你可以得到它(也许使用 getRange()?),这似乎对我从单元格中删除一个公式同时保持结果有效:

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

【讨论】:

  • 这个真的看起来很有趣很简单。让我试试,然后我会告诉你结果..!
  • 我不知道该怎么感谢你.. 但它起作用了.. 就像一个魅力.. !
  • 好的,@PaulR!简单,做的工作;)
  • 这和问题中的陈述很容易导致开发人员的大脑崩溃......好'ol Excel。
  • 另外,我建议使用.Formula = .Value 而不是.Value = .Value。这更有意义。延迟是由每次调用 Excel 引起的。如果您最小化对 Excel 的调用,它将运行得更快。 PaulR 的代码中只有六个对 Excel 的调用(工作表、范围和值各两次。)我总是从 Excel 中复制信息块,处理它们,然后将结果作为一个块返回,以防止这些冗长的延迟。
【解决方案2】:

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

根据this forum post 可以这样做:

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

【讨论】:

  • 我会尽力让你知道结果!!
  • +1,这始终是 Excel 中性能问题的有效解决方案。
【解决方案3】:

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

Sub NoScreenRePainting()
    Application.ScreenUpdating=False

    'Your code here.

    Application.ScreenUpdating=True
End Sub

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

【讨论】:

  • 这似乎是加速整个应用程序的好技巧.. !!谢谢..如果你有更多这样的..请在这里发帖!
  • 确实是我发现的,如果它对您最有帮助,请将其标记为答案。我所知道的唯一其他人在link提供的详细信息
  • +1,这始终是 Excel 中性能问题的有效解决方案。
【解决方案4】:

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

Dim oRange As Excel.Range

Set oRange = getRange()

oRange.Copy
oRange.PasteSpecial xlPasteValues

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

【讨论】:

  • 这种方式对用户来说很粗鲁——它使用剪贴板,把里面可能有的东西扔掉
  • 同意,@尼克。但这是我脑海中的选项(正如我所提到的)。我意识到我们的大多数 SO VBA 问题都与特定的自制/小型办公室应用程序有关。
【解决方案5】:

选择值的范围不是更容易吗,Copy 然后Paste Special / Values?这将公式替换为值,并且应该或多或少是瞬时的。

【讨论】:

  • 请解释一下..这似乎是我的问题的解决方案.. !!
  • +1 Stuart,@Yugal 照常进行 copy,然后从菜单中选择 Paste Special(这取决于您的 Excel 版本,但它会接近标准的Paste)。 Paste Special 为您提供了一个弹出窗口,您应该从中检查 Values 选项,如以下屏幕截图所示:excelfunctions.net/image-files/Paste_Special_Options.PNG
【解决方案6】:

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

Public Sub RemoveFormulas()

    Dim RangeWithFormulas As Range

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

    RangeWithFormulas.Copy

    RangeWithFormulas.Range("A1").PasteSpecial xlPasteValues

End Sub

【讨论】:

  • 你好@Adam,我相信我们的解决方案几乎相同......不是吗?
  • 是的,你可以这么说。你想让我删除我的吗?
  • 别担心@Adam,让我们下次查看其他答案以避免重复信息。重要的是你也在努力提供帮助。 ;)
【解决方案7】:

我应该建议你选择所有带有公式和粘贴值的单元格,试试这个:

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

简洁明了的结果。

【讨论】:

  • 好吧,cell.Value = cell.Value 是耗时的语句.. 这就是我们必须优化的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2012-09-05
  • 2020-06-21
  • 2021-12-04
相关资源
最近更新 更多