[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.054 AccessからExcel開いて、処理終了後に閉じたい

AccessからExcel開いて、処理終了後に閉じたい

こんにちは、三流プログラマーKen3です。

今回は、
AccessからExcel開いて、処理終了後に閉じたい
を軽く書きたいと思います。

へぇ〜、そうなんだぁ程度に、気楽に読んでください。

サンプルファイルは、
http://www.ken3.org/vba/lzh/vba054.lzh
に
db054-97.mdb, test054-book.xlsが保存されています。

Access側のdb054-97.mdbから、test054-book.xlsを開いて、閉じてます。
遊んでみてください。

/*
 * 1.今回のキッカケ
*/

掲示板 : http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi
に下記の書き込みがありました。

In message "[BBS :52] アクセスからエクセル",
 >BBS に以下の投稿がありました。
 >
 >投稿時間:2003/02/05(Wed) 23:15
 >
 >おなまえ:fox1972
 >タイトル:アクセスからエクセル
 >コメント:
 >
 >AccessからExcelの「とある」ブックを立ち上げて、そのブックでは
 >"Workbook_Open()"を用いてとある処理をさせる。その処理が終われ
 >ばブックを閉じてAccessに戻る...といった、わがままな処理は出来ますか?
----

わがまま?とは思わないけど、最近過保護が増えたのかなぁ?
じゃなくって、ありそうな処理ですよね。

/*
 * 2.簡単に書いたけど、あれ?関数走らない、、、なぜ?
*/
Access97側で、ブックを開きます。
その後、ブックを閉じて、Excelも終了させます。
    '頭にCreateObjectで作成した変数を追加しただけ
    oApp.Workbooks.Open FileName:=strXLSFILE
    '^^^^

    'AUTO_OPENのモジュールが勝手に走る

    '終わったら、閉じたいんだけど、、、
    oApp.ActiveWorkBook.Close SaveChanges:=False
    oApp.Quit
がポイントです。

Access97側サンプルのボタン
Option Compare Database
Option Explicit

Private Sub btnTEST_Click()

    Dim strXLSFILE As String   'Excelのファイル名格納場所
    Dim oApp       As Object   'Excelを操作するオブジェクト変数
    Dim strMDBPATH As String
    Dim strWORK    As String
    Dim i          As Integer  'カウンター変数


    'Accessの起動位置を取得 CurrentDb.NameにD:\xxxx\yyyy\zzz.mdbが入っている
    strWORK = CurrentDb.Name
        '後ろから1文字単位で¥を探す
    For i = Len(strWORK) To 1 Step -1
        If Mid(strWORK, i, 1) = "\" Then Exit For  '¥だったら抜ける
    Next i
        'D:\xxxx\yyyy\zzz.mdb --> D:\xxxx\yyyy\ にする
    strMDBPATH = Mid(strWORK, 1, i)

    'Excelの元ファイルの名前を作成 D:\xxxx\yyyy\ + TYPE.xls
    strXLSFILE = strMDBPATH & "Test054-Book.xls"
    
    'ファイルの存在をチェックする
    If Dir(strXLSFILE) = "" Then
        MsgBox strXLSFILE & " を 確認して下さい"
        Exit Sub  '途中で抜ける
    End If

    Set oApp = CreateObject("Excel.Application")
    oApp.Visible = True
    'Only XL 97 supports UserControl Property
    oApp.UserControl = True

    '頭にCreateObjectで作成した変数を追加しただけ
    oApp.Workbooks.Open FileName:=strXLSFILE
    '^^^^

    'AUTO_OPENのモジュールが勝手に走る

    '終わったら、閉じたいんだけど、、、
    oApp.ActiveWorkBook.Close SaveChanges:=False
    oApp.Quit

End Sub

Excel97側では、
Workbook_Openにメッセージボックスと、ユーザー関数を呼んでみました。
*ユーザー関数は、自由に書いてくださいね。

Private Sub Workbook_Open()
    MsgBox "ブックを開きました"
    Call PUT_DATA  '関数を呼ぶ
End Sub

Sub PUT_DATA()
    
    Sheets("Sheet1").Select
    Range("B4").Select
    
    Range("B4").Value = "XXさん大好き"

    Dim i As Integer
    
    For i = 10 To 126
        Range("B4").Font.Size = i
    Next i
    
    For i = 126 To 12 Step -1
        Range("B4").Font.Size = i
    Next i

End Sub

テスト実行、、、
あれ?PUT_DATAの関数が走らない、、、なぜ?

単体でExcelブックを開くと走るのに、、、う〜ん。。。。

/*
 * 3.小細工で、RUNメソッドに変更
*/

Workbook_Openで走らないので、
Excelのユーザー関数を、.RUNメソッドで呼んでみた。

AUTO_OPEN辞めて、自分で関数呼ぶ

Option Compare Database
Option Explicit

Private Sub btnTEST_Click()

    Dim strXLSFILE As String   'Excelのファイル名格納場所
    Dim oApp       As Object   'Excelを操作するオブジェクト変数
    Dim strMDBPATH As String
    Dim strWORK    As String
    Dim i          As Integer  'カウンター変数


    'Accessの起動位置を取得 CurrentDb.NameにD:\xxxx\yyyy\zzz.mdbが入っている
    strWORK = CurrentDb.Name
        '後ろから1文字単位で¥を探す
    For i = Len(strWORK) To 1 Step -1
        If Mid(strWORK, i, 1) = "\" Then Exit For  '¥だったら抜ける
    Next i
        'D:\xxxx\yyyy\zzz.mdb --> D:\xxxx\yyyy\ にする
    strMDBPATH = Mid(strWORK, 1, i)

    'Excelの元ファイルの名前を作成 D:\xxxx\yyyy\ + TYPE.xls
    strXLSFILE = strMDBPATH & "Test054-Book.xls"
    
    'ファイルの存在をチェックする
    If Dir(strXLSFILE) = "" Then
        MsgBox strXLSFILE & " を 確認して下さい"
        Exit Sub  '途中で抜ける
    End If

    Set oApp = CreateObject("Excel.Application")
    oApp.Visible = True
    'Only XL 97 supports UserControl Property
    oApp.UserControl = True

    '頭にCreateObjectで作成した変数を追加しただけ
    oApp.Workbooks.Open FileName:=strXLSFILE
    '^^^^

    'AUTO_OPENのモジュールが勝手に走る

    '関数を自分で呼ぶ
    oApp.Run "PUT_DATA"

    '終わったら、閉じたいんだけど、、、
    oApp.ActiveWorkBook.Close SaveChanges:=False
    oApp.Quit

End Sub


oApp.Run "PUT_DATA"で関数呼ばれて、Excel側の処理は終了。

終わったら、閉じたいから、
    oApp.ActiveWorkBook.Close SaveChanges:=False
とブックを強制クローズしてから、
    oApp.Quit
でExcelアプリをサヨナラする。

逃げ手だけど動いたと思います。。。。。

/*
 * 4.おわりの挨拶
*/

今回は、AccessからExcelアプリの操作で、
・.Run "モジュール名"でExcelのユーザー関数実行
・.ActiveWorkBook.Close SaveChanges:=False でブックを強制的に閉じる
・.Quit でアプリケーションを終了
でした。

サンプルファイルは、
http://www.ken3.org/vba/lzh/vba054.lzh
に
db054-97.mdb, test054-book.xlsが保存されています。

Access側のdb054-97.mdbから、test054-book.xlsを開いて、
処理後に閉じてます。
遊んでみてください。

何か素朴な疑問などあったら、メール、掲示板に気軽に書いてください。

拾い読みして、
1つでも何かの参考となれば幸いです。

Excel/Access大好き、三流プログラマーKen3でした。

----------------------------------
関連項目(ただのバックナンバー紹介)
----------------------------------
[No.7 MDBと同フォルダのExcelファイルを開く]
( http://www.ken3.org/backno/backno_vba02.html#7 を参照)
では、MDBと同フォルダのExcelファイルを開きました。

[No.48 AccessからExcelブックを開き、書式設定を行う]
( http://www.ken3.org/backno/backno_vba10.html#48 を参照)
では、AccessからExcelブックを開いて、書式の設定を行いました。

時間があったら、あわせてみて下さい。

--------------------
読者からのお便り紹介
--------------------
In message "ネタにしてください",
茶坊さん wrote...
 >ナンバープレイスって知ってます?
 >9x9のマスの中に数字を埋めていく奴です
 >
 >http://www.asahi-net.or.jp/~gi5j-uehr/puzzle/ 
 >とか
 >フリーソフトもいっぱいありますが・・・
 >
 >ken3エクセルで作れませんか?
 >解説してください
----
ヤバイ、まだ手を付けて無いや、、、

In message "outlookを開いてメールを送ることはできますか?",
onikoさん wrote...
 > IEを開いてHPを見るというのがありましたが、
 >OUTLOOKを開いてメールを送るにはどうしたら
 >よろしいでしょうか?
 >
 > 宛先はエクセルのどこかのセルに入れておいても
 >構いません。
 >
 > マガジンで紹介してください。
 >急ぎませんのでよろしくお願いいたします。
----

急がないって言われると、変わり者だから急ぎたくなるんだよなぁ、、、
OUTLOOKかぁ、久しぶりにイタズラしてみようかなぁ。。。。

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.054を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)

[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・