将常量的字符串表示形式转换为常量?

Posted

技术标签:

【中文标题】将常量的字符串表示形式转换为常量?【英文标题】:Converting a string representation of a constant into a constant? 【发布时间】:2012-04-05 22:09:05 【问题描述】:

我正在尝试接受来自数据单元格的格式常量,所以我有一个字符串“xlTotalsCalculationAverage”。如何将其转换为它所代表的 Excel 常量;常量xlTotalsCalculationAverage 等于整数2。

ActiveSheet.ListObjects(1).ListColumns(RemainingHeader).TotalsCalculation = xlTotalsCalculationAverage

是静态表示。

TargetTotal = something("xlTotalsCalculationAverage")
ActiveSheet.ListObjects(1).ListColumns(RemainingHeader).TotalsCalculation = TargetTotal

是我的目标。

我可以做一个很大的 case 或 switch 语句,但是复制所有可能的值似乎很愚蠢。

如何让 Excel 将此字符串转换为已知的常量值?

【问题讨论】:

xlTotalsCalculationAverage 的值是 2。您如何将值存储在该字符串中? 我的错,看错了表格行。但这真的不是问题。 【参考方案1】:

总是这样:

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

但真的 - 不要那样做。

【讨论】:

哇,这只是......哇。创建一个临时程序和模块只是为了评估一个常量......我不会那样做。 好吧,那是你唯一的选择!我认为你坚持创建一个 Select 块来处理翻译:事实上我会说这是一种更好的方法,因为你可以使用更多的“人类可读”选项。我宁愿从具有“平均值”之类的值的列表中进行选择,而不是“xlTotalsCalculationAverage”... @Demosthenex:如果您不打算分发代码,那么我可能会使用TLIApplication为您提供解决方案@如果您有兴趣,请告诉我? 我们在这里达成的共识是 Excel 没有真正的“评估”,也没有简单的方法来表示 LookupInConstantSymbolTable(string)... 我希望有一个简单的方法,我只是而是制作一个案例块。重复很烦人,但这是 VBA。 在使用此代码之前必须add a reference to the Microsoft Visual Basic for Applications Extensibility 5.3 library。并且“modTemp”应该是以前存在的模块。【参考方案2】:

由于没有真正实用的解决方案,您通常会陷入编写自己的 switch 语句的困境。据我所知,由于 .NET 互操作库和 VBA 的枚举始终相同,因此我编写了一个程序,为 dll (列表)中的每个公共枚举生成 VBA 模块。这是我的 Office.Core、PowerPoint、Word、Excel、Publisher 和 Outlook dll 的输出:

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

这是它为每个枚举生成的代码示例:

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

诚然,在您的项目中包含数千个模块是不切实际的,但您真正需要这种功能的情况很少见,所以我只会在特定场合包含我需要的东西。

【讨论】:

以上是关于将常量的字符串表示形式转换为常量?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的常量和常量的表现形式及进制的转换

C语言语法的实型常量定义及其判断

javascript中如何将获得的整型数值转换为字节数组

C++ 不推荐将字符串常量转换为 'char*'

将字符串宏/常量转换为宽字符/Unicode

java笔记