我编写了一个基本的VBA脚本来模拟excel中的用户菜单功能。它与SAP的EPM外接程序交互,如果它抛出.NET错误“'0‘的InvalidArgument=Value对’索引‘无效”,则面临一个问题。(下面是错误的更多细节)
代码的目标是,在EPM上下文菜单中实体维度的选择更改后,将选择相应的菜单(excel电子表格的excel选项卡)(而其他菜单则隐藏)。实际上,实体维度有一个属性HotelType,它有3种可能的类型Lease & Admin。EPM公式EPMMemberProperty()将分别为每个选项卡检索这种类型,在VBA中,这将是选择相应菜单选项卡的条件。
考虑到Ms和SAP EPM之间的包办婚姻已经达到了所有的时间深度,Office 365和SAP BPC 10.0,我尝试只使用VBA,但没有效果。我尝试了Worksheet_Change(ByVal Target As Range)和Sub Worksheet_Calculate(),但是EPM上下文的更改并不会触发它们。
因此,我选择了EPM函数AFTER_CONTEXTCHANGE(),它除了抛出这个函数之外,还正确执行。NET错误,在某些情况下,当按下“继续”时,代码将继续并正确完成,但是我希望用户不要面对这种情况。
由于编程技能完全有限,我猜想这是一个错误,没有(或丢失)在EPM上下文菜单中重新表示实体选择的列表选择。从下面的错误代码中我可以看到,这个选择实际上是一个组合框,但是由于它是EPM外接程序的一部分,所以我不知道如何从VBA中引用/控制它。
丑陋,但非常诱人的错误简历下一次不起作用。
在我的代码中可能有初学者的错误,所以所有的帮助都是值得感谢的。
致以亲切的问候,
威姆
.NET错误"InvalidArgument=Value of '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发布于 2018-06-18 13:30:34
这个问题不一致,但似乎是由隐藏工作表的步骤触发的。因此,只有在选择目标表之后才移动源工作表的隐藏(当与目标表不同时),这将阻止这一点。
示例:
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 Subhttps://stackoverflow.com/questions/50798842
复制相似问题