Back Home Next

A6:SQLでテーブルを削除する

A5でテーブルを削除するのにTabledefsオブジェクトのDeleteメソッドを紹介しましたが、SQLでもテーブルの削除が可能です。A5の例で書くと

Currentdb.Execute "Drop Table TargetTb"

になります。しかし外部のデータベースのテーブルを削除するのに、Inで外部のデータベースファイルを指定することはできません。DBオブジェクト自身を外部データベースのデータベースオブジェクトに設定する必要があります。このやり方はA5以前に説明済みです。


A7:Access97と2000の違い(1) 最コンパイル

AcsObMgrのバージョン1.2をAccess2000でも動作するようにした。
97と2000は機能的には大きな差がないと考えていたら、随分と違うことが今回わかった。

97のファイルを2000で使うためには、再コンパイルが必要である。

97のファイルを2000環境で開くと、97のままで2000で使えるようにコンパイルするか、2000専用にコンパイルするか選択をするダイアログが最初に現れます。

恥ずかしながら、私はこれをまったく知りませんでした。私は、下手なコードを見せたくはないのでAcsObMgrではセキュリティを設定して、プログラムの入っているメインフォームに参照・変更不可の保護を掛けていました。
ですので、実行モジュールMDEではないの使えると思っていましたら駄目とのお知らせを受け取りました。当然AcsObMgrを実行モジュール(MDE)にするとオブジェクトのやり取りはまったくできません。

2000で使えるように変更をしたのですが、細かいところでいろいろと時間が掛かってしましました。

1)セキュリティの設定方法が97とまったく違っている
2)モジュールの保護はセキュリティ設定から切り離されている
3)97で2000のオブジェクトのやり取りを防ぐ必要がある。
4) 3)と逆の事も想定しなければならない

細かい事は、追々 AcsObMgrのHowToで説明していきたいと思います。


A8:データべースを構成するモジュールを調べる

拙作AcsObjMgrではアクセスのモジュールのやりとりができます。その機能でモジュールを保管して、変更があればそのモジュール使っている各データベースと入れ替えることを実現しています。

AcsObjMgrでは登録したデータベースのオブジェクトを調べてリストを作成する部分があります。ではどうやって調べるのでしょうか?各モジュールはContainerと呼ばれるオブジェクトで管理されています。

Containerは以下のオブジェクト構造を持っています。

  Database−Containers−Container−Documents−Document

Container名は保管されているモジュール種別を示し、Documentsはその種類のモジュールの各構成要素を示します。

Container名 Container名
Scripts マクロ Reports レポート
Tables テーブル、クエリー Databases データベース
Modules モジュール RelationShips リレーションシップ
Forms フォーム SysRel

たとえばマクロのContainerを指定するには Database.Containers("Scripts") と書きます。そして、たとえばその中のAutoExecマクロを指定するには Database.Containers("Scripts").Documetns("AutoExec") と指定します。

たとえばフルパス(D:\MyDoc\Test.mdb)のデータベースに含まれるVBAプログラムモジュール名を調べるには

Dim i as Long
Dim DB as Database
Set DB = OpenDatabase(D:\MyDoc\Test.mdb)
For i = 0 to DB.Containers("Modules").Documents.Count - 1
 Msgbox DB.Containers("Modules").Documents(i).Name
Next i

With DB.Containers("Modules") End Withを使わず全部直接にオブジェクトを指定していますが、このオブジェクトにWithをつかうと何故かエラーになり使えませんでした。皆様はどうでしょうか?


A9:モジュールを入れ替える

バージョンアップしたライブラリモジュールを別のデータベースでも使いたい時があります。そのときにモジュールを自分から外部のデータベースへ送る必要があります。
DoCmdオブジェクトにTransferDataBaseメソッドあり、これが使えます。名前が重複しているときは上書きします。

DoCmd.TranfferDtabase acExport, "Microsoft Access", ExportPath, acModule, ExportSource、ExportDestination

