Converting a string representation of a constant into a constant?

前端 未结 2 515
礼貌的吻别
礼貌的吻别 2020-11-30 15:35

I\'m trying to accept a formatting constant from a data cell, so I have a string \"xlTotalsCalculationAverage\". How can I translate that into the Excel constant it represen

相关标签:
2条回答
  • 2020-11-30 15:57

    There's always this:

    Sub Tester()
        MsgBox WhatIsTheValue("xlTotalsCalculationAverage")
        MsgBox WhatIsTheValue("xlTotalsCalculationCountNums")
    End Sub
    
    
    
    Function WhatIsTheValue(s As String) As Variant
    
            Dim VBProj As VBIDE.VBProject
            Dim VBComp As VBIDE.VBComponent
            Dim CodeMod As VBIDE.CodeModule
            Set VBProj = ActiveWorkbook.VBProject
            Set VBComp = VBProj.VBComponents("modTemp")
            Set CodeMod = VBComp.CodeModule
    
            With CodeMod
                .DeleteLines 1, .CountOfLines
                .InsertLines 1, "Public Function GetEnumVal()"
                .InsertLines 2, "GetEnumVal = " & s
                .InsertLines 3, "End Function"
            End With
            WhatIsTheValue = Application.Run("GetEnumVal")
    
    End Function
    

    But really - don't do that.

    0 讨论(0)
  • 2020-11-30 16:13

    Since there is no really practical solution, you're generally stuck writing your own switch statements. Since the enums of the .NET Interop Libraries and VBA are, as far as I know, always the same, I wrote a program that generates VBA modules for each public enum inside a (list of) dll's. Here's the output for my Office.Core, PowerPoint, Word, Excel, Publisher and Outlook dll's:

    https://gitlab.com/jbjurstam/VbaHelpers/tree/master/GenerateVbaEnumHelpers/bin/Release/output

    Here's an example of the code it generates for each enum:

    Attribute VB_Name = "wMsoHyperlinkType"
    Function MsoHyperlinkTypeFromString(value As String) As MsoHyperlinkType
        If IsNumeric(value) Then
            MsoHyperlinkTypeFromString = CInt(value)
            Exit Function
        End If
    
        Select Case value
            Case "msoHyperlinkRange": MsoHyperlinkTypeFromString = msoHyperlinkRange
            Case "msoHyperlinkShape": MsoHyperlinkTypeFromString = msoHyperlinkShape
            Case "msoHyperlinkInlineShape": MsoHyperlinkTypeFromString = msoHyperlinkInlineShape
        End Select
    End Function
    
    Function MsoHyperlinkTypeToString(value As MsoHyperlinkType) As String
        Select Case value
            Case msoHyperlinkRange: MsoHyperlinkTypeToString = "msoHyperlinkRange"
            Case msoHyperlinkShape: MsoHyperlinkTypeToString = "msoHyperlinkShape"
            Case msoHyperlinkInlineShape: MsoHyperlinkTypeToString = "msoHyperlinkInlineShape"
        End Select
    End Function
    

    Admittedly, it's not practical to include thousand modules in your project, but it's quite rare that you really need this kind of functionality, so I'd just include the things I need at the particular occasion.

    0 讨论(0)
提交回复
热议问题