アプリ版:「スタンプのみでお礼する」機能のリリースについて

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型ではエラーになるのでしょうか?
よろしくお願いします。

A 回答 (3件)

GetOpenFilenameの、使用例ではなく、メソッドのヘルプの方をご覧になって下さい。

(当方XL2000)
>ユーザーによって選択、または入力したファイルの名前とパス名を返します。
>引数 MultiSelect が True の場合は、選択したファイルの名前の配列が返されます。選択されたファイルが 1 つでも、配列として返されます。
>入力が取り消された場合には False が返されます。
これでは、String型では受け切れませんよね。
もともと、GetOpenFilename メソッドは、Variant型を戻すのでしょう。
Integerで十分なところにVariantを使うのは無駄なので推奨されませんが、Variantを使う必要があるケースも当然あります。
試した訳ではありませんが、String型にした場合、
If fileToOpen <> "False"
で動くかもしれません。外していたらすみません。
    • good
    • 0
この回答へのお礼

True、False型はString型では返せないからなのですね。
ありがとうございます。

お礼日時:2009/07/04 12:45

Excel 2003のヘルプには載っていませんでしたが、Excel 2007のヘルプには戻り値がVariant型と書かれていますね。


String型の宣言を行ったことで、「If fileToOpen <> False Then」は
String型とBool型の比較となりエラーですね。

String型宣言時に
If fileToOpen <> "False" Then
でもキャンセル/単一ファイル選択なら通るようですが、MultiSelect=True時の配列名が戻る場合には、また問題になってきますね。

> Variant型は使わないほうがいい
一般論としては正しいと思います。
Variantは無駄にメモリを喰い、動作も遅くなるからです。
長さ指定のないString型も、多少の無駄はありますけどね。
関数等の戻り値の型が複数ある場合は、Variant型でしか対応できないためで、この辺は臨機応変にということになるのでしょうね。
# ヘルプに戻り値の型が明示されていないと、分かり難いですね。 
 
    • good
    • 0
この回答へのお礼

戻り値の型が一つではない場合にVariant型を使うのですね。
ありがとうございます。

お礼日時:2009/07/04 12:48

>この場合はこれしかないのでしょうか?



そうです。

>しかしVariant型は使わないほうがいいと教わったのですが

メモリ使用量が大きくなるので、一般的には使わないようにした方が良いという事ですが、昔のパソコンの搭載メモリ量からすれば無駄なメモリ消費を制限するためのプログラミング手法だったのですが、現在のパソコンでは十分にメモリが積まれているので、気にするほどの必要は無いでしょう。

>またなぜString型ではエラーになるのでしょうか?

返り値が自在に型変化するので、Variant以外では受け取る事が出来ないのです。
キャンセルボタンがクリックされずに「確実にファイル名が入る」というプログラムなら問題は有りませんが・・・

参考:名前を指定してブックを開く
http://officetanaka.net/excel/vba/file/file02.htm
    • good
    • 0
この回答へのお礼

Variant型を使うことに対してそこまで神経質になる必要ななさそうですね。
ありがとうございます。

お礼日時:2009/07/04 12:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!