使用Excel VBA和DI API在SAP B1中过帐日记帐分录。

2020-09-06 06:41发布

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

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


嗨,大家

我们有数千个日记帐分录要发布到SAP Business One中。 因此,我们决定编写一个小程序来完成这项工作。

我们不是使用Visual Studio开发完整的附件,而是决定使用Excel Visual Basic( VBA)处理DI API。

这是我们的策略:

  • 我们有一个Excel工作表,其中包含所有日记帐分录的数据。
  • Excel中的每一行代表一个日记帐分录。
  • 列的范围代表标题数据。
  • 另一列范围表示JE中第一行的条目。
  • 类似于JE中第二行和第三行中的条目。
  • 当我们按下Excel工作表中的按钮时,将执行VBA,并且我们使用循环来确保日记条目逐一发布。
  • 每次发布​​日记帐时,Excel行都被染成红色。
  • 不幸的是,该应用程序无法正常工作。

我们的问题:

如果Excel工作表仅包含1行(1 JE),则将其发布而不会出现问题。

但是,如果Excel工作表包含几行(几个JE),则仅成功发布第一行。 无法发布第二行(第二JE)。 显示此消息:

我们不理解这个问题,因为我们没有尝试过将Dr和Cr张贴在一行中。

无论如何,如果我们删除Excel的第一行,则拒绝发布的第二行现已成功发布。

因此,似乎在执行循环时会出现错误。

希望有人可以提供帮助。

谢谢

利昂

--------------------------------------------------- ----------------------

以下是我们的Excel工作表的图片:

capture1.jpg

--------------------------------------------------- --------------------------

这是我们的VBA代码:

