3

我正在尝试模拟此操作:

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

并在单元格中具有该值。

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

我设法激活并将诸如 ENTER 之类的击键输入到该 DOS 风格的应用程序中,但是当我尝试ctrl+时C,它没有看到做任何事情。

我尝试在 Excel VBA 中模拟它:

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

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

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

4

3 回答 3

2

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

我在将 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"
于 2013-10-16T13:54:06.307 回答
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
于 2019-10-15T09:31:14.423 回答
0

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

于 2018-11-28T22:57:27.133 回答