[[20140608153100]] 『ファイルを開くダイアログでキャンセルするとき』(noro) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ファイルを開くダイアログでキャンセルするとき』(noro)

連続して開くファイルを選択するために次のVBAを使っていますが、終了で開く必要がなくなったときキャンセルするとそのBookはそのまま残ってしまいます。
実行しているBook(または開いているBookすべて)を閉じたい場合、どのようにするのでしょうか。
book.Closeをを入れてもうまくゆきません。

  Sub yobidasi()
        Dim OpenFileName As String
        OpenFileName = Application.GetOpenFilename("Excelブック,*.xlsx")
        If OpenFileName <> "False" Then
            Workbooks.Open OpenFileName
        End If
    End Sub

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 全体像が見えないので何ともですけれど、マクロのブック以外全部閉じても良ければ
 そういう処理もかけますし、前回開いたファイルだけを閉じたければ、ファイルを覚えて
 おく必要があります。

 現在のコードは開いたファイルを覚えていないので、このままだと何を閉じていいか
 わからなくなってしまいます。

 ご参考までに前者のコードです。

 For Each wb In Workbooks
     If wb.Name <> ThisWorkbook.Name Then wb.Close False
 Next

(Mook) 2014/06/08(日) 16:02


ありがとうございます
例えば上記VBAを新規のBookに使いファイル選択ログを呼び出しキャンセルしてもそのBookは閉じることができません。Book名を指定する必要がありますか?
次のようにほかの作業VBAの末尾に記述してキャンセルしても白紙のBookが残ります。ここではAbookとしているのですがこれでもだめなのでょうか。VBAでアプリ終了指示は可能なのでしょうか。

 Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.ClearContents
    orgName = ThisWorkbook.FullName
    Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("A1").Value
    Workbooks(Abook).Close SaveChanges:=False
    Workbooks.Open Filename:=orgName   '基本book
    Application.Dialogs(xlDialogOpen).Show "*.xlsx"

(noro) 2014/06/09(月) 07:04


 Abook の中身は何になるでしょう?
 ファイルパスではなく、開いたときにタイトルバーに表示されるファイル名を指定します。

 通常は開くときにブックオブジェクトに
   Set WB = Workbooks.Open(ファイルパス)
   処理
   WB.Close
 等としますが、WB 変数は処理する部分でも見えるように管理する必要があります。

 アプリケーションを閉じても良いということであれば、その方が手っ取り早いかもしれません。
http://www.nurs.or.jp/~ppoy/access/excel/xlA022.html
(Mook) 2014/06/09(月) 08:01

Abook の「中身」というのが理解できないのですが、「作成表の中身」という意味でしょうか?
それともファイル名のことでしょうか。
ファイル名(Book名)はダイアログで開く度に変わってゆきますので固定ができないように感じますが
実行するときはその開いたファイル名が上部に表示されています。
キャンセルしたときの状態は上部の表題はなくMicrosoftExellと表示されていて、普段の罫線部分は薄い青色の無地状態になっています。
それから
Set WB = Workbooks.Open(ファイルパス)

の「ファイルパス」というのは、よく参照でみかけていて疑問に思っていたのですが、これは、この文字のところに例えばD:\とか書くという意味ですか?それとも「ファイルパス」というのはVBA用語なのでしょうか

なお、参考のサイトから、それを記述してみたらアプリケーション終了とともにうまく閉じることができましたのでこれを使っていきたいと思っています。
ありがとうございました。
(noro) 2014/06/09(月) 08:53


サイトのVBAでうまくゆくと書いたのですが、キャンセルの方ばかり気にしていたのですが、ファイルを選択して開こうとしたらそれもアプ終了になってしまいました。
選択したらそのファイルを開き、キャンセルしたら実行中のファイルを閉じ(保存不要)アプ終了というつもりだったのですが。ifが必要なのかもしれませんね。

実際に行ったのは作業VBAのEnd Subの直前に

Application.Dialogs(xlDialogOpen).Show "H:\DATA\*.xlsm"

が入っていて

'以下をサイトのとおり追加
'保存したことにする (保存はしない)

    ThisWorkbook.Saved = True
    'Excel を終了する
    Application.Quit
    'Book を閉じる
    ThisWorkbook.Close False

を入れました。

(noro) 2014/06/09(月) 09:07


 わからないこともあると思いますが、都度確認して理解をしていってはと思います。
 ファイルパスなどは VBA に限らず PC では良く使うものですし、今回の「中身」とは
 変数に設定されている値、という意味で使っています。

 >ファイル名(Book名)はダイアログで開く度に変わってゆきますので固定ができないように感じますが 
 というために、そのときの内容を代入して保持するのが「変数」です(Dim で宣言するもの)。
 Abook とは変数ではなかったでしょうか。

 マクロのことはある程度わかっている前提で回答しましたが、そうでない場合は、
   yobidasi がどこにあって、どのように呼び出して使っているか。
   コードだけでなく、全体でどのような処理をしたいのか。
 を端折らないで説明したほうが良いと思います。
