使用VBScript的SAP自动化:从Excel复制多个值

2020-08-24 06:44发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

功能要求是将Excel中的多个值(即SAP Accounting doc号)复制并粘贴到SAP中以清除它们。

我的excel中有多行,每行可能有不同数量的文档编号。 例如,row2在3列中具有3个值,而row4具有5个文档编号。 因此,我尝试使用以下语法在vbscript中使用xltoright功能,但这仅是获取该行最后填充的列的数据。

objSheet.Cells(2,1).End(-4161).copy

帮助要求:

1)如何复制剪贴板中从(2,1)(即A2)到A2末尾的所有单元格的值

2)如何使用SAP的CTRLV或SendVkey 78粘贴它们。 我尝试使用WshShell.SendKeys" ^ V"&session.findById(" wnd [0]")。sendVKey 78,但无法正常工作。

谢谢!

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

功能要求是将Excel中的多个值(即SAP Accounting doc号)复制并粘贴到SAP中以清除它们。

我的excel中有多行,每行可能有不同数量的文档编号。 例如,row2在3列中具有3个值,而row4具有5个文档编号。 因此,我尝试使用以下语法在vbscript中使用xltoright功能,但这仅是获取该行最后填充的列的数据。

objSheet.Cells(2,1).End(-4161).copy

帮助要求:

1)如何复制剪贴板中从(2,1)(即A2)到A2末尾的所有单元格的值

2)如何使用SAP的CTRLV或SendVkey 78粘贴它们。 我尝试使用WshShell.SendKeys" ^ V"&session.findById(" wnd [0]")。sendVKey 78,但无法正常工作。

谢谢!

付费偷看设置
发送
4条回答
能不能别闹
1楼-- · 2020-08-24 07:23

我已经做了像这样的循环遍历单元格的事情。

