2011-01-14 14 views
1

Excel用の関数を作成しようとしています。この関数は、コンボボックスまたはリストボックス内の特定の文字列のインデックスを計算するために使用されます。私は、次のシグネチャを持っている機能を希望:私は交換できるようにコンボボックスやリストボックスに対する共通のスーパーがある場合VBAコンボボックスとリストボックス共通スーパークラス

Public Function MyIndexOf(list As ???, str As String) As Integer 

私の質問は?いくつかのクラスで。

多分、IndexOfを実行する別の方法があります。提案は大歓迎ですが、私はそれを共通の別個の機能で実行したいと思います。

誰かがこれを解決する方法について提案していますか?事前に

おかげ /パトリック

答えて

4

VBA(またはVB 6)には継承はありませんので、残念ながらスーパーのようなものはありません。

ただし、非常に緩いタイピングの利点があります。変数をVariantとして宣言することができます。これは、コントロールを含むあらゆるタイプの値を保持できる汎用データ型です。一般的には、Variantタイプを使用してを避けてください。可能な場合は、この場合はほとんど選択肢がありません。

ですから、このようなあなたの機能を宣言することができます:Variantデータ型は、本当に価値のあらゆるタイプを保持し、タイプが実行されるまで知られていないことができることを思い出して、もちろん

Public Function MyIndexOf(list As Variant, str As String) As Integer 
    ' Do work here... 
End Function 


指定された型がIntegerまたはStringでないこと、またはComboBoxまたはListBoxコントロールと同じパブリックメンバーを公開していないコントロールであることを確認することができます(このように、 1つは)。

TypeName機能を使用して、実行時にVariantの実際のタイプを判別することができます。だから、単純に渡されるComboBoxまたはListBox制御以外のものに対して保護するガード条項を含めるように上記の機能を変更できます。

Public Function MyIndexOf(list As Variant, str As String) As Integer 
    If (Not TypeName(list) = "ComboBox") And (Not TypeName(list) = "ListBox") Then 
     MsgBox "Wrong type of list variable was specified." 
    Else 
     ' Do work here... 
    End If 
End Function 
+0

あなたは '型名(リスト)'を意味しないのですか? – systemovich

+0

@Geoffrey:もちろんです。良いキャッチ。私はあなたがその変数の名前を教えてくれると思います。修正されました。 –

+0

ありがとうございます – PKeno

関連する問題