未显示连接详细信息,但它们可以正常工作。

 Dim oCompany作为SAPbobsCOM.Company

 公开子CreateOrder_Click()
     尽可能长的Dim lRetCode
     Dim sErrMsg作为字符串
    
     答案为整数
     昏暗计数器为整数:计数器= 1
     Dim RowNo作为整数:RowNo = 13
    
      '连接到SBO
     登录'//我们没有显示代码,但是可以正常工作

     '声明销售订单DI API对象
     作为SAPbobsCOM.JournalEntries的昏暗对象
     设置oJE = oCompany.GetBusinessObject(oJournalEntries)
      
     如果(Worksheets(" JEsalesINV")。Cells(RowNo,1)="")然后
     MsgBox"没有更多条目可发布!",vbExclamation
     退出子
 万一

 答案= MsgBox("发布日记条目?",vbYesNo + vbQuestion + vbDefaultButton2)

 如果答案= vb否
     退出子
 万一
       
        '=================================================  ===================
          'Journal Entry工作表= JEsalesINV
        '=================================================  ===================
       
                  
 同时执行(Worksheets(" JEsalesINV")。Cells(RowNo,1)<>""和Counter <= 10)
          
              NoOfRows = Worksheets(" JEsalesINV")。Cells(RowNo,10).Text
              '//有些JE有2行,有些3

              选择Case NoOfRows'//日记帐分录中的行数
                
               情况2'//如果日记帐分录中有2行
                
                 '-----------------------
                 标题日记帐分录
                 '----------------------
                        
           oJE.ReferenceDate = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
           oJE.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
           oJE.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
           oJE.Memo = Worksheets(" JEsalesINV")。Cells(RowNo,6).Text
           oJE.Reference = Worksheets(" JEsalesINV")。Cells(RowNo,7).Text
           oJE.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,8).Text
                                      
                 '---------------------------------------
                 '日记帐分录-第1和2行的详细信息
                 '---------------------------------------
                                               
     oJE.Lines.AccountCode = Worksheets(" JEsalesINV")。Cells(RowNo,11).Text
     oJE.Lines.LineMemo = Worksheets(" JEsalesINV")。Cells(RowNo,12).Text
     oJE.Lines.Debit = Worksheets(" JEsalesINV")。Cells(RowNo,13).Text
     oJE.Lines.Reference1 = Worksheets(" JEsalesINV")。Cells(RowNo,14).Text
     oJE.Lines.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,15).Text
     oJE.Lines.ReferenceDate1 = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
     oJE.Lines.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
     oJE.Lines.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
     oJE.Lines.TaxGroup =" O1.1"

     oJE.Lines.Add

     oJE.Lines.AccountCode = Worksheets(" JEsalesINV")。Cells(RowNo,17).Text
     oJE.Lines.LineMemo = Worksheets(" JEsalesINV")。Cells(RowNo,18).Text
     oJE.Lines.Credit = Worksheets(" JEsalesINV")。Cells(RowNo,19).Text
     oJE.Lines.Reference1 = Worksheets(" JEsalesINV")。Cells(RowNo,20).Text
     oJE.Lines.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,21).Text
     oJE.Lines.ReferenceDate1 = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
     oJE.Lines.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
     oJE.Lines.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
                              
     oJE.Lines.Add
                             
                
         lRetCode = oJE.Add
                
         如果lRetCode <> 0然后
          sErrMsg = oCompany.GetLastErrorDescription
          MsgBox sErrMsg
          退出子
                     
                   否则,如果iRetCode = 0,则
                              
             '//在Excel中发布行后,我们将行涂成红色
                 行数(行数)。选择
                 Selection.Interior.Color = vbRed
                             
                 计数器=计数器+ 1
                 行号=行号+ 1
                 万一
                       
                         
                 情况3'//如果日记帐分录中有3行
                 '-----------------------
                 标题日记帐分录
                 '----------------------
           oJE.ReferenceDate = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
           oJE.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
           oJE.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
           oJE.Memo = Worksheets(" JEsalesINV")。Cells(RowNo,6).Text
           oJE.Reference = Worksheets(" JEsalesINV")。Cells(RowNo,7).Text
           oJE.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,8).Text
        
                 '-------------------------------------------
                 '日记帐分录-第1,2和3行的详细信息
                 '--------------------------------------------
                
    oJE.Lines.AccountCode = Worksheets(" JEsalesINV")。Cells(RowNo,11).Text
    oJE.Lines.LineMemo = Worksheets(" JEsalesINV")。Cells(RowNo,12).Text
    oJE.Lines.Debit = Worksheets(" JEsalesINV")。Cells(RowNo,13).Text
    oJE.Lines.Reference1 = Worksheets(" JEsalesINV")。Cells(RowNo,14).Text
    oJE.Lines.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,15).Text
    oJE.Lines.ReferenceDate1 = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
    oJE.Lines.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
    oJE.Lines.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
    oJE.Lines.TaxGroup =" O1.1"
   
     oJE.Lines.Add
                
                
     oJE.Lines.AccountCode = Worksheets(" JEsalesINV")。Cells(RowNo,17).Text
     oJE.Lines.LineMemo = Worksheets(" JEsalesINV")。Cells(RowNo,18).Text
     oJE.Lines.Credit = Worksheets(" JEsalesINV")。Cells(RowNo,19).Text
     oJE.Lines.Reference1 = Worksheets(" JEsalesINV")。Cells(RowNo,20).Text
     oJE.Lines.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,21).Text
     oJE.Lines.ReferenceDate1 = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
     oJE.Lines.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
     oJE.Lines.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
    
      oJE.Lines.Add
                                
                
    oJE.Lines.AccountCode = Worksheets(" JEsalesINV")。Cells(RowNo,23).Text
    oJE.Lines.LineMemo = Worksheets(" JEsalesINV")。Cells(RowNo,24).Text
    oJE.Lines.Credit = Worksheets(" JEsalesINV")。Cells(RowNo,25).Text
    oJE.Lines.Reference1 = Worksheets(" JEsalesINV")。Cells(RowNo,26).Text
    oJE.Lines.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,27).Text
    oJE.Lines.ReferenceDate1 = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
    oJE.Lines.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
    oJE.Lines.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
   
    oJE.Lines.Add
                
            lRetCode = oJE.Add
                
            如果lRetCode <> 0然后
               sErrMsg = oCompany.GetLastErrorDescription
               MsgBox sErrMsg
               退出子
                     
             否则,如果iRetCode = 0,则
               行数(行数)。选择
               Selection.Interior.Color = vbRed
                 计数器=计数器+ 1
                 行号=行号+ 1
             万一
                             
                结束选择
  循环


 
capture.jpg (22.9 kB)

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

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


嗨,大家

我们有数千个日记帐分录要发布到SAP Business One中。 因此,我们决定编写一个小程序来完成这项工作。

我们不是使用Visual Studio开发完整的附件,而是决定使用Excel Visual Basic( VBA)处理DI API。

这是我们的策略:

  • 我们有一个Excel工作表,其中包含所有日记帐分录的数据。
  • Excel中的每一行代表一个日记帐分录。
  • 列的范围代表标题数据。
  • 另一列范围表示JE中第一行的条目。
  • 类似于JE中第二行和第三行中的条目。
  • 当我们按下Excel工作表中的按钮时,将执行VBA,并且我们使用循环来确保日记条目逐一发布。
  • 每次发布​​日记帐时,Excel行都被染成红色。
  • 不幸的是,该应用程序无法正常工作。

我们的问题:

