3

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

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

是静态表示。

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

是我的目标。

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

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

4

2 回答 2

9

总有这样的:

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

但真的 - 不要那样做。

于 2012-04-05T23:16:38.397 回答
0

由于没有真正实用的解决方案,您通常会被困在编写自己的 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

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

于 2016-06-15T09:15:44.727 回答