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

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

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

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

3回答

6297閲覧

AccessからExcelファイルを作成すると必ず非表示の状態で保存されてしまう

Himamura

総合スコア39

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

1クリップ

投稿2018/12/21 07:05

前提・実現したいこと

AccessからVBAで雛形となるExcelファイルを使って新規Excelファイルを出力させたいです。

発生している問題・エラーメッセージ

出力されたファイルを開くと必ず非表示の状態で開かれます。
そのため、Excel画面の「表示タブ」→「再表示」からブックを表示させないと内容を見ることができません。
再表示させた状態で上書き保存をし、ファイルを閉じてもう一度開くと普通に表示されます。

該当のソースコード

標準モジュールに記載して実行

VBA

1Option Compare Database 2 3Public Function test01() 4 Dim strReadPath As String, XL As Object, WB As Object, WS As Object 5 Set XL = CreateObject("Excel.Application") 6 XL.Visible = False 7 XL.DisplayAlerts = False 8 Set WB = GetObject(CurrentProject.Path & "\test.xlsx") '雛形を取得 9 Set WS = WB.Sheets(1) 10 WS.Name = "Sheet1" 11 WS.Cells(1, 1) = "サンプルテキスト" 12 WB.SaveAs FileName:=CurrentProject.Path & "\output.xlsx" '保存 13 'XL.Windows("output.xlsx").Visible = True 14 'WB.Save 15 If Not WB Is Nothing Then WB.Close: Set WB = Nothing 16 If Not XL Is Nothing Then XL.Quit: Set XL = Nothing 17End Function

試したこと

全く新しいAccessファイルと、全く新しい雛形ファイルを用意して同じプログラムを実行しましたが同じ症状になりました。
上記ソースコードの下から4行目と5行目、コメント化されている箇所のコメントを解除して実行すると、きちんと表示されるのですが、他のExcelブックを開いた状態で実行するとそこでエラーになります。

補足情報(FW/ツールのバージョンなど)

Windows 10 Home 64bit
Microsoft Access 2013
Microsoft Excel 2013

Accessの参照設定:
Visual basic For Applications
Microsoft Access 15.0 Object Library
OLE Automation
Microsoft Office 15.0 Access database engine Object Library
Microsoft Excel 15.0 Object Library

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

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

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

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

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

guest

回答3

0

対策としては、hatena19さんの回答が個人的にはベストだと思います。


以下補足(蛇足)を

質問のコードではCreateObject("Excel.Application")GetObject("Excelブック")の両方を行っていますが、これらはどちらか一方にするべきです。

両方行っているため「他のExcelブックを開いた状態で実行するとそこでエラーになります。」などのエラー発生の原因となります。

それぞれの動作を確認しておくと
CreateObject("Excel.Application")常にExcelの新規インスタンスを生成します。

対してGetObject("Excelブック")
"Excelブック"がすでに開かれている場合は、開かれているブックを捕捉。
"Excelブック"が開かれていない場合は、Excelが起動していないければ起動、起動していれば既存のインスタンスを取得し、取得したExcelのインスタンスで**「ブックのウィンドウを非表示にして」**ブックを開きます。

そのため、CreateObjectで生成したExcelのインスタンスと、GetObjectで取得したブックが開かれているExcelのインスタンスが一致しない可能性があります。
そして、一致しない場合にXL.Windows("output.xlsx").Visible = Trueでエラーが発生します。

また前述の通り、GetObjectでは編集中のブックを捕捉する可能性があるため、WB.Closeで強制的に閉じるのはユーザーにとって思わぬ動作となる可能性があります。

改めての確認として、対策としてはhatena19さんの回答にあるように、「新規生成したExcelのインスタンス」で、ブックを開いて処理するのがベターだと思われます。

Workbooks.OpenならGetObjectのようにウィンドウを非表示にしませんし、
新規生成したExcel内で処理するため、ユーザーの操作に影響が出にくいと思われるためです。


「雛形」ということを明示するのであれば、Workbooks.Openではなく、既存のブックを元に新規ブックを生成するWorkbooks.Addの方が良いかもしれませんね。

vba

1 Set WB = XL.Workbooks.Add(CurrentProject.Path & "\test.xlsx") '雛形を取得

投稿2018/12/21 14:12

編集2018/12/22 00:43
imihito

総合スコア2166

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

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

Himamura

2018/12/25 00:47

ご回答ありがとうございます。 GetObjectとCreateObjectの違いを細かく解説していただきありがとうございます。 明確に違いがあって、私は使い方を間違えていたんですね^^; 数年勘違いしながら使っていたのですが、ようやく理解できたように思います。
guest

0

ベストアンサー

vba

1 Set WB = GetObject(CurrentProject.Path & "\test.xlsx") '雛形を取得

を、下記に修正

vba

1 Set WB = XL.Workbooks.Open(CurrentProject.Path & "\test.xlsx") '雛形を取得

でどうでしょうか。

投稿2018/12/21 10:57

hatena19

総合スコア33620

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

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

Himamura

2018/12/25 00:45

ご回答ありがとうございます。いつもhatena19さんのブログ、拝見しています。hatena19さんに回答いただけて嬉しいです^_^ ご回答の方法で解決しました! 他のブックを開いている状態でも正常に動作いたしました。 一番早く回答をいただけたのでベストアンサーとさせていただきます。
guest

0

こんにちは。
https://teratail.com/questions/160186?modal=q-comp

私の質問に関係していると思いました。URLを貼っておきます。

投稿2018/12/24 13:21

u_zu

総合スコア50

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

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

Himamura

2018/12/25 00:48

ご回答ありがとうございます。 おかげさまでGetObjectとCreateObjectの違いがよくわかりました。 CreateObjectのほうが私の意図するように動くように思いましたので、これからはCreateObjectを使っていこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問