'将有助于动态创建表的GUIscript ID。  (session.Info.Program)
 tGuiTableControl =" wnd [0]/usr/tbl"&session.Info.Program&" TCTRL_"&TargetTable.DataBodyRange.Value

 '找到模式匹配表,分配给tObj进行项目维护
     设置为tobj = session.FindById(tGuiTableControl)
     设置tObjChild = tobj.Children


 '计算数组长度(维度1)
     tDataRows = UBound(inp.DataBodyRange.Value,1)

 '计算目标表的宽度,因为这就是我们要填充值的范围。
     tDataColumns = tobj.Columns.Count
     visiblerows = tobj.VisibleRowCount

 有时我们会用完数据,然后再用尽可见行。
 totRow = Min(可见行,UBound(inp.DataBodyRange.Value,1))

 做
         如果tDataFinished <>" X"然后
        
         对于tObjRow = 1 + notInitialLoop到toRow
             对于tObjCol = 1 Tobj.Columns.Count
                     如果tDataLoopRow> UBound(inp.DataBodyRange.Value,1)然后
                         tDataFinished =" X"
                         退出做
                     万一
                     如果tObjChild.Item(tObjItemNum + 0).Changeable = False,则
                         '可见列,不希望输入数据。
                     ElseIf tObjChild.Item(tObjItemNum + 0).Type =" GuiCTextField"或tObjChild.Item(tObjItemNum + 0).Type =" GuiTextField"然后
                         如果IsDate(inp.DataBodyRange(tDataLoopRow,tDataLoopColumn))= True和Len(inp.DataBodyRange(tDataLoopRow,tDataLoopColumn))> 5然后
                             如果inp.DataBodyRange(tDataLoopRow,tDataLoopColumn)<=#12/31/1899#那么由于Lotus 1-2-3,'excel过去的日期很奇怪
                                 tObjChild.Item(tObjItemNum + 0).text = DateConvert(inp.DataBodyRange(tDataLoopRow,tDataLoopColumn)+ 1,"。")
                             其他:
                                 tObjChild.Item(tObjItemNum + 0).text = DateConvert(inp.DataBodyRange(tDataLoopRow,tDataLoopColumn),"。")
                             万一
                         其他:
                             tObjChild.Item(tObjItemNum + 0).text = inp.DataBodyRange(tDataLoopRow,tDataLoopColumn)
                         万一
                     ElseIf tObjChild.Item(tObjItemNum + 0).Type =" GuiComboBox"然后
                         tObjChild.Item(tObjItemNum + 0).Key = inp.DataBodyRange(tDataLoopRow,tDataLoopColumn)
                        
                     ElseIf tObjChild.Item(tObjItemNum + 0).Type =" GuiCheckBox"然后
                         如果inp.DataBodyRange(tDataLoopRow,tDataLoopColumn)=""然后
                             tObjChild.Item(tObjItemNum + 0).Selected = False
                         其他:
                             tObjChild.Item(tObjItemNum + 0).Selected = True
                         万一
                     其他:
                         '其他条件
                     万一
                
                 如果inp.DataBodyRange(tDataLoopRow,1)=""然后
                     tDataFinished =" X"
                     退出做
                 万一
                
        
                 'tObjItemNum = tObjCol *可见行
                 tObjItemNum = tObjItemNum +可见行
                 tDataLoopColumn = tDataLoopColumn + 1
             下一个tObjCol
            
 '检查是否应提交当前批次
             如果CommitAfterX.DataBodyRange.Value> 0然后
                 如果tDataLoopRow Mod CommitAfterX.DataBodyRange.Value = 0,则
                     调用commitCurrentUpdates(session,TargetTable,tTargetTransport)
 '重置对象更新索引
                     tObjRow = -1
 '重置模式匹配表,分配给tObj进行项目维护
                     设置为tobj = session.FindById(tGuiTableControl)
                     设置tObjChild = tobj.Children
                 其他:
                     x = y
                 万一
             万一
            
             tDataLoopRow = tDataLoopRow + 1
             tDataLoopColumn = 1
             tObjItemNum = tObjRow
         下一个tObjRow
            
             notInitialLoop = 1
             'tObjRow = 1
             tObjItemNum = 1
            
 '设置下一行以准备提交或可见行的下一页
             session.FindById(" wnd [0]/mbar/menu [2]/menu [2]")。选择
             '检查和管理数据输入问题。
             调用PreSaveHandler(session)
            
 '设置下一行以准备提交或可见行的下一页(再次?)
             session.FindById(" tGuiTableControl").VerticalScrollbar.Position = tDataLoopRow-1
           
             '重置模式匹配表,分配给tObj进行项目维护
             设置为tobj = session.FindById(tGuiTableControl)
             设置tObjChild = tobj.Children
             如果tObjRow> = UBound(inp.DataBodyRange.Value,1)然后
                 tDataFinished =" X"
             其他:
                 '将tObjRow设置到重置位置
                 tObjRow = 2
             万一
            
         万一
         循环直到tDataFinished =" X"


 

它的伪代码在那里,所以不要指望复制粘贴

因此...相当多的Ctrl + C和Ctrl + V可以工作的代码。 但是它相当笼统,并且您可以为不良数据添加各种检查和余额。

小c菟菟
2楼-- · 2020-08-24 07:17

1)这是一个Excel COM问题。 您将在非SAP论坛中找到答案。 您也可以使用Excel VBA记录器查看要使用的属性。 注意:我认为cells(2,1).resize(1,5).select + wshShell.SendKeys" ^ C"可以正常工作。

2)我对粘贴不起作用感到惊讶。 确定要聚焦目标细胞吗? SAP屏幕是什么样的?

樱桃小丸子0093
3楼-- · 2020-08-24 07:12

谢谢Sandra的输入!

1)我最终决定遍历这些值,并使用通常的.text方法将其粘贴到SAP屏幕中

2)是的,我专注于单元格并尝试了我所能做的一切,但是没有用:)

亦是此间程序员
4楼-- · 2020-08-24 07:23

感谢Daniel。 我还必须遍历单元格才能完成工作。

一周热门 更多>