Excelマクロでファイルを開くのダイアログをキャンセルした時の挙動について

このQ&Aのポイント
  • Excelマクロでファイルを開くのダイアログをキャンセルした場合、指定した部分の実行をスキップする方法を解説します。
  • マクロでGetOpenFilename関数を使用してファイルを選択する際、キャンセルを押した場合はFalseが返されます。そのため、vntFileNameがFalseでない場合にのみ実行するように条件分岐を追加することで、キャンセルしたときに特定の処理をスキップさせることができます。
  • 具体的には、If文を使ってvntFileNameがFalseでないかを判定し、条件がtrueの場合にのみ指定した処理を実行するようにします。キャンセルした場合はfalseが返されるため、条件がfalseとなり、実行されないようになります。
回答を見る
  • ベストアンサー

Excelのマクロでファイルを開くのダイアログをキャンセルしたときの挙

Excelのマクロでファイルを開くのダイアログをキャンセルしたときの挙動についてです。 マクロで次のような記述をしています。 Sub tekitou() Dim vntFileName As Variant vntFileName = _ Application.GetOpenFilename( _ FileFilter:="エクセルファイル(*.xls),*.xls" & _ ",CSVファイル(*.csv),*.csv" _ , FilterIndex:=1 _ , Title:="ファイルを開く" _ , MultiSelect:=False _ ) If vntFileName <> "False" Then Workbooks.Open Filename:=vntFileName End If うんたらかんたら End Sub このとき、ファイルを開くのダイアログをキャンセルしたときでも「うんたらかんたら」の部分が実行されてしまいます。 キャンセルを押したときにそこでそれ以降をスキップして何もなかったかのような挙動をさせるためにはどのような記述をすればいいのでしょうか?

  • yskfr
  • お礼率32% (25/76)

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こういう場合、きちんと書いてあげたほうがよいですね。 ご自身のコードと見比べてください。ワザとベストの書法ではない方法で書きました。 Sub MyFileOpenPro()  Dim FName As Variant  FName = Application.GetOpenFilename("Excelファイル(*.xls),*.xls, " & _  "CSVファイル(*.csv),*.csv", 1, "ファイルを開く", False)  If VarType(FName) = vbBoolean Then Exit Sub 'マクロ離脱←本来はコメントは不要  'ファイルオープン '←ここにコメントを入れる  Workbooks.Open FName  MsgBox FName 'うんたらかんたらの部分 End Su 以下は、つまらないことを言っていると思ってもよいですが、実務上のアドバイスで、もし、以下の中でどこかに引っかかることがあったら幸いです。 FileName を、Variant 型にするのはでよいです。明示的にわかる変数は、方針(ハンガリアン記表)が変わって、あまりプレフィックスは拘らなくてよいです。特に、VB.Net で、int と long の分岐点が変ったからです。 Variant 型にしたら、Cancel を押せば、当然、データ型は、Boolean 型になりますから、大文字・小文字を考えなくても、VarType や False で、除外項目が作れます。文字型でもよいのですが、Variant 型のほうが上です。 Fname に変えた理由は、別に意味ありません。本来は、こういう省略型は良くないのですが、VBAでは、伝統的になぜかこういう書き方もあるようです。とかくVBA(のみ)では長い変数名は、嫌われます。スクリプト型言語の名残りを残しているのかもしれません。 今回は、そのままでもよいのですが、本格的に、自分だけのコードを書く場合は、見せるコードは無視してよいです。とかく、掲示板では、可読性がどうとかという人がいますが、どうせ、この程度で読めなくなるようなレベルなら、どう書いた所で同じです。本格的に書くときは、なるべく短縮させてしまってください。その代わり、コメントを上手に入れます。ただし、vbBoolean などの、組込み定数までは、勤めて省略はしないでください。

その他の回答 (3)

  • mar00
  • ベストアンサー率36% (158/430)
回答No.3

aNo.2です。 Else Exit Sub End If でした。

  • mar00
  • ベストアンサー率36% (158/430)
回答No.2

End Ifの前にExit Subを 入れてはどうでしょうか。

  • mimeu
  • ベストアンサー率49% (39/79)
回答No.1

ダイアログをキャンセルしたとき vntFileName は文字列型ではなくブール型です。 なので > If vntFileName <> "False" Then ではなくて If vntFileName <> False Then

yskfr
質問者

お礼

修正しましたが、改善されませんでした・・・

