Microsoft Access ClubAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

No15664.VBAで開いたエクセルを、保存しないで閉じたい

タイトルVBAで開いたエクセルを、保存しないで閉じたい
記事No: 15664
投稿日: 2010/09/02(Thu) 12:08
投稿者: ユキ
OS:WindowsXp
Access Version:2007

よろしくお願いいたします。
過去ログに似た記事を見つけましたが、参照先のリンクが途切れており、自力での解決が難しいと判断いたしましたので、ご回答いただけると助かります。

VBAで任意のエクセルファイルを開きます。
このときエクセルファイルでは、開いただけで関数が走るようになっているので、閉じるときには必ず保存確認メッセージが表示されます。

これを、保存せずにそのまま閉じたいのです。

調べた結果、
-------------------------------------------------

workbooks("ファイル名").Close SaveChanges:=False

-------------------------------------------------

が使用できると考えられたので、これをAccessVBA用に訂正し、

-------------------------------------------------

xls.Workbooks("ファイル名").Close (False)

-------------------------------------------------

としたのですが、「インデックスが有効範囲にありません」とエラーが出てしまいます。
インデックスと言われたので、"ファイル名"を「1」を変えてみたところエラーが出ずに終了しました。
この処理は正しいのでしょうか?
あくまでも「なんとなく」「1」に変えてみただけですので、根拠はありませんのでとても不安です。

VBAで開いたエクセルを保存しないで閉じる方法について、ご教授いただけますでしょうか?
必要な情報で足りないことがありましたら追記いたしますので、ご回答をよろしくお願いいたします。

タイトルRe: VBAで開いたエクセルを、保存しないで閉じたい
記事No: 15665
投稿日: 2010/09/02(Thu) 13:00
投稿者: Hank
> VBAで開いたエクセルを保存しないで閉じる方法について、ご教授いただけますでしょうか?
> 必要な情報で足りないことがありましたら追記いたしますので、ご回答をよろしくお願いいたします。
どんなコードで開いたのですか?

タイトルRe^2: VBAで開いたエクセルを、保存しないで閉じたい
記事No: 15666
投稿日: 2010/09/02(Thu) 13:43
投稿者: ユキ
ご指摘ありがとうございます。

> > VBAで開いたエクセルを保存しないで閉じる方法について、ご教授いただけますでしょうか?
> > 必要な情報で足りないことがありましたら追記いたしますので、ご回答をよろしくお願いいたします。
> どんなコードで開いたのですか?

大変失礼いたしました。
以下のコードで開きました。

----------------------------------------------------------
Dim xls As New Excel.Application
Dim sExcelPath As String

'起動と同時にマクロが走ってしまうので、マクロの実行をオフに
xls.EnableEvents = False

If xls.Workbooks.Open(sExcelPath).ReadOnly Then
   MsgBox "すでに開かれています。"
xls.Workbooks("ファイル名").Close (False) 'としたい
Else
   xls.Workbooks("ファイル名").Close (False) 'としたい
End If
----------------------------------------------------------

あらかじめ、任意のエクセルが開かれていないか確認します。
その結果、どちらだったとしても一度ファイルを閉じるため、上記コードを記述しました。

先日「vbaで、任意のエクセルファイルがすでに開いているかどうか判断したい」という内容で質問させていただき、その結果を反映させているつもりなのですが、私の理解不足により中途半端に反映しているのかもしれません。

よろしくお願いいたします。

タイトルRe^3: VBAで開いたエクセルを、保存しないで閉じたい
記事No: 15667
投稿日: 2010/09/02(Thu) 14:04
投稿者: Hank
> 以下のコードで開きました。

Dim objApp As Object      'レイトバインドとする
Dim objWbk As Object
Dim sExcelPath As String

Set objApp = CreateObject("Excel.Application")

objApp.EnableEvents = False  'イベントが発生しないようにする

Set objWbk = objApp.WorkBooks.Open(sExcelPath)
objWbk.Saved = True 'Bookはすでに保存されたことにする。

If objWbk.ReadOnly Then
MsgBox "すでに開かれています。"
End If

objApp.EnableEvents = True  '★ 元に戻す

objWbk.Close         'Bookを閉じる。Saved = True なので保存されない。
objApp.Quit 'Excelを終了しないとゾンビプロセスが残る

タイトルRe^4: VBAで開いたエクセルを、保存しないで閉じたい
記事No: 15669
投稿日: 2010/09/02(Thu) 15:14
投稿者: Hank
こんなのはどうですか?

  ' ExcelBookを開かずに、すでに開いているかどうかを調べる。
Dim WD, task, Exl

Exl = CreateObject("Scripting.FileSystemObject").GetBaseName(sExcelPath)

Set WD = CreateObject("Word.Application")
For Each task In WD.Tasks
If task.Visible = True And InStr(1, task.Name, Exl) Then
MsgBox Exl & "は、開いています。"
Exit For
End If
Next
WD.Quit: Set WD = Nothing
'MS Word が、インストールされていること。

タイトルRe^5: VBAで開いたエクセルを、保存しないで閉じたい
記事No: 15670
投稿日: 2010/09/02(Thu) 16:22
投稿者: ユキ
ご回答ありがとうございます。
Re^3でお答えいただいたコードで試したところ、無事に処理が完了いたしました!
ありがとうございます!