(Mook) 2014/06/09(月) 09:42

マクロについてはVBAをその都度教えて(作って)いただく程度で、中身をよく理解できず動かしているだけの初心者です。
一応解読を試みたり、解説を教えていただいたりしているのですが、なかなか理解できていません。

yobidasiについては標準的なサンプルを探して最初試していたので単独なVBAになります。
これでうまくいけば既存のVBAに追記しようと思っていました。
したがって例題にさせていただきました。

Abookについてはおっしゃるとおり変数で型宣言していました。うっかりしてました。

前段でふたつのVBAを表示してしまいましたが、テスト用だったので、
実際には直前の記述にもあるように、各種VBA(色々使っています)の最後に

Application.Dialogs(xlDialogOpen).Show "H:\DATA\*.xlsm"
ThisWorkbook.Close False

を追記して現在動作させ、ひとつの作業(集計、書き出し等)を終わる毎に次のファイルを呼び出して次の作業に入るようにしています。
その作業の最後がキャンセルなのですが、bookは閉じられているようですが、exellが起動状態(?)なので(無地状態)そこを追記で処理できればと相談させていただきました。
(手動で閉じれば済むことなのでこのままでも支障はないのですが)

(noro) 2014/06/09(月) 10:45


 やりたい作業内容がわからないので、マクロと処理ファイルを分けたらよいのでは
 というのはありそうですが、今回の質問から外れるのでファイル終了に絞って回答します。

 ファイルを選択しなかったときに閉じるというのが、望ましい仕様かどうかは別にして、

        If OpenFileName <> "False" Then
            開く処理
        Else
            EXCEL を終了する処理
        End If
 という形がご希望のものでしょうか。
(Mook) 2014/06/09(月) 11:48

そうなりますが、「望ましい仕様かどうかは」ということは、あまりしないほうがいいということでしょうか。
そうであれば、あえて自動closeは行わないようにしたいと思います。

 If OpenFileName <> "False" Then

            '開く処理
   ThisWorkbook.Close False

   Else
        'EXCEL を終了する処理

    ThisWorkbook.Saved = True
      'Excel を終了する
    Application.Quit
      'Book を閉じる
    ThisWorkbook.Close False

        End If

としてはみたのですが、Elseの方がどうしてもうまくゆきませんでした。

(noro) 2014/06/09(月) 12:44


 If OpenFileName <> "False" Then
            '開く処理
   ThisWorkbook.Close False

 これだと、選択したときもファイルを閉じていますよ?
(Mook) 2014/06/09(月) 12:49

はい、実行中のファイルが閉じられて、選択したファイルが入れ代わって開いていたんでそれならいいと思っています。

(noro) 2014/06/09(月) 16:00


 いやいや、マクロを実行しているファイルを閉じてしまったら、
 次のファイルは誰が開くのでしょうか?

 マクロを実行したファイル(ThisWorkbook)を閉じた段階で、マクロも終了します。
(Mook) 2014/06/09(月) 16:35

開くファイルには同じマクロがすべて入っていますのでそれが利用できるのです。
というのも、開く対象の複数のファイルは元のマクロ入りBookにそれぞれデータのみを読み込んだものでできあがっているため、それで連続して作業しています。
確かに全く別のマクロのないBookだったら閉じてしまえば継続できないですよね。
(noro) 2014/06/09(月) 16:58

 まだマクロを使い始めたばかりなので、いろいろと試してみると良いと思いますが、

 >開くファイルには同じマクロがすべて入っていますのでそれが利用できるのです。 
 というような運用だと、「マクロを一部変更したい」というようなときに、全部のファイル
 を変更しなければならなくなりますよね。
 そのような運用を含めて、どのような利用形態が良いか考えてみると良いと思います。

 とりあえず、目的が達成できているのであれば、今回は良いと思いますが、変更や新しい
 ことを考えるときに、そのようなことも考えてみてはどうでしょう。
(Mook) 2014/06/09(月) 17:40

そうですね。たしかに一部修正となると全部にわたって変更する必要があります。
現状では元ファイルのVBAを修正してしまい、必要なら再度データを読み込むという方法をとることになりますが、週単位で新しいものをふやしてゆくタイプのため、一度作業した過去のものを修正する必要は幸いありません。
したがって作業をしやすくするためのVBA修正は、今後のために役立ててゆくことになります。
残念ながらキャンセルでの動作はまだ習得できませんが、自分でも色々試してみたいと思います。
勉強しながらの初心者ということで皆様にはご迷惑をかけているかもしれませんが、引き続きよろしくお願いします。
ありがとうございました。

(noro) 2014/06/09(月) 19:16


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.