関連するQ&A

  • VBAでファイルOPEN ダイアログを使用したいです

    現在、指定したファイルを開くVBAを書いているのですが、 ↓こんなの ----------------------------------------------------------- Dim vntFileName As Variant 'ファイルを開くダイアログを開きます vntFileName = _ Application.GetOpenFilename( _ FileFilter:="エクセルファイル(*.xls),*.xls" & _ ",CSVファイル(*.csv),*.csv" _ , FilterIndex:=1 _ , Title:="開けゴマ" _ , MultiSelect:=False _ ) 'ファイルが選択されているときは '選択したファイルをWorkbooks.Openメソッドで開きます If vntFileName <> False Then Workbooks.Open Filename:=vntFileName End If ---------------------------------------------------------------- あらかじめ開くディレクトリを、ネットワーク上のフォルダに指定したいのですが、どこにパスを書いたらいいのか、わかりません。 教えていただけますでしょうか。

  • エクセルのマクロでファイルを開く

    エクセルの「ファイルを開く」ダイアログボックスを使用してファイルを開き、その開いたファイルに対してとあるマクロを実行させたいと思っています。 エクセルの「ファイルを開く」ダイアログボックスでパス取得までは理解出来たのですが、その先の処理が分かりません。 「ファイルを開く」と言うのは、「現在アクティブになっているシートにデータを貼り付けて」の処理でも構いません。 Dim Ret As Variant Ret = Application.GetOpenFilename("Excel ブック (*.xls), *.xls, テキストファイル(*.txt),*.txt") If Ret = False Then MsgBox "キャンセルが選択されました。" Exit Sub Else       'ここにRetで取得しているパスのファイルを開いて、sub_WAITのマクロを実行させたいです。 sub_WAIT.Show End If End Sub

  • エクセルを選択して開き印刷するマクロ

     お世話になっております。 タイトル通りのマクロの作成をしているのですが、行き詰ってしまい質問させていただきました。 説明させていただきますと、、 実行し、複数のエクセルbookを選択し開くとシートを全選択し通常使うプリンタで印刷をする。というマクロなんですが、改善していきたい事がありまして、助言をいただきたく思っております。 1.複数選択して開いても印刷されるのは開いた後アクティブになっているbookのみ。これを全て開いたbook印刷にしたい。 2.現在は通常使うプリンタで印刷するようにしていますが、複数選択し開いた時に始めの1回だけプリンタの設定画面になるようにしたい。 3.開いて印刷し閉じるだけなのにリンクなどが残っており、「保存しますか?」という文章が出るときがありますが、それを聞かれないように保存せずに閉じる。と自動的に実行してくれる。 2と3は、出来ればそうなってほしいという事なので、最重要は1番です。120個のエクセルを(1つあたりの容量は少ない)印刷しなければならないので困っております。一気に120個印刷かけるわけではなく10個位を分けてマクロ実行で印刷しようと思っております。 コードを載せさせて頂きますので、「ココをこう直せば出来るよ」など簡単な事でも結構ですのでアドバイスよろしくお願いいたします。 ----------------------------------------------------------- Sub 複数のファイルを選択して開く_エクセル版() '複数のファイルを選択する例 Dim vntFileName As Variant Dim vntGetFileName As Variant 'ファイルを開くダイアログを開きます vntFileName = _ Application.GetOpenFilename( _ FileFilter:="エクセルファイル(*.xls),*.xls" & _ ",CSVファイル(*.csv),*.csv" _ , FilterIndex:=1 _ , Title:="印刷するファイルを選択" _ , MultiSelect:=True _ ) 'ファイルが選択されているとき(vntFileNameが配列型)は '選択した全てのファイルをWorkbooks.Openメソッドを使い開きます。 If IsArray(vntFileName) Then For Each vntGetFileName In vntFileName Workbooks.Open vntGetFileName Worksheets.Select 'シート全選択 Next ActiveWindow.SelectedSheets.PrintOut Copies:=1 '通常設定のプリンタで出力 End If ActiveWindow.Close 'ファイルを閉じる End Sub

  • 複数のエクセルファイルを順番に開く

    Excel2003、OS WindowsXPを使用し、Visual Basicに関する質問です。 下記マクロを作成したのですが、これですとファイルを複数選択した場合に毎回開く順番がランダムになってしまいます。これをファイル名を参照して順番に開くようにしたいのです。 因みにファイル名は **-***_AAA_日付.xls です。 *には数字が入り、AAAには漢字による名称が入ります。 例)(1)24-002、(2)24-005、(3)24-008といった3つのファイルを開くとします。現在ですと(3)→(1)→(2)のような順番で開きますが、これを(1)→(2)→(3)のようにファイル名の数字をkeyとして順番に開きたいのです。 色々と調べてみたのですが、よく分かりませんでした…。 すみませんが、ご回答の程、宜しくお願い致します。 Opf = ThisWorkbook.Path & "\注文書・請書" ChDrive ThisWorkbook.Path ChDir Opf 'ファイルを開くダイアログを開く vntFileName = _ Application.GetOpenFileName( _ FileFilter:="エクセルファイル(*.xls),*.xls" _ , FilterIndex:=1 _ , Title:="ファイル選択" _ , MultiSelect:=True _ ) 'ファイルが選択されているとき(vntFileNameが配列型)は '選択した全てのファイルをWorkbooks.Openメソッドを使い開く If IsArray(vntFileName) Then For Each vntGetFileName In vntFileName Workbooks.Open vntGetFileName Next Else Exit Sub End If

  • 指定のシート枚数をマクロで印刷

    こんにちは。 エクセルマクロを使用しての印刷に関して、皆様の知恵をお借りしたく投稿させて頂きました。 現在は ・マクロを実行し印刷したいエクセルブックを開く。 ・指定した名前のエクセルシートの選択。 ・選択した名前のシートの印刷。 となります。 それを ・マクロを実行し印刷したいエクセルブックを開く。 ・2枚目のシートから4枚目のシートまでを選択。 ・空白のシートを追加(両面印刷する際に奇数だと次のファイルが同じ紙の裏面に印刷されてしまうため) ・2枚目から4枚目シート+空白シートの印刷。 と変更したいのです。 ※2~5枚目シート選択、1~6枚目シート選択など、変更できると助かります。 ※偶数シートの印刷の場合は空白シート追加は不要となります。 1000近くのエクセルブックを印刷しているのですが、シート名が統一されていないため、マクロが止まってしまい困っておりました。 なんとか知恵をお貸し頂けないでしょうか。 宜しくお願い致します。 下記に現在使用しているマクロのコードを提示致します。 --------------------------------------------------------------------------------------------------------- Sub Excelファイルの指定したシートのみ印刷_資料2から資料3Ver() '複数のファイルを選択する Dim vntFileName As Variant Dim vntGetFileName As Variant Dim B As Boolean Dim W As Workbook 'ファイルを開くダイアログを開きます vntFileName = _ Application.GetOpenFilename( _ FileFilter:="xlsxファイル(*.xlsx),*.xlsx" & _ ",エクセルファイル(*.xls),*.xls" _ , FilterIndex:=1 _ , Title:="印刷するファイルを選択" _ , MultiSelect:=True _ ) If IsArray(vntFileName) Then For Each vntGetFileName In vntFileName Set W = Workbooks.Open(vntGetFileName) If B Then Sheets(Array("資料2", "資料3", "資料4")).Select ActiveWindow.SelectedSheets.PrintOut Copies:=1 '通常設定のプリンタで出力 Else Sheets(Array("資料2", "資料3", "資料4")).Select Application.Dialogs(xlDialogPrint).Show '印刷ダイアログを表示 B = True End If W.Close False Next End If End Sub ----------------------------------------------------------------------------------------------------

  • エクセル マクロの記述(フォルダーの移動、削除)

    現在開いているエクセルのファイルにマクロを記述し、 1 「処理済」というフォルダーに、開いているエクセルファイルを移動して、同じ名前でエクセルを保存する。 2 「CSV」というフォルダーに、開いているエクセルファイルをCSVファイルに変換して名前を「処理.csv」とし保存する。 3 現在開いているエクセルファイルは削除する。 以上の三つの処理をさせようと、以下のようにしましたが、1,2の処理は出来ましたが、3の開いているエクセルファイルが残ってしまいます。 以上三つの処理が一度に出来るマクロの記述を教えて下さい。 よろしくお願いします Sub マクロ() ActiveWorkbook.SaveAs Filename:="C:\処理済\" & ActiveWorkbook.Name ChDir"C:\CSV" ActiveWorkbook.SaveAs Filename:= "C:\CSV\処理.csv" _ , FileFormat:=xlCSV, CreateBackup:=False Application.DisplayAlerts = False If Workbooks.Count = 1 Then Application.Quit Else ActiveWorkbook.Close End If Application.DisplayAlerts = False End Sub

  • Excelでファイルを開くをマクロで行いたい

    マクロ初心者です "ファイルを開く"をマクロの記録で記録させると ChDir "C:\Documents and Settings\○○\△△\※※" Workbooks.Open Filename:= _ "C:\Documents and Settings\○○\△△\※※¥LotLog20070131.csv" Windows("●●●.xls").Activate End Sub と記録されます この中で 開きたいファイルネ-ム(上記ならばLotLog20070131.csv)を "●●●.xls"の どこかのセルを参照に開きたいのですが どうすれば宜しいのでしょうか?

  • Excel : マクロでファイルを開く方法を

    Excelにて下記の方法で特殊なファイル(.textでは無い)を開いています。  1.メニューの『開く』で『ファイルを開く』ダイアログを表示させる。  2.毎回、同じフォルダを選択し、さらに一つ下の階層のフォルダ群の中から更新日が最新のフォルダを開く。  3.特殊なファイルなのでファイルの種類を『すべてのファイル』にする。    (他のアプリケーションで作成されたファイルで、拡張子もない)  4.表示されたファイル群から任意のファイルを選択し開く。    (選択するファイルは毎回変わる)  5.『テキストファイルウィザード』が立ち上がってくるのでスペース区切りでファイルを開く しかし、この一連の作業に煩わしさを感じ、 以下のマクロにて『ファイルを開く』ダイアログを表示させ、 任意のファイルを単純に開く所まではマクロ超初心者でもできましたが、 ファイルをスペース区切りの状態で開く方法がいくら調べても分かりません。   (↑あとこれだけなんです!!) どうかマクロ上級者様方、お知恵をお貸し頂けませんでしょうか? Private Sub CommandButton1_Click()   With Application.FileDialog(msoFileDialogOpen)     .AllowMultiSelect = False     .FilterIndex = 1     .InitialFileName = "c:\フォルダ\"    If .Show = -1 Then .Execute   End With End Sub

  • エクセルと同じファイル名でcsvを作成するマクロ

    エクセルからCSVファイルをYYMMDD付でマクロを使って 作ろうとしていますが拡張子の「.xls」がどうしても残ってしまいます。 例えば、「test.xls」が「test.xls070326.csv」のように。 これを「test070326.csv」とするにはどうしたらよいでしょう。 今のコードはつぎのようにしています。 Sub test1() Dim flname As Variant Dim wb As Workbook flname = ActiveWorkbook.Name + CStr(Format(Date, "yymmdd")) ActiveSheet.Copy ActiveSheet.SaveAs Filename:=flname, _ FileFormat:=xlCSV ActiveWindow.Close savechanges:=False ActiveWorkbook.Close End Sub これでもCSVとしては使えるのですが、気持ちがすっきりしません。 どなたか正解をお願いします。

  • エクセルVBAでマスターキーを作りたい

    こんなことが可能かどうかもよくわからないのですが。。 色んなエクセルファイルやワードファイルにパスワードをかけてて 色んな組み合わせで使っているのでややこしいので マスターキー的なものを作りたいと思っています。 ファイル選択ダイアログからファイルを選択して A列の読み取りパスワード、および同じ行のC列の書き込みパスワードを 適用してファイルを開くプログラムを作りたいのです。 行2の組み合わせで開かなければ行3の組み合わせを適用。それが無理なら行4。 ファイルが開けるまで順に下の行のものを適用するものです。 初心者なので色んなサイトで見たものをツギハギしてみてるのですが、 まずパスワードが違った時にエラーで止まってしまうし、 そもそもパス付Word文書をExcelから開けるのかもわからないのですが もし可能なら、拡張子を判断してどうやってワードかエクセルの どちらかを開かせるのか、そしてどうループさせればいいのか。。 行き詰っています。ご教授いただけると嬉しいです。 何卒よろしくお願いいたします。 Dim OPFileName As Variant OPFileName = _ Application.GetOpenFilename( _ FileFilter:="すべてのファイル(*.*),*.*" & _ ",エクセルファイル(*.xls),*.xls" & _ ",CSVファイル(*.csv),*.csv" & _ ",ワードファイル(*.doc),*.doc" _ , FilterIndex:=1 _ , Title:="ファイルを選択" _ , MultiSelect:=False _ ) extension = Mid(OPFileName, pointp + 1) x = 2 If OPFileName <> False Then If extension = xls Or csv Then Workbooks.Open filename:=OPFileName, password:=Cells(x, 1).Value, WriteResPassword:=Cells(x, 3).Value, IgnoreReadOnlyRecommended:=True End If End If

専門家に質問してみよう