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型ではエラーになるのでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
GetOpenFilenameの、使用例ではなく、メソッドのヘルプの方をご覧になって下さい。
(当方XL2000)>ユーザーによって選択、または入力したファイルの名前とパス名を返します。
>引数 MultiSelect が True の場合は、選択したファイルの名前の配列が返されます。選択されたファイルが 1 つでも、配列として返されます。
>入力が取り消された場合には False が返されます。
これでは、String型では受け切れませんよね。
もともと、GetOpenFilename メソッドは、Variant型を戻すのでしょう。
Integerで十分なところにVariantを使うのは無駄なので推奨されませんが、Variantを使う必要があるケースも当然あります。
試した訳ではありませんが、String型にした場合、
If fileToOpen <> "False"
で動くかもしれません。外していたらすみません。
No.3
- 回答日時:
Excel 2003のヘルプには載っていませんでしたが、Excel 2007のヘルプには戻り値がVariant型と書かれていますね。
String型の宣言を行ったことで、「If fileToOpen <> False Then」は
String型とBool型の比較となりエラーですね。
String型宣言時に
If fileToOpen <> "False" Then
でもキャンセル/単一ファイル選択なら通るようですが、MultiSelect=True時の配列名が戻る場合には、また問題になってきますね。
> Variant型は使わないほうがいい
一般論としては正しいと思います。
Variantは無駄にメモリを喰い、動作も遅くなるからです。
長さ指定のないString型も、多少の無駄はありますけどね。
関数等の戻り値の型が複数ある場合は、Variant型でしか対応できないためで、この辺は臨機応変にということになるのでしょうね。
# ヘルプに戻り値の型が明示されていないと、分かり難いですね。
No.2
- 回答日時:
>この場合はこれしかないのでしょうか?
そうです。
>しかしVariant型は使わないほうがいいと教わったのですが
メモリ使用量が大きくなるので、一般的には使わないようにした方が良いという事ですが、昔のパソコンの搭載メモリ量からすれば無駄なメモリ消費を制限するためのプログラミング手法だったのですが、現在のパソコンでは十分にメモリが積まれているので、気にするほどの必要は無いでしょう。
>またなぜString型ではエラーになるのでしょうか?
返り値が自在に型変化するので、Variant以外では受け取る事が出来ないのです。
キャンセルボタンがクリックされずに「確実にファイル名が入る」というプログラムなら問題は有りませんが・・・
参考:名前を指定してブックを開く
http://officetanaka.net/excel/vba/file/file02.htm
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
OUTLOOK VBA 指定フォルダ内の...
-
Returnに対するGoSubがありません
-
VBでファイルが開かれているか...
-
access テキストボックスの値取得
-
VBから参照できないCのDLLを使...
-
NAS上のファイルの使用中が解除...
-
batファイルでレジストリキーの...
-
gccを行ってもexeファイルが生...
-
郵便番号を表示させる関数のエ...
-
cube PDFについて
-
VBAのChangeFileOpenDirectory...
-
「パス名が無効です」の発生原因
-
FORTRANの実行エラーについて
-
PowerShellを使って関連付けら...
-
Excelのエラー
-
EXCELのVBAでWORDが開いてある...
-
アクセスのクエリでコンパイル...
-
Excel 2003 のエラーメッセージ
-
FTPの送信結果を検知したい
-
VB実行時エラー75:「パス名が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
gccを行ってもexeファイルが生...
-
VBでファイルが開かれているか...
-
「パス名が無効です」の発生原因
-
batファイルでレジストリキーの...
-
VBから参照できないCのDLLを使...
-
FTPの送信結果を検知したい
-
access テキストボックスの値取得
-
PowerShellを使って関連付けら...
-
Returnに対するGoSubがありません
-
アクセスのクエリでコンパイル...
-
OUTLOOK VBA 指定フォルダ内の...
-
Adobeのプレミアプロの書き出し...
-
EXCELのVBAでWORDが開いてある...
-
NAS上のファイルの使用中が解除...
-
すでにファイルが開かれている...
-
VB6 Dir関数で52エラー発生
-
FORTRANの実行エラーについて
-
Excelvbaのマクロのファイル名...
-
Excelファイルのマクロによる排...
-
エクセルマクロでエラーの原因...
おすすめ情報