Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用Do循环VBA选择SAP字段_Excel_Vba_Sap Gui - Fatal编程技术网

Excel 使用Do循环VBA选择SAP字段

Excel 使用Do循环VBA选择SAP字段,excel,vba,sap-gui,Excel,Vba,Sap Gui,我正在处理一个宏,以便进入SAP并选择列中的单元格以提取到excel。现在,如果这是excel,这将不会有问题,因为我将简单地使用一个do循环沿列向下移动,沿途复制。我使用的是SAP GUI,但它与VBA兼容,有点不同。我录制了一段脚本,我在一列上单击以查看代码如何更改。这就是我得到的 session.findById("wnd[0]").maximize session.findById("wnd[0]/usr/lbl[12,13]").setFocus session.findById("w

我正在处理一个宏,以便进入SAP并选择列中的单元格以提取到excel。现在,如果这是excel,这将不会有问题,因为我将简单地使用一个do循环沿列向下移动,沿途复制。我使用的是SAP GUI,但它与VBA兼容,有点不同。我录制了一段脚本,我在一列上单击以查看代码如何更改。这就是我得到的

session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/lbl[12,13]").setFocus
session.findById("wnd[0]/usr/lbl[12,13]").caretPosition = 6
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/lbl[12,14]").setFocus
session.findById("wnd[0]/usr/lbl[12,14]").caretPosition = 4
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/lbl[12,15]").setFocus
session.findById("wnd[0]/usr/lbl[12,15]").caretPosition = 5
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/lbl[12,16]").setFocus
session.findById("wnd[0]/usr/lbl[12,16]").caretPosition = 5
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/lbl[12,17]").setFocus
session.findById("wnd[0]/usr/lbl[12,17]").caretPosition = 5
session.findById("wnd[0]").sendVKey 0
当我向下移动列时,可以看到一个特定的值从13增加到17。我想我可以合并一个do循环,然后沿着列向下移动并复制值。这是我的相关代码

i = 13

Do

session.findById("wnd[0]").maximize
Current_Batch = session.findById("wnd[0]/usr/lbl[12,i]").Text
session.findById("wnd[0]/usr/lbl[12,i]").caretPosition = 6
session.findById("wnd[0]").sendVKey 0

If Current_Batch = "" Then
Exit Do
End If

Cells(i - 11, 4) = Current_Batch


i = i + 1

Loop
但是,这不起作用,因为它不将i识别为变量。它给我错误619(找不到ID)


有人知道如何实现这个功能吗?

是的,我实现了同样的脚本。您需要构造字符串,同时将i转换为字符串:

session.findById(“wnd[0]/usr/lbl[12,&CStr(i)和“]”)。caretPosition=6

CStr(i)
转换为字符串,而
&
将字符串连接在一起


我只更改了一行,但您应该能够正确地执行它,因为您已经确定了您的问题,所以您能够掌握事情是如何工作的。祝您好运,

您是否尝试过按名称而不是按数字引用这些列

这是我的循环,它捕获一行中的每一列并移动到下一列

hRows = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").RowCount()
For h = 0 To hRows - 1 'Fill Dispatch Sheet at "A12"
    Cells(h + 12, 4).Value = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").getcellValue(h, "ERDAT")
    Cells(h + 12, 5).Value = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").getcellValue(h, "KTEXT")
    Cells(h + 12, 6).Value = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").getcellValue(h, "ERNAM")
    Cells(h + 12, 1).Value = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").getcellValue(h, "GEWRK")
    Cells(h + 12, 2).Value = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").getcellValue(h, "AUFNR")
    Cells(h + 12, 3).Value = session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").getcellValue(h, "USTXT")
Next

嘿,Jean,今天早上我尝试了你的解决方案,它成功了,但是出现了一个问题,当屏幕空间用完时,它就停止了向下移动。所以它复制的最后一批是我屏幕底部的那一批,但这是一个相当长的列表,占用了多个屏幕长度。你知道这个问题的解决方法吗?@Jordan我不确定我是否理解,你能提供更多细节吗?当然,我的屏幕只能容纳我正在复制的专栏的大约1/3。我注意到它向下移动列,并将每个值复制到excel,直到它到达屏幕底部。尽管列下面有更多的数据,但代码表现为无法“查看”下面的数据,并再次给出错误619。我试着调整我的屏幕,在那里我向下移动了几行(只能再容纳2行),然后它也能够复制这些,所以它必须偏离它能“看到”的范围。它不应该基于它能看到的内容,它应该能够通过脚本访问这些其他值(当您谈论屏幕时,我们谈论的是您的SAP Gui屏幕界面)。如果它是这样工作的(我对此有点怀疑,因为使用过SAP脚本),您可以在代码中添加一个例程以向下滚动屏幕。如果您不知道该例程的代码,请使用VBA脚本记录它,就像您在第一部分中所做的那样。@约旦人同意这很奇怪。我过去在脚本编写中有过一些奇怪的经历,但它确实会在可见界面的末尾停止。我将添加一个s克罗林将在今天晚些时候发挥作用,希望能帮助解决这个问题