ExportPath:入れ替えたいモジュールがあるデータベースファイルのフルパス
ExportSource:入れ替えたいモジュールの名前
ExportDestination同じ名前を指定しすれば上書きされます。

さて、では外部にあるデータベースのモジュールを削除するにはどうしたらよいでしょうか?DoCmdオブジェクトにはDeleteObjectメソッドがあります。しかしこれは自分のオブジェクトしか削除できません。しかし、DoCmdオブジェクトはApplicationオブジェトの子ですから外部データベースをApplicationオブジェクトとして取得し、その子であるDoCmdのDeleteObjectメソッドを使えば可能です。下はそのサンプルです。ExportPathは外部データベースファイルのフルパス、objは削除したいモジュール名です。

Set app = CreateObject("Access.Application")
'app.Visible = False
app.OpenCurrentDatabase ExportPath
app.DoCmd.DeleteObject acModule, obj
app.Quit

この場合Applicationオブジェクトを開いてしまいますので、そのデータベースに自動起動(Autoマクロ、起動フォームで実行されるイベント)が設定されているとそれが動いてしまいます。そこが少し面倒ですが、その自動起動が終了すれば動作は継続されモジュールは削除されます。

この自動起動を無効にしてApplicationオブジェクトを開くこともできますが少々面倒なので、また別の機会に説明したいと思います。


A10:ワードのフィールドにデータを入れて印刷

AccessにはReportがありますので、ほとんどはこれで印刷は用が足りますが、時にはWordのテンプレートを開いてその中のフィールドにアクセスのデータを入れて印刷したい場合もあります。Wordには差し込み印刷機能があり、Wordのデータテーブルファイルもしくはアクセスにリンクして印刷する機能がありますが、動作が緩慢だし、少し凝った業務処理をさせることはできません。そこで、AccessからWordを開いて制御する方法を紹介します。Wordのオブジェクトは印刷に関してはAccess97(その後良くなったのかもしれませんが)に比較すればプリンターの選択をプログラムで簡単にできるなど便利な面もあります。

Wordの文書の中にデータを送り込むには送り込みたいところにフィールドを設定しておきます。Wordには多数のフィールドがありますがこの場合は、差し込み印刷のMerge Fieldを使うのが妥当です。

メニューバーで 挿入-フィールド を操作するとフィールド・ダイアログが表示されますのでMerge Fieldを選択して名前を付けてOKを押せば挿入されます。

まず、AccessからWordを開くにはExcelのところでE6に書いてあります。

Dim MyWord, MyDoc as Object
Set MyWord = CreateObject("Word.Application")
Set MyDoc = MyWord.Documents.Open("C:\Myocument\Template1.dot")
MyWord.Visible = True

これでMyDocと言うwordのドキュメントオブジェクトが取得できました。
Fieldはこのオブジェクトの下位オブジェクトでコンテナを構成しています。構造は

Document-Fields-Field

Fieldには先ほどWordの差し込み印刷フィールドで付けた名前がNameプロパティで取得できます。また、データを設定するにはresultプロパティでRangeオブジェクトを取得してそのtextプロパティを使います。

Field-Result-Text

Filed名が住所のフィールドに住所データを設定するには

Call docWriteField(MyDoc, "住所", "東京都千代田区・・・・")

以下はサブルーティンの内容です。

Function docWriteField(myObj, docFieldName, fieldData)
Dim i As Long
 With myObj
  For i = 1 To .Fields.Count
   If InStr(.Fields(i), docFieldName) <> 0 Then
    .Fields(i).Result.Text = fieldData
   End If
  Next i
 End With
End Function

あとプリンタを選択するには

MyWord.ActivePrinter = "FX DocuPrint C830 XPL2"

で簡単にできます。プリンタの名前はプリンタコントロールで表示される名前を使えます。そのほか、ページ指定とか細かな印刷が可能です。WordVBAのHelpのPrintOutを調べてみてください。


Back Home Next


Copy Right 2001- Ken