質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

19308閲覧

【Excel VBA】Application.GetOpenFilename を使用したファイル選択でのキャンセルした場合のエラー

zazabi

総合スコア24

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/12/26 00:21

■環境
Excel vbaを使用

■やりたいこと
[csvファイルを開く]ダイアログボックスで、キャンセルを押した際エラーが出てしまう。
エラーを出さずにvbaを終了させるか、if文中のelseに振り分けたい。

■過去の質問
https://teratail.com/questions/231492

■エラー内容
実行エラー '1004':
申し訳ございません。False.xlsxが見つかりません。名前が変更されたか、移動や削除が行われた可能性があります。

■VBA

vba

1Sub vba() 2 '変数 3 Dim csv As String 4 Dim csvname As String 'csvの名前 5 Dim csvsheet As String 'csvのシート名 6 7 'csvシートを選択する。 8 ChDir "C:\" 9 csv = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", Title:="CSVファイルの選択") 10 If OpenFileName <> "False" Then 11 Workbooks.Open csv 12 'ファイル名を取得 13 csvname = Dir(csv) 14 'シート名を取得 15 csvsheet = ActiveSheet.Name 16 Else 17 MsgBox "キャンセルされました" 18 End If 19 20End Sub

■試したこと
・If OpenFileName <> "False" Then
→If OpenFileName <> "False" And OpenFileName <> "False.xlsm" Then に変更
・If OpenFileName <> "False" Then
→If OpenFileName <> "False*" Then に変更

ご存知の方がいらっしゃれば教えていただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imihito

2019/12/26 00:37

モジュールの先頭に Option Explicit は存在しますか? OpenFileName はどこでどのように定義されている識別子ですか?
zazabi

2019/12/26 00:46

コメントありがとうございます。 存在していません。 調べてみたら便利なコマンドですね……。使用して修正してみます。
imihito

2019/12/26 04:27

`Option Explicit`をモジュールの先頭に書いておくと、よくわからない名前を検知してコンパイルエラーを起こしてくれるようになります。 書き捨てのコードならともかく、きっちり処理を作成したい場合は、しょうもないミス(質問のような変数名のミスなど)を減らせるので有用です。 VBA のエディタのメニューバーの ツール(T) > オプション(O) > 編集タブ > 変数の宣言を強制する(R) をオンにしておくと、それ以降に作成したモジュールに`Option Explicit`が自動挿入されるようにもなります。
zazabi

2019/12/27 04:51

追加のコメントありがとうございます。 そんな設定があるのですね! さっそく設定して今後に生かさせていただきます。
guest

回答2

0

マニュアルをよく読みましょう。
https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.getopenfilename

GetOpenFilenameの戻り値は以下のように書かれています。

このメソッドは、ユーザーによって選択、または入力されたファイルの名前とパス名を返します。 引数 MultiSelect が True の場合は、選択されたファイルの名前の配列が返されます。 もし_MultiSelect_がTrueの場合、戻り値は選択されたファイル名の配列です(1つのファイル名しか選択されていない場合でも)。 入力が取り消された場合には False が返されます。

サンプルも載っていますので参考になります。
同じように修正するなら以下のようになります。

VBA

1Sub vba() 2 '変数 3 Dim csv As String 4 Dim csvname As String 'csvの名前 5 Dim csvsheet As String 'csvのシート名 6 7 'csvシートを選択する。 8 ChDir "C:\" 9 csv = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", Title:="CSVファイルの選択") 10 If csv <> False Then 11 Workbooks.Open csv 12 'ファイル名を取得 13 csvname = Dir(csv) 14 'シート名を取得 15 csvsheet = ActiveSheet.Name 16 Else 17 MsgBox "キャンセルされました" 18 End If 19 20End Sub

今回のダメだったところは、以下2点です。

  • GetOpenFilenameの戻り値を使ってキャンセルかどうかを判定していない
  • Falseが文字列になっている

ついでに言うとファイルを読み込んだ後の処理も無駄なことをしています。
シート名を取得したいなら以下のようにするとよいでしょう。

VBA

1Dim wb As Workbook 2 3Set wb = Workbooks.Open(csv) 4'シート名を取得 5csvsheet = wb.Worksheets(1).Name 6

投稿2019/12/26 00:55

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zazabi

2019/12/26 01:03

コメントありがとうございます。 追加のご指摘も修正させていただきます。
guest

0

ベストアンサー

GetOpenFilenameメソッドがFalseを返すとき、受け取る変数の型が問題になります。

受け取る変数が文字列型(String)の場合
If OpenFileName <> "False" Then

受け取る変数がバリアント型(Variant)の場合
If OpenFileName <> False Then

のどちらかです。
VBAは内部的に自動型変換をしてくれることが多いですが、これを機会にチェックしてみるとよいでしょう。

---追記

やられた。さてはこれどっかのコピペを合体させてますね?
csv = Application.GetOpenFilename(...
としているのですから、当然
If csv <> "False" Then
としてください。OpenFileNameはどこにも存在してませんよ。

投稿2019/12/26 00:38

編集2019/12/26 00:42
Rocky

総合スコア261

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zazabi

2019/12/26 00:47

コメントありがとうございます。 GetOpenFilename について、まだわかっていなかったみたいです。 他の方からもアドバイスを頂いたので、修正してみます。
zazabi

2019/12/26 00:56

追記ありがとうございます。 色々調べて合体させて、手を加えている状態です……。 「Application.GetOpenFilename」というコマンドかと思っていたので、「OpenFilename」の部分が変数だと認識していませんでした。 ご指摘の通り、修正したら期待通りに機能しました。 大変ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問