我编写了一个基本的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
答案 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