【问题标题】:VBA Variables within a Loop - BlueZone Emulation循环中的 VBA 变量 - BlueZone 仿真
【发布时间】:2019-11-30 00:21:20
【问题描述】:

当我运行以下代码时,我无法将“数量”传递给 BlueZone。它将在循环中使用 SendKey 成功传递每个变量“过道”。我测试了活动工作表上的输出,并获得了基于 myRange.Offset(0,n) 的值。

我有一个要循环的 n x 4 数组。我需要为每次迭代传递一组不同的变量。

我的结构错了吗?

BlueZone 是终端仿真。

https://www.rocketsoftware.com/products/rocket-bluezonepassport-terminal-emulator/rocket-bluezone-terminal-emulation

Sub Grooming1()



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


Dim aisle As Variant
Dim Qty As Variant
Dim LDAP As Variant
Dim Priority As Variant

Set myRange = ActiveSheet.Range("A2:A1000")
'Set myQty = ActiveSheet.Range("B2:B1000")
'Set myLDAP = ActiveSheet.Range("C2:C1000")
'Set myPriority = ActiveSheet.Range("D2:D1000")


For Each aisle In myRange

Set Qty = myRange.Offset(0, 1)
Set LDAP = myRange.Offset(0, 2)
Set Priority = myRange.Offset(0, 3)

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

bzhao.SendKey "<PF3>"
bzhao.Wait 0.5
bzhao.SendKey Qty '<---ERROR
bzhao.Wait 0.5

'ActiveSheet.Range("F2") = Qty
'ActiveSheet.Range("F3") = LDAP
'ActiveSheet.Range("F4") = Priority
'ActiveSheet.Range("F5") = aisle

Next aisle


End Sub

【问题讨论】:

  • 我从未听说过“bluezone”,也不知道“BZWhll.WhllObj”是什么。我怀疑很多阅读这个问题的人会知道那是什么。如果您提供一些上下文,包括相关文档的链接,它可能会有所帮助。您使用SendKey 的事实并不令人鼓舞。这几乎是不可能可靠调试的。这是一个本质上不透明的命令。从我们的角度来看,一个未知的窗口正在接收未知的数据,并且没有按照您未说明的期望工作。
  • @jpcoleman SendKey 当然不理想,但它是我必须走模拟器的唯一选择。我认为我的期望很明确 - 我的变量 Qty 没有通过。谢谢阅读;我添加了有关该对象的更多细节。
  • Qty 是字符串吗?您收到的错误是什么? myRange.Offset(0, 1) 的值是多少?你沉浸在问题的细节中。其他人可能不知道您要做什么。请提供minimal reproducible example
  • @jpcoleman Qty 是一个整数,myRange.Offset(0,1) 的第一行是10。
  • @jpcoleman 明白 - 完成!

标签: vba loops bluezone


【解决方案1】:

所以,我的公司也使用 BlueZone。我们创建了一个减少代码行数的函数:

Public Function SendKey(ByVal aKey As String)
BZHost.SendKey aKey
If BZHost.WaitReady(10, 1) <> 0 Then
    Err.Raise 2049, "", "BlueZone session failed to respond within 10 second timeout limit!"
End If

结束函数 所以当你想在 BlueZone 中输入文字时:

SendKey Qty

【讨论】:

    【解决方案2】:

    我知道这是一个旧线程,但我发现它自己在寻找 BlueZone 信息。

    我们也使用 BlueZone,我们的做法是使用 WaitReady 而不是 Wait。事实上,出于某种原因,我们将其翻倍(但我是新来的)。

    我建议的另一件事是始终使用带数字的 Format 函数,尤其是当您的大型机正确对齐我们的大型机时。

    因此,如果您在一个长度为六位的字段中输入,您的代码将是:

    bzhao.SendKey "<PF3>"
    bzhao.WaitReady 10, 1
    bzhao.WaitReady 10, 100
    bzhao.SendKey Format(Qty, "000000") ' padded with zeros
    bzhao.SendKey Format(Format(Qty, "@"), "@@@@@@") ' padded with spaces
    bzhao.WaitReady 10, 1
    bzhao.WaitReady 10, 100
    

    最后,您的 Offset 不应该在 aisle 对象上,而不是 myRange 上吗?否则,Qty 将始终是第一行的值,无论aisle 是哪一行...

    最好, 凯文

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 2015-04-17
      • 2021-07-27
      • 2019-04-30
      相关资源
      最近更新 更多