VBA Excel SendKeys 宏

Posted

技术标签:

【中文标题】VBA Excel SendKeys 宏【英文标题】:VBA Excel SendKeys Macro 【发布时间】:2015-06-17 18:38:24 【问题描述】:

我在工作表提取中有一些结果数据,我需要逐个单元格激活并按 Enter。 10 个单元格没问题,但我有超过 40 000 个。所以我写了一些宏

   Sub Refresh()
    Dim lastrow As Long
    lastrow = ActiveWorkbook.Worksheets("Extract").Range("Q" & rows.Count).End(xlUp).Row
        For j = 2 To lastrow
            Sheets("Extract").Activate
            Sheets("Extract").Range("Q" & j).Select
            Application.SendKeys "F2"
            Application.SendKeys "ENTER"
            DoEvents
        Next j
End Sub

而且它不起作用。我遇到 1004 错误应用程序定义或对象定义错误。

我做错了什么?

感谢您的帮助

编辑: 解决方案很简单。我没有激活工作表提取。 我在代码中添加了新行,一切正常。

感谢您的所有帮助。

【问题讨论】:

您在哪一行收到错误消息? 您想要(或必须)保持相同的程序吗?我们可以完全删除输入并让它循环通过您的事件吗?为什么必须按 Enter 才能使事件生效? 我在这里读到的:mrexcel.com/forum/excel-questions/… 是 application.sendkeys 可以通过在一个接一个地使用时增加一点延迟来帮助。也许你可以试一试?没有上下文就很难提供更多帮助! 如果到选定的单元格将被发送 F2 并移动到 Q 列中的下一个单元格就足够了 【参考方案1】:

试试这个:

Sub Refresh()
    Dim lastrow As Long
    Worksheets("Extract").Activate
    lastrow = Range("Q" & Rows.Count).End(xlUp).Row
    For j = 2 To lastrow
        Range("Q" & j).Select
        Application.SendKeys "F2"
        Application.SendKeys "ENTER"
        DoEvents
    Next j
End Sub

编辑#1:

此版本将删除“chatter:**”

Sub Refresh()
    Dim sOLD As Worksheet
    Set sOLD = ActiveSheet
    Application.ScreenUpdating = False
        Dim lastrow As Long
        Worksheets("Extract").Activate
        lastrow = Range("Q" & Rows.Count).End(xlUp).Row
        For j = 2 To lastrow
            Range("Q" & j).Select
            Application.SendKeys "F2"
            Application.SendKeys "ENTER"
            DoEvents
        Next j
        sOLD.Activate
    Application.ScreenUpdating = True
End Sub

【讨论】:

谢谢 :) 是的,这很好用。只有快速的问题。当我运行宏时,所有更改对我都是可见的(我看到提取表和那里发生的所有操作)。如何设置这个宏运行更不可见?我不想看到提取表中发生了什么。 @LukeJ 查看我的 EDIT#1 这很奇怪,但它只适用于前 40 行。范围内的其余部分已删除。【参考方案2】:

看起来您正在循环使用j,但在您的代码中,引用了i 行中的单元格。

For j = 2 To lastrow
    Sheets("Extract").Range("Q" & i).Select

它们需要更改以匹配,即将i更改为j

【讨论】:

是的菜鸟错误但仍然:范围类的选择方法失败 您是否激活了“提取”工作表?如果没有,您要么必须激活它,要么使用Application.GoTo 命令。 如果注释掉range后面的事件,是否还会发送Range错误?如果不是,是什么导致它发送错误?【参考方案3】:

我决定使用 Gary's Student 提供的宏的日子已经到来(直到现在我都在使用我的方法)。所以我再次运行宏,我很惊讶,但宏只适用于前 39 行。

当我评论这一行时

'Application.ScreenUpdating = False

它工作正常,但我看到宏是如何逐行运行的(我不想看到)

什么可能导致问题?

【讨论】:

以上是关于VBA Excel SendKeys 宏的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA:SendKeys 在某些计算机上失败

如何等待 Compact Repair - 访问 VBA

VBA - 使用 Sendkeys 复制粘贴代码

vba模拟键盘操作?

excel用vba宏处理一些日期时间

当关闭文档是excel vba为啥宏代码自动消失