VBA 使用单个 sendkeys 驱动的宏执行数千次操作

VBA Performing 10s of thousands of actions with single sendkeys-powered macro

我正在使用一个已有 20 年历史的数据库,我们的业务部门不拥有该数据库并且访问权限有限,但它确实支持 VBA 宏,供执行大量重复性任务的用户使用.我正在研究一种自动搜索大量 "screens" 以查找特定文本的方法,并且我已经完成了大部分工作,但......不完全是。有许多类别(和子类别)的屏幕需要搜索,目前我只知道如何使用 sendkeys 搜索它们,这些屏幕一遍又一遍地输入屏幕地址。我有另一个脚本可以搜索屏幕的文本并记录包含特定文本的任何屏幕的屏幕地址,以便我不关心该部分。

我目前的方法如下:

do thing
ibmCurrentScreen.SendKeys ("a01a01")
do thing

do thing
CurrentScreen.SendKeys ("a01a02")
do thing

等其中 a01a01 按顺序一直到 z99z99,每个屏幕都包含独特的信息(尽管其中大部分是空的)并且很多部分都有间隙。例如,有些人在进入 b01a01 之前只进入 a10e99。

理想情况下,我希望我的代码如下所示:

do thing
CurrentScreen.SendKeys ("a01a01")
do thing
repeat for each screen address

我可以在末尾添加一个有效地址列表,或者让 VBA 引用具有所有有效屏​​幕的 excel table。有没有一种方法可以完全相同地重复同一段代码,但只更改 sendkeys 输入,而无需使用不同的地址一遍又一遍地复制和粘贴整个代码?我显然没有编程背景,但像这样的解决方案会非常有帮助。谢谢!

我已经完成了所有工作,尽管该方法仍然很粗略。我从零星的代码中拼凑出一个脚本,这主要归功于 Tim Williams 的评论。该程序确实是 Attachmate 2014 的一个版本,因此该资源及其各种指南非常有用。

简而言之,我的解决方案是这样的:

Private Sub CommandButton1_Click()
    Dim app As Attachmate_Reflection_Objects_Framework.ApplicationObject
    Dim frame As Attachmate_Reflection_Objects.frame
    Dim terminal As Attachmate_Reflection_Objects_Emulation_IbmHosts.IbmTerminal
    Dim view As Attachmate_Reflection_Objects.view
    Dim screen As Attachmate_Reflection_Objects_Emulation_IbmHosts.IbmScreen
    Dim cellData As String, w As String, x As String, y As String, z As String
    Dim rCode As ReturnCode
    Dim row As Integer
    row = 3

    Initialization stuff
 Do
        'Get the data from Excel
        w = Worksheets("Calculator").Cells(row, 4).Value
        x = Worksheets("Calculator").Cells(row, 5).Value
        y = Worksheets("Calculator").Cells(row, 6).Value
        z = Worksheets("Calculator").Cells(row, 7).Value

        'Put the data into the appropriate fields
        rCode = screen.PutText2(w, 22, 21)
        rCode = screen.PutText2(x, 22, 47)
        rCode = screen.PutText2(y, 22, 75)
        rCode = screen.PutText2(z, 23, 20)

        'Navigate and copy from the screens
        rCode = screen.SendControlKey(ControlKeyCode_Transmit)
        rCode = screen.WaitForText1(200, "4", 22, 4, TextComparisonOption_RegularExpression)
        screen.SelectAll
        screen.Copy
        rCode = screen.WaitForHostSettle(30, 100)
        rCode = screen.SendControlKeySync(ControlKeyCode_F3)

        'Increment the counter to the next row
        row = row + 1

        'Paste into worksheet
        With Worksheets("Data")
            Range("A1").Select
            .Paste
        End With

   Loop While Worksheets("Face").Range("D7").Value = "Searching..."

End Sub

然后,excel 使用基本的 IF 语句查看粘贴的文本并确定搜索词是否在其中。它每分钟经过约 40 个屏幕,这与人类相当或稍慢,但在很长一段时间内,它肯定更快,更容易更准确。

我的下一步是在它抓取文本字段的地方重建它,并将其与搜索词本身进行比较,而不是每次循环花费大量时间的所有复制粘贴废话。

编辑:几周后... 我使用 attachmate 库中的另一个非常有用的 vba 函数“.gettext(row, column, length)”进行了一些优化,而不是复制和粘贴,比较 "gettext"(存储为字符串)与搜索词(也存储为 excel 作品 sheet 中的字符串)。但是,它对搜索速度没有明显影响。我还向它添加了一些逻辑来检测它是否在空白屏幕上(使用 .gettext),并跳到下一个非空白屏幕(下一个非空白屏幕的地址显示在所有空白屏幕上,所以它是阅读和解释该条件的简单问题)。总而言之,它正在完成工作,我的同事(none 我们从事 IT 或具有编码知识)给我留下了深刻的印象。下一步将在我将构建的伪数据库副本中抓取和兑现屏幕信息以镜像实时数据库,我可以轻松地将其存储在 excel sheet 中并使用 ctrl+f 进行搜索相反,也许将其设置为每周或每月更新一次(因为数据库很少更新)。所有这一切都是因为我们没有共享数据库访问的程序,也没有人关心开发一个程序。