等待剪贴板包含数据
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()
以等待图像格式可用,然后才退出函数并继续运行。
我正在构建一个将链接图像转换为嵌入图像的过程 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()
以等待图像格式可用,然后才退出函数并继续运行。