VBA使用单个sendkeys驱动的宏

时间:2018-05-01 16:18:56

标签: excel vba excel-vba sendkeys

我正在使用一个20年历史的数据库,我们的业务部门不拥有这个数据库并且访问权限有限,但它确实支持那些执行大量重复性任务的用户的VBA宏。我正在研究一种自动搜索特定文本的大量“屏幕”的方法,我已经完成了大部分工作但是......并不完全。有许多类别(和子类别)的屏幕需要搜索,目前我只知道如何使用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表。有没有办法重复相同的代码段完全相同但只更改sendkeys输入而不实际复制和粘贴整个代码一遍又一遍地使用不同的地址?我显然没有编程背景,但这样的解决方案会非常有用。谢谢!

1 个答案:

答案 0 :(得分:0)

我已经完成了所有工作,但这种方法仍然非常粗略。我在这里和那里拼凑了一些代码的脚本,主要归功于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个屏幕,与人类相当或略慢,但在很长一段时间内,它肯定更快,更容易更准确。

我的下一步是重建它,它会刮擦文本字段并将其与搜索词本身进行比较,而不是将每个循环中大部分时间的所有副本粘贴废话。

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