- ベストアンサー
VBA dictionary getkeys返り値
エクセルVBAの話です。 dictionaryオブジェクトのgetkeysメソッドを、 keyが1つも登録されていないときに使ったときに、 返り値をウォッチウィンドウで見ると、 型「Variant/Variant(0 to -1)」 その中身の値「<変数なし>」 と表示されています。 この返り値の挙動が、 プログラムを組む上で便利なので、 自作の関数でも、 同じような返り値を返したいのですが、 どのように値を代入するといいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.3 補足・訂正です。 失念していましたが、Array()関数(メソッド)だけで出来ましたね。 /// Dim ret ret = VBA.Array() Debug.Print "ret :", "Variant/Variant(" & LBound(ret) & " to "; UBound(ret) & ")" ' ---> Variant/Variant(0 to -1) /// Dim ret() ret() = VBA.Array() Debug.Print "ret() :", "Variant(" & LBound(ret()) & " to "; UBound(ret()) & ")" ' ---> Variant(0 to -1) /// 例えば、 Option Base 1 と宣言されたモジュールで、普通のArray()関数を使うと、 ret = Array() ' ---> Variant/Variant(1 to 0) ret() = Array() ' ---> Variant(1 to 0) などのようになります。 VBA.Array() のようにVBAクラスの方の関数を使っているのは、 Option Baseに左右されずに配列(0 to -1)を実現する意味です。 Option Base 1 と宣言されたモジュールであっても、 ret = VBA.Array() ' ---> Variant/Variant(0 to -1) ret() = VBA.Array() ' ---> Variant(0 to -1) というように固定する為に、似ているけど異なる関数を使っています。 もちろん、Option Baseを弄らないのなら、 普通にArray()関数で十分です。 No.3で提示したFilter()関数(メソッド)は必要ではありませんでした。 ただ、個人的に(Filter()関数単体では)使ったことある手法でしたし、 配列に対してマッチするものが無かった場合の戻り値が Nullではなくて配列(0 to -1)になることや、 配列(0 to -1)によってその後の処理を簡素化出来るという意味での 配列(0 to -1)の用例としては、結果的に、概念的な理解に役立つのかも、です。 あらためて以上です。
その他の回答 (3)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 > この返り値の挙動が、 > プログラムを組む上で便利なので、 具体的にどのような特性(挙動)をどう活用したいか添えた方が答え易いのかな と思いました。 例えば、関数からの戻り値を配列に限定した上で、 UBoundで判別する とか、 For i = 0 To UBound(v) のようなループで判別を省略したい とか、そういった意味合いで仰っているのならば、 簡単にやるなら例えば以下のような。 /// ret = Filter(Array(0), 1) ' Debug.Print "Variant/String(" & LBound(ret) & " to "; UBound(ret) & ")" /// Objectを扱わずに関数のみで配列(0 to -1)を生成する簡素なやり方という趣旨です。 (VBA > Strings クラスのFilter関数ですので、 Option Base に左右されずに 0 to -1 で返ります。) Variant/Variant(0 to -1) というご要望ですが、(何かあったような気もしますが)俄かに思い出せないので、 Variant/String(0 to -1) で、お応えしますが、どのみち要素を持たない配列ですから、内部型式は関係ないかと。 Dim や ReDimなどのステートメントや、関数単体などで実現させる方法を 期待されていたのだとしたら、それは無いんだろうと思います。 (そもそもメソッド実行時の戻り値の為にあるのが 配列(0 to -1) なのでしょうから。) 配列(0 to -1)を返すメソッドというのもExcel_VBAではレアですから、 お作りの関数内で条件判別を経てダミー値を返すことになるのはほぼ避けようがないかと。 ご提示の通り、 DictionaryオブジェクトのKeysメソッド で取得したVariant/Variant(0 to -1)をスタティックな変数に格納しておいて その変数を参照して返すだけの関数なりプロパティを用意しておく ようなやり方でもいいような気はします。 ただ、配列(0 to -1)自体、 Excel_VBA的には割とレガシー寄りな扱い方ですし一般的なものではありませんから、 上述のよな設計を意図しているのだとすると、他人がデバッグするのは難しいですよね。 まぁ提供する関数なら問題になることも無いのでしょうけれど、一応注意喚起だけ。 以上です。
補足
>具体的にどのような特性(挙動)をどう活用したいか添えた方が答え易いのかなと思いました。 配列の返り値を受け取った後、その返り値の「配列」をfor eachでループさせます。 問題は該当データがない場合です。 該当するデータがない場合には、for eachループの中身を実行せずに、そのまま後続処理に進ませたいと思っていました。 当初は「Nothing」を返り値にセットしていたのですが、そうすると、for eachループでエラーが発生してしまいました。 一方で、Variant/Variant(0 to -1)の型だと、for eachループの中身に入らず、そのまま次のステップに進めるようだったので、この返り値を作り出せないか? というのが質問の趣旨です。
- Nouble
- ベストアンサー率18% (330/1783)
それか 此クラスの、話し ですよね? 未セットか、検査させて ツルーなら そんな値を、返させる ご希望の、値を 作れば の、話し ですが 此でも、良いのでは?
- Nouble
- ベストアンサー率18% (330/1783)
間違えている かも、知れません お許しください もし ご自身で Variant/Variant(0 to -1) な、 値を、作れるなら Optionalキーワードで http://excelwork.info/excel/optional/ http://www.relief.jp/itnote/archives/001832.php 「Variant/Variant(0 to -1」 に、成るような 値を、設定しておく と、言うのは 如何ですか?
お礼
ありがとうございます。 確かに、Array関数で作れました。 for each関数の中身を一回も通らない「配列」を作りたかったのですが、まさしく「空の配列」を作る、という文を作ればよかったのですね。 上記のような用途なので、option base0,1どちらでも問題はありませんので、単にarray関数で空配列を生成しようと思います。 大変助かりました! ありがとうございます。