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

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将此字符串转换为已知的常量值?


1
xlTotalsCalculationAverage 的值为2。你是如何将该值存储在字符串中的? - Siddharth Rout
我的错,我看错了表格行。但那并不是问题所在。 - Demosthenex
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

但实际上,不要这样做。


哇,这就是...哇。创建一个临时程序和模块只是为了评估一个常量...我不会这样做。 - Demosthenex
@Demosthenex:如果您不打算分发代码,那么我可能有一个使用TLIApplication的解决方案。如果您感兴趣,请告诉我。 - Siddharth Rout
在使用此代码之前,必须添加对Microsoft Visual Basic for Applications Extensibility 5.3库的引用。而“modTemp”应该是一个已经存在的模块。 - sancho.s ReinstateMonicaCellio
我尝试过这个,但无法使其工作。问题如下:1)我在单元格公式中输入=WhatIsTheValue("vbOKCancel"),但得到的是0而不是1。2)在函数末尾添加Debug.Print WhatIsTheValue后,按下Enter键后,它会继续输入WhatIsTheValue(新的1会不断添加到立即窗口)。3)尝试保存工作簿时,会出现对话框“计算未完成。在保存之前重新计算?”4)即使在VB IDE中按下Reset1仍然会不断弹出。所有这些都可能是同一个问题的症状。 - sancho.s ReinstateMonicaCellio
我从未将其作为工作表函数进行测试 - 以这种方式运行的代码与“常规”(从VBA调用)函数相比具有显着的限制。我并不惊讶它作为UDF存在问题。 - Tim Williams
显示剩余3条评论

0

由于没有真正实用的解决方案,通常会卡在编写自己的 switch 语句上。就我所知,.NET Interop 库和 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

诚然,在您的项目中包含数千个模块并不实际,但您真正需要这种功能的情况相当罕见,所以我建议仅在特定场合包含我需要的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接