如何禁止显示由 EPM 加载项触发的 .NET 错误消息



我编写了一个基本的VBA脚本来模拟excel中的用户菜单功能。它与 SAP BPC 的 EPM 加载项交互,如果它抛出 .NET 错误"InvalidArgument='0' 的值对'索引'无效",则面临问题。(错误详情见下文(

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

考虑到办公室女士和SAP EPM之间的包办婚姻已经达到了Office 365和SAP BPC 10.0的历史深度,我尝试仅使用VBA,但无济于事。 我尝试了Worksheet_Change(ByVal 目标作为范围(子 Worksheet_Calculate((,但 EPM 上下文更改不会触发这些。

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

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

丑陋但非常诱人的在错误恢复下一个不起作用。

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

亲切问候

维姆

.NET 错误"无效参数='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_XLCLIENTsrcFPMXLClientsrcUILayerUIControlsCurrentViewCurrentViewComboBox.cs:line 570
at FPMXLClient.UILayer.Controls.CurrentViewComboBox.OnDrawItem(DrawItemEventArgs e) in d:Olympus_100_REL_XLCLIENTsrcFPMXLClientsrcUILayerUIControlsCurrentViewCurrentViewComboBox.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

该问题不一致,但似乎是由隐藏工作表的步骤触发的。因此,仅在选择目标工作表后移动源工作表的隐藏(当与目标不同时(可以防止这种情况。

例:

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

相关内容

最新更新