动态传递参数以使用VBA/Macros运行DM-VBA不起作用

2020-09-25 04:09发布

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

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


你好大师,

我一直在广泛研究如何动态传递参数以运行Data Manager Package。 但是,即使按照我在本文档上明确解释的所有说明进行操作,也 http://scn.sap。 com/docs/DOC-32636 我的VBA代码不断抛出错误"运行时错误52:文件名或数字错误",它指出了这行代码;

设置objStream = objFile.OpenTextFile(strFilename(strPackageName),_
  ForWriting,正确)
 

您中有人遇到过这样的错误吗?如果是,您如何调试它?

这是完整的VBA代码,以备不时之需;

公共子executeDmPackageWithParameters()
 '在该位置创建答案提示文件
 '在名称范围" PACKAGE"中指定
  createAnswerPromptFile" PACKAGE"," PARAMETERS"


 '获取DM Automation类实例
  昏暗的objDMautomation作为EPMAddInDMAutomation
  设置objDMautomation = New EPMAddInDMAutomation
 '运行在Excel名称范围" PACKAGE"中指定的包,
 '使用名称范围" PACKAGE"中指定的promtp文件
  objDMautomation.RunPackage objPackageFromSheet(" PACKAGE"),_
  strFilename(" PACKAGE")
 结束子
 私有函数strFilename(strRange As String)As String
 '获取设置DM包参数的范围
  Dim rngPackageRange作为范围
  设置rngPackageRange = Application.Names(strRange).RefersToRange




 '遍历行
  对于i = 1到rngPackageRange.Rows.Count
  如果rngPackageRange(i,1).Value =" PromptFile"然后
  strFilename = rngPackageRange(i,2).Value
  退出功能
  万一
  下一个
 结束功能
 私有函数strPackageDescription(strRange As String)As String
 '获取设置DM包参数的范围
  Dim rngPackageRange作为范围
  设置rngPackageRange = Application.Names(strRange).RefersToRange
 '遍历行
  对于i = 1到rngPackageRange.Rows.Count
  如果rngPackageRange(i,1).Value =" PackageId",则
  strPackageDescription = rngPackageRange(i,2).Value
  退出功能
  万一
  下一个
 结束功能
 私有函数objPackageFromSheet(strRange As String)作为ADMPackage
 '获取设置DM包参数的范围
  Dim rngPackageRange作为范围
  设置rngPackageRange = Application.Names(strRange).RefersToRange


 '创建ADM包对象
  设置objPackageFromSheet =新的ADMPackage


 '遍历行
  对于i = 1到rngPackageRange.Rows.Count


  选择Case rngPackageRange(i,1).Value


  案例"文件名"
  objPackageFromSheet.Filename = rngPackageRange(i,2).Value


  案例" GroupId"
  objPackageFromSheet.groupId = rngPackageRange(i,2).Value


  案例" PackageDesc"
  objPackageFromSheet.packageDesc = rngPackageRange(i,2).Value


  案例" PackageId"
  objPackageFromSheet.packageId = rngPackageRange(i,2).Value


  案例" PackageType"
  objPackageFromSheet.packageType = rngPackageRange(i,2).Value


  案例" TeamId"
  objPackageFromSheet.teamId = rngPackageRange(i,2).Value


  案例"用户组"
  objPackageFromSheet.UserGroup = rngPackageRange(i,2).Value


  结束选择
   下一个
 结束功能
 私人子createAnswerPromptFile(strPackageName作为字符串,_
  strParametersName作为字符串)
 '创建一个新的XML文档
  昏暗的objDOM作为DOMDocument
  设置objDOM = New DOMDocument


 '设置XML文档的处理指令
  昏暗的objProcessingInstruction作为IXMLDOMProcessingInstruction
  设置objProcessingInstruction = _
  objDOM.createProcessingInstruction(" xml",_
  "版本='1.0'编码='utf-16'")
  objDOM.appendChild objProcessingInstruction


 '创建根元素
  昏暗的objRootElem作为IXMLDOMElement
  设置objRootElem = objDOM.createElement(" ArrayOfAnswerPromptPersistingFormat")
  objDOM.appendChild objRootElem


 XSI属性
  昏暗的objMemberRel作为IXMLDOMAttribute
  设置objMemberRel = objDOM.createAttribute(" xmlns:xsi")
  objMemberRel.NodeValue =" http://www.w3.org/2001/XMLSchema-instance"
  objRootElem.setAttributeNode objMemberRel


 XSD属性
  设置objMemberRel = objDOM.createAttribute(" xmlns:xsd")
  objMemberRel.NodeValue =" http://www.w3.org/2001/XMLSchema"
  objRootElem.setAttributeNode objMemberRel




 '获取包含参数的单元格范围
  调光参数作为范围
  设置rngParameters = ThisWorkbook.Names(strParametersName).RefersToRange
  'Excel.Names(strParametersName).RefersToRange


 '
  昏暗的objCurrentStringPairParent为IXMLDOMElement
 '遍历每一行
  对于i = 1到rngParameters.Rows.Count


 '查看正在传递的参数类型
  选择大小写rngParameters(i,2).Value




 '如果它是单个参数,则将参数节点添加到根节点
  情况"参数"
  addSingleSelectionParameterToXML rngParameters(i,1).Value,_
  rngParameters(i,4).Value,_
 objRootElem,_
 objDOM
 '如果是值列表
  案例" StringListPairs"


 '如果是一组新的字符串列表对,则创建一个新的父级
  如果rngParameters(i,1).Value <> strCurrentStringPair然后
  strCurrentStringPair = rngParameters(i,1)。值
  设置objCurrentStringPairParent = _
  getStringListPairParent(rngParameters(i,1).Value,_
  objRootElem,_
  objDOM)
  万一


 '将尺寸名称和值添加到父级
  addStringListPair rngParameters(i,3).Value,_
  rngParameters(i,4).Value,_
  objCurrentStringPairParent,_
  objDOM


  结束选择
  下一个


 '创建文件对象
  昏暗的objFile作为FileSystemObject
  设置objFile = New FileSystemObject


 '创建一个流以创建并写入文件
  昏暗的objStream作为TextStream
  设置objStream = objFile.OpenTextFile(strFilename(strPackageName),_
  ForWriting,正确)


 '先写DM包的名称,然后写XML输出
  objStream.WriteLine strPackageDescription(strPackageName)和_
  " {param_separator}"和_
  objDOM.XML


 '关闭文件
  objStream.Close
 结束子
 私有函数addStringListPair(strVariableName As String,_
  strValue作为字符串,_
 objParent作为IXMLDOMElement,_
 objDOM As DOMDocument)
 '创建" StringListPair"节点
  昏暗的objStringListPairElement作为IXMLDOMElement
  设置objStringListPairElement = _
  objDOM.createElement(" StringListPair")
  objParent.appendChild objStringListPairElement




 '创建包含变量名称的" Str"元素
  昏暗的objStrElement作为IXMLDOMElement
  设置objStrElement = objDOM.createElement(" str")
  objStringListPairElement.appendChild objStrElement
  objStrElement.Text = strVariableName


 '创建" lst"元素
  昏暗的objLstElement作为IXMLDOMElement
  设置objLstElement = objDOM.createElement(" lst")
  objStringListPairElement.appendChild objLstElement


 '创建包含变量值的"字符串"元素
  昏暗的objStringElement作为IXMLDOMElement
  设置objStringElement = objDOM.createElement(" string")
  objLstElement.appendChild objStringElement
  objStringElement.Text = strValue
 结束功能
 私有函数getStringListPairParent(strVariableName As String,_
  objParent作为IXMLDOMElement,_
 objDOM As DOMDocument)As IXMLDOMElement
 '创建" AnswerPromptPersistingFormat"节点
  Dim objAnswerPromptPersistingFormatElement作为IXMLDOMElement
  设置objAnswerPromptPersistingFormatElement = _
  objDOM.createElement(" AnswerPromptPersistingFormat")
  objParent.appendChild objAnswerPromptPersistingFormatElement


 '创建" _ap"节点
  将objApElement昏暗为IXMLDOMElement
  设置objApElement = objDOM.createElement(" _ ap")
  objAnswerPromptPersistingFormatElement.appendChild objApElement


 '创建参数名称元素
  昏暗的objParameterElement作为IXMLDOMElement
  设置objParameterElement = objDOM.createElement(" Name")
  objApElement.appendChild objParameterElement
  objParameterElement.Text = strVariableName


 '创建值元素
  将objValuesElement昏暗为IXMLDOMElement
  设置objValuesElement = objDOM.createElement(" Values")
  objApElement.appendChild objValuesElement


 '创建" _apc"节点
  设置getStringListPairParent = objDOM.createElement(" _ apc")
  objAnswerPromptPersistingFormatElement.appendChild getStringListPairParent
 结束功能
 专用函数addSingleSelectionParameterToXML(strVariableName As String,_
  strValue作为字符串,_
  objParent作为IXMLDOMElement,_
 objDOM As DOMDocument)
 '创建" AnswerPromptPersistingFormat"节点
  Dim objAnswerPromptPersistingFormatElement作为IXMLDOMElement
  设置objAnswerPromptPersistingFormatElement = _
  objDOM.createElement(" AnswerPromptPersistingFormat")
  objParent.appendChild objAnswerPromptPersistingFormatElement


 '创建" _ap"节点
  将objApElement昏暗为IXMLDOMElement
  设置objApElement = objDOM.createElement(" _ ap")
  objAnswerPromptPersistingFormatElement.appendChild objApElement
 '创建参数名称元素
  昏暗的objParameterElement作为IXMLDOMElement
  设置objParameterElement = objDOM.createElement(" Name")
  objApElement.appendChild objParameterElement
  objParameterElement.Text = strVariableName


 '创建值元素
  将objValuesElement昏暗为IXMLDOMElement
  设置objValuesElement = objDOM.createElement(" Values")
  objApElement.appendChild objValuesElement


 '使用传递给参数的值创建字符串元素
  昏暗的objStringElement作为IXMLDOMElement
  设置objStringElement = objDOM.createElement(" string")
  objValuesElement.appendChild objStringElement
  objStringElement.Text = strValue




 结束功能

 

