VBA - 在VBA中不更新动态范围的迷你图

时间:2014-09-11 13:52:47

标签: excel vba excel-vba sparklines

我有一个与this one极为相似的问题,我有:

  1. 创建了一个带有迷你图的工作表,该工作表引用了动态范围
  2. 我有一个宏,通过一个循环,更新一些单元格(因此每次循环迭代都会改变迷你图)
  3. 复制大范围(包括迷你图和其他命名范围)
  4. 在第二张纸上粘贴此范围(我无法通过其他任何方式弄清楚如何操作,因此我使用Range.CopyPicture方法并将范围作为图片粘贴到第二张,但如果您知道粘贴迷你图本身以便在我再次更新raneg时不会更新它,请告诉我们知道)
  5. 现在,我的问题是,如果我在调试模式中单步执行代码,一切都运行良好,但如果我让宏自动运行,迷你线永远不会更新(所以它总是看起来像第一次宏运行)。

    作为我的问题的一个简单示例,假设我在工作表中有这个:

    Cells A1-A10: 
          1,2,3...,10 (what I'll use for the sparkline range)
    
    Cell Named "StartCol": 
          =RANDBETWEEN(1,9)
    
    Cell Named "Width":    
          =RANDBETWEEN(1,10-StartCol)
    
    Dynamic range Named "SparkRange":  
          =OFFSET(Sheet1!$A$1,0,StartCol-1,1,Width)
    
    Cell With a SparkLine within a larger range Named "ToCopy"
    
    A Second Sheet Named "OutPut" with a named range "Output" where we'll start pasting to
    

    现在,简单的VBA代码:

    Sub Test()
        Sheets("Output").Select
    
        For i = 1 To 10
            Application.Calculate   ' Probably not needed, but putting it in to be safe
            Sheets("Sheet1").Range("ToCopy").CopyPicture
    
            Sheets("Output").Range("Output").Select
            Sheets("Output").Paste
            Sheets("Output").Names("output").RefersTo = Sheets("Output").Range("Output").Offset(Sheets("Sheet1").Range("ToCopy").Rows.Count + 2)
        Next i
    End Sub
    

    现在,这应该粘贴在10个不同的迷你图中,但它相当于粘贴同一个的10个副本。如果我在调试模式中单步调试(或者甚至设置断点然后在VBA中点击F5,那么它可以工作!) 再次,我看了上面提到的问题并尝试了它的技巧无济于事....任何人都知道如何使这个工作的迷你线????

    非常感谢!!!

1 个答案:

答案 0 :(得分:1)

当您不断进行涉及excel / system处理多个事件的重复练习时,建议使用DoEvents将它们分开。

例如,在您的情况下,您需要给Excel足够的时间将图像复制到剪贴板中,然后将其粘贴回来。

例如

Sheets("Sheet1").Range("ToCopy").CopyPicture

Doevents '<~~ This gives enough time for the pic to be placed in Clipboard

Sheets("Output").Paste

DoEvents '<~~ This gives enough time for the pic to be pasted

在更多技术术语中,DoEvents放弃执行宏,以便操作系统可以处理其他事件。 DoEvents函数将控制权从应用程序传递给操作系统。

注意:明智地使用DoEvents是首选,否则您最终会不必要地放慢代码速度。