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 Interop Libraries と 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 に答える