如果Excel工作表仅包含1行(1 JE),则将其发布而不会出现问题。

但是,如果Excel工作表包含几行(几个JE),则仅成功发布第一行。 无法发布第二行(第二JE)。 显示此消息:

我们不理解这个问题,因为我们没有尝试过将Dr和Cr张贴在一行中。

无论如何,如果我们删除Excel的第一行,则拒绝发布的第二行现已成功发布。

因此,似乎在执行循环时会出现错误。

希望有人可以提供帮助。

谢谢

利昂

--------------------------------------------------- ----------------------

以下是我们的Excel工作表的图片:

capture1.jpg

--------------------------------------------------- --------------------------

这是我们的VBA代码:

未显示连接详细信息,但它们可以正常工作。

 Dim oCompany作为SAPbobsCOM.Company

 公开子CreateOrder_Click()
     尽可能长的Dim lRetCode
     Dim sErrMsg作为字符串
    
     答案为整数
     昏暗计数器为整数:计数器= 1
     Dim RowNo作为整数:RowNo = 13
    
      '连接到SBO
     登录'//我们没有显示代码,但是可以正常工作

     '声明销售订单DI API对象
     作为SAPbobsCOM.JournalEntries的昏暗对象
     设置oJE = oCompany.GetBusinessObject(oJournalEntries)
      
     如果(Worksheets(" JEsalesINV")。Cells(RowNo,1)="")然后
     MsgBox"没有更多条目可发布!",vbExclamation
     退出子
 万一

 答案= MsgBox("发布日记条目?",vbYesNo + vbQuestion + vbDefaultButton2)

 如果答案= vb否
     退出子
 万一
       
        '=================================================  ===================
          'Journal Entry工作表= JEsalesINV
        '=================================================  ===================
       
                  
 同时执行(Worksheets(" JEsalesINV")。Cells(RowNo,1)<>""和Counter <= 10)
          
              NoOfRows = Worksheets(" JEsalesINV")。Cells(RowNo,10).Text
              '//有些JE有2行,有些3

              选择Case NoOfRows'//日记帐分录中的行数
                
               情况2'//如果日记帐分录中有2行
                
                 '-----------------------
                 标题日记帐分录
                 '----------------------
                        
           oJE.ReferenceDate = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
           oJE.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
           oJE.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
           oJE.Memo = Worksheets(" JEsalesINV")。Cells(RowNo,6).Text
           oJE.Reference = Worksheets(" JEsalesINV")。Cells(RowNo,7).Text
           oJE.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,8).Text
                                      
                 '---------------------------------------
                 '日记帐分录-第1和2行的详细信息
                 '---------------------------------------
                                               
     oJE.Lines.AccountCode = Worksheets(" JEsalesINV")。Cells(RowNo,11).Text
     oJE.Lines.LineMemo = Worksheets(" JEsalesINV")。Cells(RowNo,12).Text
     oJE.Lines.Debit = Worksheets(" JEsalesINV")。Cells(RowNo,13).Text
     oJE.Lines.Reference1 = Worksheets(" JEsalesINV")。Cells(RowNo,14).Text
     oJE.Lines.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,15).Text
     oJE.Lines.ReferenceDate1 = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
     oJE.Lines.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
     oJE.Lines.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
     oJE.Lines.TaxGroup =" O1.1"

     oJE.Lines.Add

     oJE.Lines.AccountCode = Worksheets(" JEsalesINV")。Cells(RowNo,17).Text
     oJE.Lines.LineMemo = Worksheets(" JEsalesINV")。Cells(RowNo,18).Text
     oJE.Lines.Credit = Worksheets(" JEsalesINV")。Cells(RowNo,19).Text
     oJE.Lines.Reference1 = Worksheets(" JEsalesINV")。Cells(RowNo,20).Text
     oJE.Lines.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,21).Text
     oJE.Lines.ReferenceDate1 = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
     oJE.Lines.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
     oJE.Lines.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
                              
     oJE.Lines.Add
                             
                
         lRetCode = oJE.Add
                
         如果lRetCode <> 0然后
          sErrMsg = oCompany.GetLastErrorDescription
          MsgBox sErrMsg
          退出子
                     
                   否则,如果iRetCode = 0,则
                              
             '//在Excel中发布行后,我们将行涂成红色
                 行数(行数)。选择
                 Selection.Interior.Color = vbRed
                             
                 计数器=计数器+ 1
                 行号=行号+ 1
                 万一
                       
                         
                 情况3'//如果日记帐分录中有3行
                 '-----------------------
                 标题日记帐分录
                 '----------------------
           oJE.ReferenceDate = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
           oJE.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
           oJE.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
           oJE.Memo = Worksheets(" JEsalesINV")。Cells(RowNo,6).Text
           oJE.Reference = Worksheets(" JEsalesINV")。Cells(RowNo,7).Text
           oJE.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,8).Text
        
                 '-------------------------------------------
                 '日记帐分录-第1,2和3行的详细信息
                 '--------------------------------------------
                
    oJE.Lines.AccountCode = Worksheets(" JEsalesINV")。Cells(RowNo,11).Text
    oJE.Lines.LineMemo = Worksheets(" JEsalesINV")。Cells(RowNo,12).Text
    oJE.Lines.Debit = Worksheets(" JEsalesINV")。Cells(RowNo,13).Text
    oJE.Lines.Reference1 = Worksheets(" JEsalesINV")。Cells(RowNo,14).Text
    oJE.Lines.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,15).Text
    oJE.Lines.ReferenceDate1 = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
    oJE.Lines.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
    oJE.Lines.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
    oJE.Lines.TaxGroup =" O1.1"
   
     oJE.Lines.Add
                
                
     oJE.Lines.AccountCode = Worksheets(" JEsalesINV")。Cells(RowNo,17).Text
     oJE.Lines.LineMemo = Worksheets(" JEsalesINV")。Cells(RowNo,18).Text
     oJE.Lines.Credit = Worksheets(" JEsalesINV")。Cells(RowNo,19).Text
     oJE.Lines.Reference1 = Worksheets(" JEsalesINV")。Cells(RowNo,20).Text
     oJE.Lines.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,21).Text
     oJE.Lines.ReferenceDate1 = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
     oJE.Lines.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
     oJE.Lines.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
    
      oJE.Lines.Add
                                
                
    oJE.Lines.AccountCode = Worksheets(" JEsalesINV")。Cells(RowNo,23).Text
    oJE.Lines.LineMemo = Worksheets(" JEsalesINV")。Cells(RowNo,24).Text
    oJE.Lines.Credit = Worksheets(" JEsalesINV")。Cells(RowNo,25).Text
    oJE.Lines.Reference1 = Worksheets(" JEsalesINV")。Cells(RowNo,26).Text
    oJE.Lines.Reference2 = Worksheets(" JEsalesINV")。Cells(RowNo,27).Text
    oJE.Lines.ReferenceDate1 = Worksheets(" JEsalesINV")。Cells(RowNo,3).Text
    oJE.Lines.TaxDate = Worksheets(" JEsalesINV")。Cells(RowNo,5).Text
    oJE.Lines.DueDate = Worksheets(" JEsalesINV")。Cells(RowNo,4).Text
   
    oJE.Lines.Add
                
            lRetCode = oJE.Add
                
            如果lRetCode <> 0然后
               sErrMsg = oCompany.GetLastErrorDescription
               MsgBox sErrMsg
               退出子
                     
             否则,如果iRetCode = 0,则
               行数(行数)。选择
               Selection.Interior.Color = vbRed
                 计数器=计数器+ 1
                 行号=行号+ 1
             万一
                             
                结束选择
  循环


 
