VBA Выполнение 10 тысяч операций с одним макросом на основе sendkeys - PullRequest
0 голосов
/ 01 мая 2018

Я работаю с 20-летней базой данных, которой наше бизнес-подразделение не владеет и имеет ограниченный доступ, хотя она поддерживает макросы VBA для пользователей, которые выполняют много повторяющихся задач. Я работаю над способом автоматизации поиска большого количества «экранов» для конкретного текста, и я прошел большую часть пути, но ... не совсем. Есть много категорий (и подкатегорий) экранов, которые нужно искать, и в настоящее время я знаю, как искать их, используя sendkeys, которые вводят адрес экранов снова и снова, по порядку. У меня есть другой скрипт, который ищет текст на экранах и записывает адрес экрана любого экрана, который содержит определенный текст, так что эта часть меня не касается.

Моя текущая методология выглядит так:

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

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

и т.д.. где a01a01 идет последовательно до z99z99, и каждый экран содержит уникальную информацию (хотя большинство из них пустые), и во многих разделах есть пробелы. Например, некоторые переходят только к a10e99, прежде чем перейти к b01a01.

В идеале я бы хотел, чтобы мой код выглядел так:

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

и я мог бы либо добавить список действительных адресов в конце, либо заставить VBA ссылаться на таблицу Excel со всеми действительными экранами. Есть ли способ повторить один и тот же фрагмент кода точно так же, но только изменить ввод sendkeys без фактического копирования и вставки всего кода снова и снова с разными адресами? У меня, очевидно, нет опыта программирования, но подобное решение было бы чрезвычайно полезным. Спасибо!

1 Ответ

0 голосов
/ 03 мая 2018

У меня все работает, хотя метод все еще довольно схематичен. Я собрал воедино скрипт из кусочков кода, в основном благодаря комментарию Тима Уильямса. Программа действительно является версией 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 из библиотеки attachmate, ".gettext (row, column, length)", а не копировал и вставлял, сравнивая "gettext" (сохраненный в виде строки) с поисковым термином. (также хранится в виде строки из таблицы Excel). Однако это не оказало заметного влияния на скорость поиска. Я также добавил к нему некоторую логику, которая определяет, находится ли он на пустом экране (с использованием .gettext), и переходит на следующий непустой экран (адрес следующего непустого экрана отображается на всех пустых экранах, поэтому простой вопрос чтения и интерпретации этого условия). В общем, он делает свою работу, и мои коллеги (никто из нас не занимается ИТ и не имеют знаний о кодировании) весьма впечатлены. Следующим шагом будет очистка и обналичивание экранной информации в псевдо-базе данных, которую я создам для зеркалирования действующей базы данных, которую я могу легко сохранить в листе Excel и использовать вместо нее ctrl + f для поиска и, возможно, установить ее для обновления. Сам может быть раз в неделю или раз в месяц (поскольку база данных редко обновляется). Все это потому, что у нас нет процедуры для совместного доступа к базе данных, и никто не заботится о том, чтобы разработать ее.

...