【问题标题】:VBA If Statement within For Each for EmulationFor Each 中的 VBA If 语句用于仿真
【发布时间】:2019-11-20 16:16:42
【问题描述】:

我需要更新 BlueZone 中的数千个 X 坐标。我正在使用 VBA 在 BlueZone VT 中输入键盘命令。不幸的是,没有“设置光标位置”命令,所以我仅限于使用“标签”将光标放在需要去的地方。

在坐标更新屏幕有两种可能性:6 或 7 个选项卡,具体取决于屏幕上是否存在 0。

例如:位置 241054 有一个 1 并且需要 7 个选项卡,位置 241051 有一个 0 并且需要 6 个选项卡才能到达 X 位置字段,以便我转储到我的变量中。

这是我的代码:

Sub FiXCoord_Loop()

'Must start at IMLOA screen

Dim bzhao As Object
Set bzhao = CreateObject("BZWhll.WhllObj")
bzhao.Connect ""

Dim myX As Integer
Dim res_check As Integer
Dim myLoc As Variant
'Dim res_check As Variant


myRange = ActiveSheet.Range("A2:A1000")
'myResRange = ActiveSheet.Range("D3")
myX = ActiveSheet.Range("E1").Value
res_check = ActiveSheet.Range("D3").Value

For Each myLoc In myRange


'end loop at blank cell
    If myLoc = "" Then
        Exit For
            End If

'Query location

bzhao.SendKey "Q"
bzhao.Wait 0.2
bzhao.SendKey myLoc
bzhao.Wait 0.2
bzhao.SendKey "<enter>"
bzhao.Wait 0.2

'Copy screen to get res#

bzhao.Wait 1
bzhao.Copy 32
bzhao.Wait 1

'Paste info to sheet for res_check

Range("J1").Select
ActiveSheet.Paste


bzhao.SendKey "M"
bzhao.Wait 0.2
bzhao.SendKey "<tab>"
bzhao.Wait 0.2
bzhao.SendKey "<tab>"
bzhao.Wait 0.2
bzhao.SendKey "<tab>"
bzhao.Wait 0.2
bzhao.SendKey "<tab>"
bzhao.Wait 0.2
bzhao.SendKey "<tab>"



'if value > 0 extra tab

If res_check > 0 Then

    bzhao.SendKey "<tab>"
    bzhao.Wait 1
    bzhao.SendKey "<tab>"
    bzhao.Wait 1
    bzhao.SendKey myX
    bzhao.Wait 0.2
    bzhao.SendKey "<enter>"
    bzhao.Wait 0.2
    bzhao.SendKey "E"
    bzhao.Wait 0.5

Else

bzhao.Wait 0.2
bzhao.SendKey "<tab>"
bzhao.Wait 1
bzhao.SendKey myX
bzhao.Wait 0.2
bzhao.SendKey "<enter>"
bzhao.Wait 0.2
bzhao.SendKey "E"
bzhao.Wait 0.5

End If


Next myLoc


End Sub

由于我仅限于通过键盘命令在屏幕上行走,因此我正在复制屏幕并将其粘贴到我的工作表上以检查是否为 0。但是,我无法使 if - then 语句起作用。

代码只是在 6 个选项卡上继续运行,这告诉我 res_check 值(这是一个将值从屏幕上拉出的 mid() 语句)未被识别,或者变量没有更新环形。但是,如果我先运行 res_check > 0 位置,它仍然会执行 6 个选项卡,因此我可以消除这种可能性。

作为进一步的检查,我对 res_check 值进行了 TRUE FALSE 检查,当它作为整数变暗时通过了。但是,在工作表上,ISNUMBER() 失败了。

TLDR: If Then 不会产生预期的结果 - 代码一直默认为 Else 条件。

【问题讨论】:

  • 请尝试 bzhao.SetCursor 6, 53 bzhao.SendKey "qwrety@E" bzhao.WaitReady 10, 1 的变体
  • 嗨,Don,我已尝试使用 SetCursor 并与 BlueZone 帮助台交谈。它不是 VT 中支持的命令。
  • @donPablo ^以上
  • 当 res_check > 0 时,第 5 和第 6 个选项卡之间没有 Wait 语句。当 res_check 不 > 0 时,第 5 和第 6 个选项卡之间有 Wait 语句。哪种行为是正确的?
  • @barrowc 等待时间设置得非常慷慨,以便在运行时监控宏。它只是暂停 1 秒(或任何设置)。我相信这对问题没有影响。

标签: excel vba if-statement emulation bluezone


【解决方案1】:

以下代码有效。

单元格 D3 =mid(J7, 63, 1) 和单元格 D8 =D3*1

我还做了@donpablo 建议的缩进(参见 cmets)。

Sub FiXCoord_Loop()

'Must start at IMLOA screen

Dim bzhao As Object
Set bzhao = CreateObject("BZWhll.WhllObj")
bzhao.Connect ""

Dim myX As Integer
Dim res_check As Integer
Dim myLoc As Variant



myRange = ActiveSheet.Range("A2:A1000")
myX = ActiveSheet.Range("E1").Value
res_check = ActiveSheet.Range("D8").Value

For Each myLoc In myRange


'end loop at blank cell
    If myLoc = "" Then
        Exit For
            End If

'Query location

bzhao.SendKey "Q"
bzhao.Wait 0.2
bzhao.SendKey myLoc
bzhao.Wait 0.2
bzhao.SendKey "<enter>"
bzhao.Wait 0.2

'Copy screen to get res#

bzhao.Wait 1
bzhao.Copy 32
bzhao.Wait 1

'Paste info to sheet for res_check

Range("J1").Select
ActiveSheet.Paste

'Modify data

bzhao.SendKey "M"
bzhao.Wait 0.2
bzhao.SendKey "<tab><tab><tab><tab><tab>" 'tab to Res


'Decide 6 or 7 tabs

If ActiveSheet.Range("D8").Value > 0 Then

    bzhao.Wait 0.1
    bzhao.SendKey "<tab>"

Else

    End If

bzhao.Wait 0.1
bzhao.SendKey "<tab>"
bzhao.Wait 0.1
bzhao.SendKey myX
bzhao.Wait 0.1
bzhao.SendKey "<enter>"
bzhao.Wait 0.1
bzhao.SendKey "E"
bzhao.Wait 0.5


Next myLoc


End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多