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

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

ただいまの
回答率

91.36%

  • VBA

    1126questions

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

VBAでの保存と閉じる方法についての質問です。

受付中

回答 3

投稿 2017/11/19 23:46 ・編集 2017/11/20 00:09

  • 評価
  • クリップ 0
  • VIEW 106

makino

score 22

VBA初心者です。

下記コードを書き、実行したところ、
エクセルが開かなくなりました。

ただファイルを選択して何もせず、保存して閉じるの確認がしたかったのですが…
また、選んだエクセルを削除しようとしても、開いているので消せませんのエラーが出ます。

このコードのどこが問題なのでしょうか?

また、開いたシートに対して処理を行いたいのですが、
' 処理実行(一旦これはしない)
' Module1.Sample
と書いた場合、Sampleの先では、開いたファイルがActiveWorkbook.Worksheetsになるのでしょうか?

Sub ボタン1_Click()

    Dim OpenFileName As String
    Dim fType        As String
    Dim wb           As Workbook

    ' 選択できるファイルの種類をxlsに限定(全ファイル指定はfType = "")
    fType = "Microsoft Excelブック,*.xls?"

    ' 選択画面の表示
    OpenFileName = Application.GetOpenFilename(fType)

    If OpenFileName = "False" Then
        MsgBox "キャンセルされました"
        Exit Sub
    End If

    Set wb = Workbooks.Open(OpenFileName)
    Windows(wb.name).Visible = False

    ' 処理実行(一旦これはしない)
    ' Module1.Sample

    wb.Save
    wb.Close

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

ブックが開けない件について

.Visible = Falseの状態でブックを保存しているので、Excelを終了させてブックを開きなおしてもこの状態が保存されてしまっており、見えないブックになっているものと思います。
保存前には.Visible = Trueに戻してあげれば解消されるのではないでしょうか。

また、ブックは「開いても見えない状態」になっているだけで、ちゃんと開けてはいると思います。
VBEditor画面のプロジェクトエクスプローラーのツリーには開けないはずのブックも見えているのではないでしょうか?

見えなくなってしまったブックに下記のようなマクロを作成して実行すれば、とりあえず見える状態に戻すこともできます。

Sub 見える化()
    Windows(ThisWorkbook.Name).Visible = True
End Sub

ActiveWorkbookについて

ボタン1をクリックしたあと、何も触らずおとなしく眺めているのであれば、通常は最後に開いたブックActiveWorkbookとして参照されます。
しかし、目的のブックを開くのにちょっと時間がかかったりすると、ユーザーは別のブックを開こうとしたり、既存で開いてあった他のブックをアクティブにしたりしてしまうのが常です。

せっかくブックをオープンしたときにwbという名前の変数に格納しているのですから、Module1.sampleマクロにもこのwbを渡してあげて、対象ブックを明確にした処理にしたほうが確実だと思います。

参考になれば幸いです。

投稿 2017/11/21 10:53

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

この行でExcelファイルを開いています。

Set wb = Workbooks.Open(OpenFileName)

次の行で、Excelを不可視状態に設定しています。

Windows(wb.name).Visible = False

上記のため、ファイルを開いているけど見えないといった状態になっているものと推測します。
対応としては、Rem Windows(wb.name).Visible = False等とコメントアウトすることが簡単かと思います。

どのシートが ActiveWorkbook.Worksheets となるかはすぐにはわかりませんが、開いたブックやシートに対してActivateを行わない限りは、ボタン1の配置されているシートが Active なのではないかと推測します。

投稿 2017/11/20 06:55

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

こちらの環境(Win7 32bit Office2010 32bit)で同様のコードを試してみましたが、
ファイルロックは再現できませんでした。

恐らく、Visible=Falseとしているので、
開発の途中で、開いたまま閉じずに終わった可能性が高いと考えられます。

タスクマネージャを開いてアプリケーションや、プロセスで調べてください。

また、他の関数にブックを渡したいのであれば、
Activeに頼らず、引数で渡すのが鉄則です。

投稿 2017/11/20 16:56

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.36%

関連した質問

  • 受付中

    VBA cpu使用率取得

    プログラミング初心者のものです。管理者の制約で、学校でタスクマネージャを開くことができません。そこでエクセルvbaでタスクマネージャを再現しようと思い、日々精進しております。学校に

  • 解決済

    VBA タイマー機能をつける

    文字の意味とフォントの色が一致しないようなテスト(ストループカラーワードテスト;例 あかという文字が緑色で書かれている)を作りたいです. 現在,問題は画像で表示して,その回答が下

  • 解決済

    ダイアログ画面 キャンセル

    vbaでシートを保存時にダイアログ画面から保存場所を選択させているのですが、キャンセルを押した際に”本当に保存を中止しますか?”等のアラートを出して はい/いいえ を用意し、いいえ

  • 解決済

    ADODB.Stream 保存時エラー

    ADODB.Streamでファイルを作成していてSaveToFileで保存する際に、 ’アプリケーション定義またはオブジェクト定義のエラーです’とエラーが発生します。 変数SA

  • 受付中

    VBAを用いてバッチファイルを作成するツール

    前提・実現したいこと 業務でVBAを用いてバッチファイルを作成するツールが必要となりました。 ActiveDirectoryのUID棚卸しの為に使用します。 添付画像のような

  • 解決済

    VBAの配列の質問

    VBAの配列で教えてほしい事があります。 同一ブック内に2つのsheetがあります。 ”集計結果”と”一時保管”です。 ”一時保管”はA~D列にデータが入っています。

  • 受付中

    【VBA】サブディレクトリも含めたファイル一覧を素早く取得したい

    以下のSample1とSample2はどちらもC:\Tempのサブディレクトも含めたファイル一覧を取得する関数です。 Sample1は'Sample2'よりも実行時間が短いですが、

  • 受付中

    【VBA】複数シートのデータを順番に計算して、結果を別ブックのシートに同じ順番に書き込む

    【VBA】複数シートのデータを順番に計算して、結果を別ブックのシートに元データのシートと同じ順番に書き込む VBAで回帰分析を行うなシステムを作っています。 現在、一つのシートをか

同じタグがついた質問を見る

  • VBA

    1126questions

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