将常量的字符串表示形式转换为常量?
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
诚然,在您的项目中包含数千个模块是不切实际的,但您真正需要这种功能的情况很少见,所以我只会在特定场合包含我需要的东西。
【讨论】:
以上是关于将常量的字符串表示形式转换为常量?的主要内容,如果未能解决你的问题,请参考以下文章