并且我正在尝试传递参数以运行此DM;

如果您愿意,我还可以提供"参数"和"包装"的提示列表和名称范围。 提前致谢。

(37.1 kB)

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

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


你好大师,

我一直在广泛研究如何动态传递参数以运行Data Manager Package。 但是,即使按照我在本文档上明确解释的所有说明进行操作,也 http://scn.sap。 com/docs/DOC-32636 我的VBA代码不断抛出错误"运行时错误52:文件名或数字错误",它指出了这行代码;

设置objStream = objFile.OpenTextFile(strFilename(strPackageName),_
  ForWriting,正确)
 

您中有人遇到过这样的错误吗?如果是,您如何调试它?

这是完整的VBA代码,以备不时之需;

公共子executeDmPackageWithParameters()
 '在该位置创建答案提示文件
 '在名称范围" PACKAGE"中指定
  createAnswerPromptFile" PACKAGE"," PARAMETERS"


 '获取DM Automation类实例
  昏暗的objDMautomation作为EPMAddInDMAutomation
  设置objDMautomation = New EPMAddInDMAutomation
 '运行在Excel名称范围" PACKAGE"中指定的包,
 '使用名称范围" PACKAGE"中指定的promtp文件
  objDMautomation.RunPackage objPackageFromSheet(" PACKAGE"),_
  strFilename(" PACKAGE")
 结束子
 私有函数strFilename(strRange As String)As String
 '获取设置DM包参数的范围
  Dim rngPackageRange作为范围
  设置rngPackageRange = Application.Names(strRange).RefersToRange




 '遍历行
  对于i = 1到rngPackageRange.Rows.Count
  如果rngPackageRange(i,1).Value =" PromptFile"然后
  strFilename = rngPackageRange(i,2).Value
  退出功能
  万一
  下一个
 结束功能
 私有函数strPackageDescription(strRange As String)As String
 '获取设置DM包参数的范围
  Dim rngPackageRange作为范围
  设置rngPackageRange = Application.Names(strRange).RefersToRange
 '遍历行
  对于i = 1到rngPackageRange.Rows.Count
  如果rngPackageRange(i,1).Value =" PackageId",则
  strPackageDescription = rngPackageRange(i,2).Value
  退出功能
  万一
  下一个
 结束功能
 私有函数objPackageFromSheet(strRange As String)作为ADMPackage
 '获取设置DM包参数的范围
  Dim rngPackageRange作为范围
  设置rngPackageRange = Application.Names(strRange).RefersToRange


 '创建ADM包对象
  设置objPackageFromSheet =新的ADMPackage


 '遍历行
  对于i = 1到rngPackageRange.Rows.Count


  选择Case rngPackageRange(i,1).Value


  案例"文件名"
  objPackageFromSheet.Filename = rngPackageRange(i,2).Value


  案例" GroupId"
  objPackageFromSheet.groupId = rngPackageRange(i,2).Value


  案例" PackageDesc"
  objPackageFromSheet.packageDesc = rngPackageRange(i,2).Value


  案例" PackageId"
  objPackageFromSheet.packageId = rngPackageRange(i,2).Value


  案例" PackageType"
  objPackageFromSheet.packageType = rngPackageRange(i,2).Value


  案例" TeamId"
  objPackageFromSheet.teamId = rngPackageRange(i,2).Value


  案例"用户组"
  objPackageFromSheet.UserGroup = rngPackageRange(i,2).Value


  结束选择
   下一个
 结束功能
 私人子createAnswerPromptFile(strPackageName作为字符串,_
  strParametersName作为字符串)
 '创建一个新的XML文档
  昏暗的objDOM作为DOMDocument
  设置objDOM = New DOMDocument


 '设置XML文档的处理指令
  昏暗的objProcessingInstruction作为IXMLDOMProcessingInstruction
  设置objProcessingInstruction = _
  objDOM.createProcessingInstruction(" xml",_
  "版本='1.0'编码='utf-16'")
  objDOM.appendChild objProcessingInstruction


 '创建根元素
  昏暗的objRootElem作为IXMLDOMElement
  设置objRootElem = objDOM.createElement(" ArrayOfAnswerPromptPersistingFormat")
  objDOM.appendChild objRootElem


 XSI属性
  昏暗的objMemberRel作为IXMLDOMAttribute
  设置objMemberRel = objDOM.createAttribute(" xmlns:xsi")
  objMemberRel.NodeValue =" http://www.w3.org/2001/XMLSchema-instance"
  objRootElem.setAttributeNode objMemberRel


 XSD属性
  设置objMemberRel = objDOM.createAttribute(" xmlns:xsd")
  objMemberRel.NodeValue =" http://www.w3.org/2001/XMLSchema"
  objRootElem.setAttributeNode objMemberRel




 '获取包含参数的单元格范围
  调光参数作为范围
  设置rngParameters = ThisWorkbook.Names(strParametersName).RefersToRange
  'Excel.Names(strParametersName).RefersToRange


 '
  昏暗的objCurrentStringPairParent为IXMLDOMElement
 '遍历每一行
  对于i = 1到rngParameters.Rows.Count


 '查看正在传递的参数类型
  选择大小写rngParameters(i,2).Value




 '如果它是单个参数,则将参数节点添加到根节点
  情况"参数"
  addSingleSelectionParameterToXML rngParameters(i,1).Value,_
  rngParameters(i,4).Value,_
 objRootElem,_
 objDOM
 '如果是值列表
  案例" StringListPairs"


 '如果是一组新的字符串列表对,则创建一个新的父级
  如果rngParameters(i,1).Value <> strCurrentStringPair然后
  strCurrentStringPair = rngParameters(i,1)。值
  设置objCurrentStringPairParent = _
  getStringListPairParent(rngParameters(i,1).Value,_
  objRootElem,_
  objDOM)
  万一


 '将尺寸名称和值添加到父级
  addStringListPair rngParameters(i,3).Value,_
  rngParameters(i,4).Value,_
  objCurrentStringPairParent,_
  objDOM


  结束选择
  下一个


 '创建文件对象
  昏暗的objFile作为FileSystemObject
  设置objFile = New FileSystemObject


 '创建一个流以创建并写入文件
  昏暗的objStream作为TextStream
  设置objStream = objFile.OpenTextFile(strFilename(strPackageName),_
  ForWriting,正确)


 '先写DM包的名称,然后写XML输出
  objStream.WriteLine strPackageDescription(strPackageName)和_
  " {param_separator}"和_
  objDOM.XML


 '关闭文件
  objStream.Close
 结束子
 私有函数addStringListPair(strVariableName As String,_
  strValue作为字符串,_
 objParent作为IXMLDOMElement,_
 objDOM As DOMDocument)
 '创建" StringListPair"节点
  昏暗的objStringListPairElement作为IXMLDOMElement
  设置objStringListPairElement = _
  objDOM.createElement(" StringListPair")
  objParent.appendChild objStringListPairElement




 '创建包含变量名称的" Str"元素
  昏暗的objStrElement作为IXMLDOMElement
  设置objStrElement = objDOM.createElement(" str")
  objStringListPairElement.appendChild objStrElement
  objStrElement.Text = strVariableName


 '创建" lst"元素
  昏暗的objLstElement作为IXMLDOMElement
  设置objLstElement = objDOM.createElement(" lst")
  objStringListPairElement.appendChild objLstElement


 '创建包含变量值的"字符串"元素
  昏暗的objStringElement作为IXMLDOMElement
  设置objStringElement = objDOM.createElement(" string")
  objLstElement.appendChild objStringElement
  objStringElement.Text = strValue
 结束功能
 私有函数getStringListPairParent(strVariableName As String,_
  objParent作为IXMLDOMElement,_
 objDOM As DOMDocument)As IXMLDOMElement
 '创建" AnswerPromptPersistingFormat"节点
  Dim objAnswerPromptPersistingFormatElement作为IXMLDOMElement
  设置objAnswerPromptPersistingFormatElement = _
  objDOM.createElement(" AnswerPromptPersistingFormat")
  objParent.appendChild objAnswerPromptPersistingFormatElement


 '创建" _ap"节点
  将objApElement昏暗为IXMLDOMElement
  设置objApElement = objDOM.createElement(" _ ap")
  objAnswerPromptPersistingFormatElement.appendChild objApElement


 '创建参数名称元素
  昏暗的objParameterElement作为IXMLDOMElement
  设置objParameterElement = objDOM.createElement(" Name")
  objApElement.appendChild objParameterElement
  objParameterElement.Text = strVariableName


 '创建值元素
  将objValuesElement昏暗为IXMLDOMElement
  设置objValuesElement = objDOM.createElement(" Values")
  objApElement.appendChild objValuesElement


 '创建" _apc"节点
  设置getStringListPairParent = objDOM.createElement(" _ apc")
  objAnswerPromptPersistingFormatElement.appendChild getStringListPairParent
 结束功能
 专用函数addSingleSelectionParameterToXML(strVariableName As String,_
  strValue作为字符串,_
  objParent作为IXMLDOMElement,_
 objDOM As DOMDocument)
 '创建" AnswerPromptPersistingFormat"节点
  Dim objAnswerPromptPersistingFormatElement作为IXMLDOMElement
  设置objAnswerPromptPersistingFormatElement = _
  objDOM.createElement(" AnswerPromptPersistingFormat")
  objParent.appendChild objAnswerPromptPersistingFormatElement


 '创建" _ap"节点
  将objApElement昏暗为IXMLDOMElement
  设置objApElement = objDOM.createElement(" _ ap")
  objAnswerPromptPersistingFormatElement.appendChild objApElement
 '创建参数名称元素
  昏暗的objParameterElement作为IXMLDOMElement
  设置objParameterElement = objDOM.createElement(" Name")
  objApElement.appendChild objParameterElement
  objParameterElement.Text = strVariableName


 '创建值元素
  将objValuesElement昏暗为IXMLDOMElement
  设置objValuesElement = objDOM.createElement(" Values")
  objApElement.appendChild objValuesElement


 '使用传递给参数的值创建字符串元素
  昏暗的objStringElement作为IXMLDOMElement
  设置objStringElement = objDOM.createElement(" string")
  objValuesElement.appendChild objStringElement
  objStringElement.Text = strValue




 结束功能

 

并且我正在尝试传递参数以运行此DM;

如果您愿意,我还可以提供"参数"和"包装"的提示列表和名称范围。 提前致谢。

(37.1 kB)
付费偷看设置
发送
3条回答
天桥码农
1楼-- · 2020-09-25 04:35
黑丝骑士
2楼-- · 2020-09-25 04:18

不,不需要命名范围。 您可以从Excel单元格读取值以获取参数值或对代码中的某些参数进行硬核化。

灬番茄
3楼-- · 2020-09-25 04:14

P.S。

VBA代码不断抛出错误"运行时错误52:文件名或数字错误",并指出了这行代码;

设置objStream = objFile.OpenTextFile(strFilename(strPackageName),_
  ForWriting,为True)

您好像忘记了包含本文档第17页开头列出的所有必需参考文献:

http://scn.sap.com/docs/DOC-32636

Microsoft脚本运行时等等...

但是我不建议使用此文档-这是一个过于复杂的示例,在Excel中有很多无用的字段。

一周热门 更多>