【问题标题】:How to copy-paste from DOS application to Excel using SendKeys?如何使用 SendKeys 从 DOS 应用程序复制粘贴到 Excel?
【发布时间】:2013-02-23 08:06:55
【问题描述】:

我正在尝试模拟这个动作:

  • 激活另一个应用程序,
  • 发送按键 ctrl+c,
  • 返回 Excel,
  • 发送按键 ctrl+v

并在单元格中保存该值。

这是一个 DOS 窗口风格的应用程序,所以按键是管理它的唯一方法。

我设法激活并在那个 DOS 风格的应用程序中输入了诸如 ENTER 之类的击键,但是当我尝试 ctrl+C 时,它什么也没看到。

我尝试在 Excel VBA 中模拟它:

Range("E7").Select
SendKeys "^c"
Range("G7").Select
SendKeys "^v"

不复制 E7 值,但 G7(粘贴目标)突出显示,就好像它被选中进行复制一样。

注意:我不是试图将内容从 Excel 复制到 Excel,而是使用 Excel 执行击键。

【问题讨论】:

  • 你能发布一些代码吗?您确定您为要发送的击键使用了正确的发送键命令吗? (在这里列出 --> autoitscript.com/autoit3/docs/appendix/SendKeys.htm)。请注意,Enter 键是 {ENTER},但并非所有键都那么直观(例如,{LCTRL} 表示左 ctrl 键)。
  • 而不是SendKey "^c",只需使用Range("E7").Copy
  • 问题解决了吗?我遇到了同样的问题。

标签: excel vba sendkeys


【解决方案1】:

我今天遇到了同样的问题。

我在向应用程序发送 CTRL-C 后稍等片刻就解决了这个问题。如果您立即执行另一个脚本行,似乎没有任何内容被复制。

SendKeys "^c"
WScript.Sleep 100 ' wait a bit after CTRL+C (otherwise nothing is copied)

事实上,当切换到另一个应用程序并发送 CTRL+V 时,似乎会发生同样的问题。 再次,我通过等待解决了它:

AppActivate "Microsoft Excel"
WScript.Sleep 100 ' wait a bit after making window active
SendKeys "^v"

【讨论】:

  • WScript.Sleep 不适用于 VBA。
  • @DanielCook 谢谢,我不知道这一点。我确实在使用VBS。此处介绍了 VBA 中的睡眠:stackoverflow.com/questions/469347/…
  • 是的,添加 WScript.Sleep 有助于我注意到这一点,但不幸的是,即使添加了 WScript.Sleep 500(半秒)的延迟,有时它也会在 10 次测试中出现一次错误,并且“^c”会产生“c "而不是做'复制'。除此之外,我什至尝试过 "^(c)" 但结果相同,所以如果有人有更好的解决方案,请分享
  • @hi0001234d - 你得到解决方案了吗?对我来说同样的问题。当我尝试sendkeys "^v" 时,它只粘贴“v”而不是粘贴。
  • 实际上我没有得到任何标准解决方案。但是我的要求发生了变化,所以我必须粘贴的内容现在可以作为字符串变量编程,所以我只需将该变量发送到直接写在文本上。棘手的解决方案!
【解决方案2】:

问题是复制和粘贴需要一些时间,而 VBA 并没有等待它。

首先,您需要指定发送密钥方法的第二个参数,即“等待”。将其设置为真。因此,VBA 执行一直在等待,直到发送密钥完成。

其次,您需要等到将数据复制到剪贴板的过程完成。 sendkeys 中的“等待”没有这样做,因为它不是关于通过 VBA 发送密钥,而是关于 Windows 使用剪贴板。为此,请使用我的函数 IsCopyingCompleted。

这是 final 的样子:

SendKeys "^a", True 'Select all
SendKeys "^c", True 'Copy
Do
    DoEvents
Loop Until Me.IsCopyingCompleted()
YourSheet.Paste

Function IsCopyingCompleted() As Boolean
'Check if copying data to clipboard is completed

    Dim tempString As String
    Dim myData As DataObject

    'Try to put data from clipboard to string to check if operations on clipboard are completed
    On Error Resume Next
    Set myData = New DataObject
    myData.GetFromClipboard
    tempString = myData.GetText(1)
    If Err.Number = 0 Then
        IsCopyingCompleted = True
    Else
        IsCopyingCompleted = False
    End If
    On Error GoTo 0

End Function

【讨论】:

    【解决方案3】:

    我遇到了同样的问题 - 我开发了代码,它在我的计算机上运行 - SendKeys "^v"...但它在其他用户的计算机上不起作用!我正在尝试一切......延迟,欣赏,从Excel访问,让用户检查各种设置,selection.paste......不好。最后我注意到不同的语法......我们使用的是相同的办公版本,我不确定 Windows。但是我输入了 6 种不同的语法,如果失败则跳过它......发送带有大写 v 的键,括在花括号中,花括号中的每个组件用加号分隔,等等。它工作!其中 2 个命令将 ^V 放在 Outlook 正文中...我删除了这 2 个,我是金色的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多