こんにちは、三流プログラマー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かぁ、久しぶりにイタズラしてみようかなぁ。。。。
| ※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。 お奨め本の目次を見るだけでも勉強になったり |