0

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

1 回答 1

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
于 2018-06-18T13:30:34.777 回答