我编写了一个基本的 VBA 脚本来模拟 excel 中的用户菜单功能。它与 SAP BPC 的 EPM 插件交互,如果它引发 .NET 错误“InvalidArgument=Value of '0' is not valid for 'index'”,则面临一个问题。(下面有更多的错误细节)
代码的目标是,在 EPM 上下文菜单中选择实体维度时,将选择相应的菜单(excel 电子表格的 excel 选项卡)(而其他菜单将被隐藏)。实际上,实体维度有一个属性 HotelType,它有 3 种可能的类型 Lease、Manag 和 Admin。EPM 公式 EPMMemberProperty() 将分别为每个选项卡检索此类型,在 VBA 中,这将是选择相应菜单选项卡的标准。
考虑到 Office 365 和 SAP BPC 10.0 女士 Office 和 SAP EPM 之间的包办婚姻已经达到了前所未有的深度,我尝试仅使用 VBA,但无济于事。我尝试了Worksheet_Change(ByVal Target As Range)和Sub Worksheet_Calculate()但 EPM 上下文更改不会触发这些。
所以我选择了 EPM函数 AFTER_CONTEXTCHANGE(),除了它抛出 this 之外,它可以正确执行。NET 错误在某些情况下,当按下继续时,代码会继续并正确完成,但是我希望用户不要面对这个问题。
由于完全有限的编程技能,我猜这是一个错误,即没有(或丢失)在 EPM 上下文菜单中选择表示实体选择的列表。从下面的错误代码中我可以看到它实际上是一个组合框,但由于它是 EPM 插件的一部分,我不知道如何从 VBA 引用/控制它。
丑陋但非常诱人的On error resume next不起作用。
我的代码中可能存在初学者的错误,因此感谢所有帮助。
亲切的问候,
维姆
.NET 错误“InvalidArgument = '0' 的值对 'index' 无效”
************** 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