2012-04-05 9 views
3

データセルから書式定数を受け入れるため、「xlTotalsCalculationAverage」という文字列があります。どのようにしてそれを表すExcel定数に変換できますか?定数xlTotalsCalculationAverageは整数2に等しい。定数の文字列表現を定数に変換しますか?

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

は静的な表現です。

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

です。

私は大文字かswitch文を作ることができましたが、考えられるすべての値を複製するのは愚かなようです。

この文字列を既知の定数値に変換するにはどうすればよいですか?

+1

'xlTotalsCalculationAverage'の値は2です。その文字列にどのように値を格納していますか? –

+0

私の悪い、間違ったテーブルの行を見て。しかし、それは本当に問題ではありません。 – Demosthenex

答えて

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 

しかし、実際に - それをしません。

+0

うわー、それはちょうど...うわーです。定数を評価するための一時的なプログラムとモジュールを作成する...私はそれをしません。 – Demosthenex

+0

これはあなたの唯一の選択肢でした!私は変換を処理するために 'Select'ブロックを作成することに固執していると思います:実際にはもっと人間に読めるオプションを使うことができるので、もっと良いアプローチだと思います。私はむしろ "平均"のような "xlTotalsCalculationAverage"のような値を持つリストから選択したいと思うでしょう。 –

+1

質問を実際に理解するために+1: –

0

本当に実用的な解決法はないので、あなたは通常、自分のスイッチステートメントを書き留めています。 .NET Interop LibrariesとVBAの列挙型は、私が知る限り、常に同じであるため、dllのリストの中の各パブリック列挙体のVBAモジュールを生成するプログラムを作成しました。ここに私のOffice.Core、パワーポイント、ワード、エクセル、出版社および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 

、プロジェクトに何千ものモジュールを含めることは現実的ではありませんが、この種の機能が本当に必要なことはまれです。そのため、必要なものを取り入れるだけです。

関連する問題