今までAccessVbaでエクセルを扱うときは、参照設定のMicroSoft Office 12.0 Object Libraryを使用していたのですが、この処理を行いたいときは、そもそもオブジェクトを作る必要があったということなんですね。
一応以下を試してはいたのですが、
-------------------------------------------------------
xls.WorkBooks.Saved = True
-------------------------------------------------------
エラーとなってしまっていたのは、「.Saved」はobject用の関数だから、ということでしょうか。

完全に理解出来ていないのが大変心苦しいのですが、もし見当違いのことを言っていたらご指摘いただければ幸甚です。

また、この質問をしながら並行して処理を進めていたのですが、つねにエクセルのプロセスが残ってしまっていて、原因を探しておりました。
--------------------------------------------------------
xBook.Close
Set xBook = Nothing
xBook.Close
Set xBook = Nothing
--------------------------------------------------------
これだけでは不十分で、「.Quit」が必要だったのですね。
重要なご進言いただきまして、とても助かりました。

また、Wordを使用しての方法もご紹介いただきましたが、ひとまず上記の方法で処理しようと思います。
せっかくご助言頂きましたのに申し訳ありません。

現在一つずつ処理を加えておりまして、次にまた何か処理を加えたら不具合が出るのではと危惧しております。
その時に解決が難しくなりましたら、是非またご教授いただきたいと思います。
この度は誠にありがとうございました。

タイトルRe^6: VBAで開いたエクセルを、保存しないで閉じたい
記事No: 15671
投稿日: 2010/09/02(Thu) 16:33
投稿者: Hank
> 今までAccessVbaでエクセルを扱うときは、参照設定のMicroSoft Office 12.0 Object Libraryを使用していたのですが、
> この処理を行いたいときは、そもそもオブジェクトを作る必要があったということなんですね。
いえ、違います。
MicroSoft Office 11.0 Object Library しか無いパソコンでも実行できるように、という配慮です。

> Dim xls As New Excel.Application
この変数 xls もオブジェクト変数です。
ですが最初からExcelのApplicationオブジェクトとして定義されています。

Dim objApp As Object とすると、objAppにはどんなオブジェクトでも代入出来ます。

Set objApp = CurrentDb.TableDefs(0)
でもOKですし
Set objApp = CreateObject("Excel.Application")
だってOKです。

> 一応以下を試してはいたのですが、
> -------------------------------------------------------
> xls.WorkBooks.Saved = True
> -------------------------------------------------------
> エラーとなってしまっていたのは、「.Saved」はobject用の関数だから、ということでしょうか。
これも違いますね。
.Saved は Excel.WorkBookのプロパティです。
エラーになった理由は何と言えば良いのか、言葉が見つかりません。

タイトルRe^7: VBAで開いたエクセルを、保存しないで閉じたい
記事No: 15672
投稿日: 2010/09/02(Thu) 17:06
投稿者: ユキ
> いえ、違います。
> MicroSoft Office 11.0 Object Library しか無いパソコンでも実行できるように、という配慮です。
早とちりをしてしまいまして申し訳ございません。
ご配慮くださりありがとうございます。
理解いたしました。

> > Dim xls As New Excel.Application
> この変数 xls もオブジェクト変数です。
> ですが最初からExcelのApplicationオブジェクトとして定義されています。
>
> Dim objApp As Object とすると、objAppにはどんなオブジェクトでも代入出来ます。

> > -------------------------------------------------------
> > xls.WorkBooks.Saved = True
> > -------------------------------------------------------
> > エラーとなってしまっていたのは、「.Saved」はobject用の関数だから、ということでしょうか。
> これも違いますね。
> .Saved は Excel.WorkBookのプロパティです。
> エラーになった理由は何と言えば良いのか、言葉が見つかりません。
説明させにくい勘違いをしているようで申し訳ありません。
今、コードを修正してみました。

-----------------------------------------------------------
Private Function F_Excel() As Boolean

Dim xls As New Excel.Application 'とりあえずExcelのApplicationオブジェクトとして定義
Dim objBook As Object
Dim objSheet As Object

Dim sExcelPath As String

sExcelPath = txtSetFile.Value

xls.EnableEvents = False

Set objBook = xls.Workbooks.Open(sExcelPath)
objBook.Saved = True

If objBook.ReadOnly Then
MsgBox "すでに開かれています。"
End If

'処理実行
xls.EnableEvents = True

objBook.Close
xls.Quit

End Function
-----------------------------------------------------------

上記コードでも正常に動作いたしました。
つまり、
> > -------------------------------------------------------
> > xls.WorkBooks.Saved = True
> > -------------------------------------------------------
でエラーとなっていたのは、Excel.WorkBookのプロパティを、さもExcel.Application.WorkBooksのプロパティのように使おうとしていたから、ということでしょうか。
それで、今回修正したコードでは、「objBook」をobject変数として定義したことによって、どんなオブジェクトでも代入できるようになり、結果として、
objBook.Saved = True
が処理できるようになった、という理解でよろしいでしょうか。


このAccessフォーラム過去ログ集は、Microsoft Access Club が運営しています

cPanel と PLESKをインストールした専用・共有レンタルサーバーを銀行振込でご提供中。契約書は一切不要です。
cPanel や PLESKをインストールした専用・共有レンタルサーバー
まずは1ヶ月から...。
日本国内の銀行振込がOK、契約書は不要です。

 

ページの先頭へ 前ページへ戻る