1

我有一个与这个非常相似的问题,我有:

  1. 创建了一个带有迷你图的工作表,它引用了一个动态范围
  2. 我有一个宏,它通过循环更新一些单元格(因此每次循环迭代都会改变迷你图)
  3. 复制大范围(包括迷你图和其他命名范围)
  4. 将此范围粘贴到第二张纸中(我无法弄清楚如何以其他方式进行操作,因此我使用该Range.CopyPicture方法并将范围作为图片粘贴到第二张纸上,但是如果您知道粘贴的方法迷你图本身,这样当我再次更新 raneg 时它不会更新,请告诉我)

现在,我的问题是,如果我在调试模式下单步执行代码,一切正常,但是如果我让宏自动运行,迷你图永远不会更新(所以它总是看起来像第一次运行宏) .

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

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 个相同的迷你图。并且如果我在调试模式下单步执行它(或者甚至设置断点然后F5在 VBA 中运行,那么它就可以工作了!)再次,我查看了上面提到的问题并尝试了它的技巧无济于事....任何人都知道如何让它适用于迷你图????

非常感谢!!!

4

1 回答 1

1

当您不断进行涉及 excel/系统来处理多个事件的重复性练习时,建议使用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是首选,否则您最终会不必要地减慢您的代码。

于 2014-09-11T14:29:02.787 回答