如何抑制由EPM加载项

时间:2018-06-11 13:26:53

标签: excel-vba epm vba excel

我编写了一个基本的VBA脚本来模拟excel中的用户菜单功能。它与SAP BPC的EPM加载项交互,并且面临一个问题,如果它抛出.NET错误" InvalidArgument =' 0'对于' index'"无效。 (以下错误的更多细节)

代码的目标是,在EPM上下文菜单中选择更改实体维度时,将选择相应的菜单(excel电子表格的excel选项卡)(以及其他隐藏的)。 实际上,实体维度有一个属性HotelType,有3种可能的类型Lease,Manag&管理员。 EPM公式EPMMemberProperty()将分别为每个选项卡检索此类型,在VBA中,这将是选择相应菜单选项卡的条件。

考虑到Office Office和SAP EPM之间的安排婚姻已达到办公室365和SAP BPC 10.0的历史深度,我试图仅使用VBA但无济于事。 我尝试了 Worksheet_Change(ByVal Target As Range) Sub Worksheet_Calculate(),但EPM上下文更改不会触发这些。

所以我选择了EPM 功能AFTER_CONTEXTCHANGE(),除了它抛出它之外,它还能正确执行。 NET错误在某些情况下,当按下继续时代码继续并正确完成,但是我希望用户不要面对这个。

完全具有有限的编程技能,我猜这是一个错误,即没有(或丢失)在EPM上下文菜单中代表实体选择的列表的选择。从下面的错误代码我可以看到这个选择实际上是一个组合框,但由于它是EPM加载项的一部分,我不知道如何从VBA引用/控制它。

丑陋但非常诱人的 On error resume next 无效。

在我的代码中可能存在初学者的错误,所以非常感谢所有帮助。

亲切的问候,

维姆

.NET错误" InvalidArgument =' 0'的值对于索引'"

无效
************** Exception Text **************
System.ArgumentOutOfRangeException: InvalidArgument=Value of '0' is not valid for 'index'.
Parameter name: index
   at System.Windows.Forms.ComboBox.ObjectCollection.get_Item(Int32 index)
   at FPMXLClient.UILayer.Controls.CurrentViewComboBox.DrawComboBox(DrawItemEventArgs e, Boolean rezisable, Boolean inverseText) in d:\Olympus_100_REL_XLCLIENT\src\FPMXLClient\src\UILayer\UI\Controls\CurrentView\CurrentViewComboBox.cs:line 570
   at FPMXLClient.UILayer.Controls.CurrentViewComboBox.OnDrawItem(DrawItemEventArgs e) in d:\Olympus_100_REL_XLCLIENT\src\FPMXLClient\src\UILayer\UI\Controls\CurrentView\CurrentViewComboBox.cs:line 561
   at System.Windows.Forms.ComboBox.WmReflectDrawItem(Message& m)
   at System.Windows.Forms.ComboBox.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

VBA上下文更改代码

Function AFTER_CONTEXTCHANGE()
Dim ShName As String
     ShName = ActiveSheet.Name
     Select Case ShName
        Case "Fin_L"
            Call ContextChange_FinL
        Case "Fin_M"
            Call ContextChange_FinM
        Case "Fin_A"
            Call ContextChange_FinA
        End Select
End Function

Sub ContextChange_FinL()
Dim HotelType As String
HotelType = Range("HotelType_FinL")
Select Case HotelType
Case "LEASE"
        Sheets("Fin_L").Visible = True
        Sheets("Fin_M").Visible = xlVeryHidden
        Sheets("Fin_A").Visible = xlVeryHidden
        Sheets("Fin_L").Select
    Case "MANAG"
        Sheets("Fin_M").Visible = True
        Sheets("Fin_L").Visible = xlVeryHidden
        Sheets("Fin_A").Visible = xlVeryHidden
        Sheets("Fin_M").Select
    Case "ADMIN"
        Sheets("Fin_A").Visible = True
        Sheets("Fin_L").Visible = xlVeryHidden
        Sheets("Fin_M").Visible = xlVeryHidden
        Sheets("Fin_A").Select
End Select
End Sub

Sub ContextChange_FinM()
Dim HotelType As String
HotelType = Range("HotelType_FinM")

    Select Case HotelType
    Case "LEASE"
        Sheets("Fin_L").Visible = True
        Sheets("Fin_M").Visible = xlVeryHidden
        Sheets("Fin_A").Visible = xlVeryHidden
        Sheets("Fin_L").Select
    Case "MANAG"
        Sheets("Fin_M").Visible = True
        Sheets("Fin_L").Visible = xlVeryHidden
        Sheets("Fin_A").Visible = xlVeryHidden
        Sheets("Fin_M").Select
    Case "ADMIN"
        Sheets("Fin_A").Visible = True
        Sheets("Fin_L").Visible = xlVeryHidden
        Sheets("Fin_M").Visible = xlVeryHidden
        Sheets("Fin_A").Select
    End Select
End Sub

Sub ContextChange_FinA()
Dim HotelType As String
HotelType = Range("HotelType_FinA")

    Select Case HotelType
    Case "LEASE"
        Sheets("Fin_L").Visible = True
        Sheets("Fin_M").Visible = xlVeryHidden
        Sheets("Fin_A").Visible = xlVeryHidden
        Sheets("Fin_L").Select
    Case "MANAG"
        Sheets("Fin_M").Visible = True
        Sheets("Fin_L").Visible = xlVeryHidden
        Sheets("Fin_A").Visible = xlVeryHidden
        Sheets("Fin_M").Select
        Case "ADMIN"
        Sheets("Fin_A").Visible = True
        Sheets("Fin_L").Visible = xlVeryHidden
        Sheets("Fin_M").Visible = xlVeryHidden
        Sheets("Fin_A").Select
End Select
End Sub

1 个答案:

答案 0 :(得分:0)

这个问题并不一致,但似乎是由隐藏工作表的步骤引发的。因此,仅在选择目标工作表之后移动源工作表的隐藏(当与目标不同时)才会阻止此操作。

示例:

    Sub ContextChange_FinM()
     HotelType = Range("HotelType_FinM")

        Select Case HotelType
    Case "LEASE"
            If Sheets("Fin_L").Visible = xlVeryHidden Then Sheets("Fin_L").Visible = True Else 'do nothing
            Sheets("Fin_L").Select
            Sheets("Fin_M").Visible = xlVeryHidden

    Case "MANAG"
        'do nothing
 Case "ADMIN"
        If Sheets("Fin_A").Visible = xlVeryHidden Then Sheets("Fin_A").Visible = True Else 'do nothing
        Sheets("Fin_A").Select
        Sheets("Fin_M").Visible = xlVeryHidden

    End Select
End Sub