capture.jpg (22.9 kB)
付费偷看设置
发送
5条回答
SAP砖家
1楼 · 2020-09-06 07:11.采纳回答

您好,Leon,

每次循环时,都需要再次重新初始化JournalEntries对象。

移动行代码:

设置oJE = oCompany.GetBusinessObject(oJournalEntries)

要进入循环,可以在将值分配给NoOfRows变量之前添加此行。

希望有帮助。

亲切的问候,

Diego Lother

xfwsx85
2楼-- · 2020-09-06 07:31

嗨,首先,对您建议的智能解决方案表示了很多赞赏。

我有很大的差距要解决:如何将SBO库引用到VBA环境中?

预先感谢您

小灯塔
3楼-- · 2020-09-06 07:19

Hi Diego,

非常感谢您的回答。

它创造了奇迹!

现在,我的程序可以正常运行了。

它在不到5分钟的时间内发布了1000个J.Entries!

最好的问候

Leon

当学会了学习
4楼-- · 2020-09-06 07:14

嗨,大家好...

您可以赞这个Excel工作表吗? 从旧版系统导入大量数据到内部日记条目中,我们面临着一些困难。

最诚挚的问候,

Wagner

Bunny_CDM
5楼-- · 2020-09-06 07:06

罪恶

44分钟前

首先,您对您建议的智能解决方案表示赞赏。

我有很大的差距要解决:如何将SBO库引用到VBA环境中?

提前谢谢

----

嗨,

打开Excel,VBA屏幕

选择工具>参考

> SAP Business One DI API版本9

希望有帮助

一周热门 更多>