等待剪贴板包含数据

Wait for clipboard to contain data

我正在构建一个将链接图像转换为嵌入图像的过程 Excel:

for ws in wb.sheets
    count = ws.shapes.count
    for 1 to count
        'Get first shape from collection
        set shp = ws.shapes(1)

        'Store shape's position/size
        '...

        'Break link if it exists
        shp.CopyPicture
        ws.Paste
        shp.delete
        set newShp = ws.shapes(count)

        'Assign newShp, shp's old position/size
        '...
    next shp
next ws

有时代码会在第2行出错:

shp.CopyPicture
ws.Paste

错误 "Unable to execute method paste..."。当我 space 使用 DoEvents 复制和粘贴方法时也会发生这种情况,如下所示:

shp.CopyPicture
DoEvents
ws.Paste
DoEvents

然而在点击调试后,等待一两秒钟,然后再次按下播放,一切继续正常运行。

我怀疑 Excel 等待 CopyPicture 方法的时间不够长,无法完全占用剪贴板。假设是这种情况,我可以通过某种方式监视剪贴板并等待剪贴板数据已满吗?

我认为您可能只需要添加一个暂停,让剪贴板有时间填充剪贴板,然后再尝试访问它。

我使用的暂停程序如下:

Sub Pause(sec as Single) 
    Dim startTime as Single 
    StartTime=Timer 
    Do 
        DoEvents
    Loop While StartTime + sec > Timer 
End Sub

我可能会先停顿四分之一秒或半秒(即 Pause (0.25)),然后循环直到剪贴板准备就绪。

半秒应该足够了,虽然理想情况下你会在粘贴后从另一端触发你的程序,主动而不是重新主动。

我正在搜索类似的东西(API 调用剪贴板的正确语法),并遇到了这个线程。可能值得注意的是,当您将数据发送到剪贴板时,确实需要时间。

在使用旧的 IE.navigate 命令时,我想起了我过去使用的“忙时做事”。

总之,你怎么看这个。

SendKeys ("^c") '要复制的伪代码

跳跃点:

随机变量 = Clipboard.GetData

DoEvents '在剪贴板加载时将此数据强制放入某处的随机地址

If ClipBoard.GetData <> RandomVar Goto JumpPoint

[在这里施展魔法]

看到了吗?如果 RandomVar = ClipBoard 的当前状态,并且 Do Events 使 RandomVar 等于 SOMETHING referencable,那么当 ClipBoard 继续聚合数据时,它将与 RandomVar 不同。因此,Goto 将回退一个滴答声,本质上是“忙时做事”。

这只是我在没有看到完整代码或意图的情况下使用您已有的工具的思考过程。

是的,我的编码方法是亵渎神明的。我不在乎。祝你好运,我的阴暗面永远与你同在。

好久没问这个问题了。从那时起,我在这个领域的知识得到了增长。以后我会使用我的 stdClipboard class 的 xlShapeAsPicture 方法如下:

for ws in wb.sheets
    count = ws.shapes.count
    for 1 to count
        'Get first shape from collection
        set shp = ws.shapes(1)

        'Store shape's position/size
        '...

        'Break link if it exists
        set stdClipboard.xlShapeAsPicture = shp   '<<<---
        
        'Paste
        ws.Paste
        
        '...
    next shp
next ws

此解决方案的关键是在调用 shp.CopyPicture() 之后调用 poll IsFormatAvailable() 以等待图像格式可用,然后才退出函数并继续运行。