- ベストアンサー
なぜString型ではだめなのか
GetOpenFilename メソッドのヘルプに記載してある fileToOpen = Application _ .GetOpenFilename("テキスト ファイル (*.txt), *.txt") If fileToOpen <> False Then MsgBox "選択されたファイル : " & fileToOpen End If というマクロを実行したいのですが変数の宣言をしているため 「fileToOpen」の部分がエラーになってしまいます。 なので Dim fileToOpen As String を付け加えましたが 次は 「If fileToOpen <> False Then」 でエラーになります。 なので Dim fileToOpen As Variant にしたらうまくいきました。 しかしVariant型は使わないほうがいいと教わったのですが この場合はこれしかないのでしょうか? またなぜString型ではエラーになるのでしょうか? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
GetOpenFilenameの、使用例ではなく、メソッドのヘルプの方をご覧になって下さい。(当方XL2000) >ユーザーによって選択、または入力したファイルの名前とパス名を返します。 >引数 MultiSelect が True の場合は、選択したファイルの名前の配列が返されます。選択されたファイルが 1 つでも、配列として返されます。 >入力が取り消された場合には False が返されます。 これでは、String型では受け切れませんよね。 もともと、GetOpenFilename メソッドは、Variant型を戻すのでしょう。 Integerで十分なところにVariantを使うのは無駄なので推奨されませんが、Variantを使う必要があるケースも当然あります。 試した訳ではありませんが、String型にした場合、 If fileToOpen <> "False" で動くかもしれません。外していたらすみません。
その他の回答 (2)
- s-uzen
- ベストアンサー率65% (2051/3118)
Excel 2003のヘルプには載っていませんでしたが、Excel 2007のヘルプには戻り値がVariant型と書かれていますね。 String型の宣言を行ったことで、「If fileToOpen <> False Then」は String型とBool型の比較となりエラーですね。 String型宣言時に If fileToOpen <> "False" Then でもキャンセル/単一ファイル選択なら通るようですが、MultiSelect=True時の配列名が戻る場合には、また問題になってきますね。 > Variant型は使わないほうがいい 一般論としては正しいと思います。 Variantは無駄にメモリを喰い、動作も遅くなるからです。 長さ指定のないString型も、多少の無駄はありますけどね。 関数等の戻り値の型が複数ある場合は、Variant型でしか対応できないためで、この辺は臨機応変にということになるのでしょうね。 # ヘルプに戻り値の型が明示されていないと、分かり難いですね。
お礼
戻り値の型が一つではない場合にVariant型を使うのですね。 ありがとうございます。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>この場合はこれしかないのでしょうか? そうです。 >しかしVariant型は使わないほうがいいと教わったのですが メモリ使用量が大きくなるので、一般的には使わないようにした方が良いという事ですが、昔のパソコンの搭載メモリ量からすれば無駄なメモリ消費を制限するためのプログラミング手法だったのですが、現在のパソコンでは十分にメモリが積まれているので、気にするほどの必要は無いでしょう。 >またなぜString型ではエラーになるのでしょうか? 返り値が自在に型変化するので、Variant以外では受け取る事が出来ないのです。 キャンセルボタンがクリックされずに「確実にファイル名が入る」というプログラムなら問題は有りませんが・・・ 参考:名前を指定してブックを開く http://officetanaka.net/excel/vba/file/file02.htm
お礼
Variant型を使うことに対してそこまで神経質になる必要ななさそうですね。 ありがとうございます。
お礼
True、False型はString型では返せないからなのですね。 ありがとうございます。