Visual Basic基礎と実践

VB+Office 帳票最強タッグ宣言
〜MS-Word系


初音 玲 HATSUNE, Akira



Visual Basicだけではなく、Windowsベースのシステム開発では、印刷について悩むことがよくある。大量印刷、定型用紙印刷、複雑なフォーマット、帳票という名の日本独特の文化など、本当にいろいろなハードルが待ち構えている。

紙が必要な局面を考える

 紙が必要な処理を考えてみよう。もちろん、毎月末に集計処理を動かして、その結果を印刷するなどという処理を、「紙」ではなく「データベース」として保存する処理にしてしまう場合、印刷処理そのものを回避してしまうのが一番良い。しかし、Windowsパソコンが手元にないような人に対して情報提供が必要ならば、やはり帳票というものが必要だろう。また、会議資料として、紙のアウトプットが必要になるかもしれない。グループウェアなどでディスカッションすれば、会議は必要ないとも思えるが、会議を行なって共有するのは、情報だけではなく、感情、つまり安心感または不安感である。これはどんなに優れたグループウェアでも不可能な共有アイテムだ。
 そうはいっても、汎用機のように大量の印刷をこなすとすれば、プリンタの価格がシステムのハード資産に占める割合が増大してしまうかもしれない。

気分よく仕事をするには、
気分よく見られる帳票が必要だ

 同じ情報を使っていても、人によって気分よく見られる形式が異なっている。そのため、似たような帳票が大量に存在するシステムもあるだろう。また、システム化に併せて、ひとつの帳票にいろいろな情報を入れてしまったために、ひとつの帳票あたりの情報量が増えてしまい、せっかく作った帳票の使い勝手が悪いという事態が発生しているかもしれない。
 では、どうしたらよいだろうか。
 解決方法のひとつは、日本独特の帳票文化にいち早く対応しているワープロソフトまたは表計算ソフトを活用することだ。
 以前は、米国に比べて、PCの導入が遅れていた日本ではあったが、その当時でも「ワープロ」という独自の情報処理機器が普及していたのは周知の事実だ。そして、そこで培われたのが、罫線を駆使した美しいワープロ文書たちだ。凝りに凝った出力結果は、ちょこっと業務を覗いただけの社外の技術者はもとより、同じ社内の情報システム部の社員ですらかなわないだろう。今でも、RDBMSから出力された印刷結果に満足せずに、その帳票を片手に自分の作り上げたフォーマットに打ち直している猛者もいると聞く。もちろん、これでは業務の効率化など望めない。しかし、規定の帳票を“お仕着せ”と感じているとしたら、効率化という錦の御旗を振りかざして、“気分よく仕事をする”ことをないがしろにはできないだろう。
 ならば、逆転の発想だ。最終的な帳票はいままで通り利用者に作ってもらい、システム的には、その帳票を自動的に印刷するような仕組みを提供するのだ。「餅は餅屋」という訳だ。

VBAを使わない方法を考える

 今回の注目点は、帳票を利用者に作って貰うという点だ。そこで、VBAなど文書ファイル自体にロジックを梱包しない方法を探ってみよう。VBAを利用するとVBAの配布という問題なども生じてしまう。もちろん、帳票を作成した人がVBAを利用するのは構わないだろう。
 今回は、具体的な方法として、テキストファイルなどの中間ファイルを利用する方法を採用してみる(図1)。

図1:中間ファイルを利用して帳票を自動出力するシステムの概念図
図1:中間ファイルを利用して帳票を自動出力するシステムの概念図

テスト用テキストファイルを用意する

 まずは、CSV形式の一時ファイルのフォーマットやファイル名を決定する。フォーマットが決まったら、帳票を利用者に作ってもらうためのテストデータを添えた一時ファイルを手動で作成する。
 一時ファイルの1行目には、項目名をカンマで区切って設定する。そして、2行目以降に実際に帳票に印刷するデータを設定する。まずはテスト用なので、リスト1のような計2行のみのデータでもよいだろう。

リスト1:テスト用に作成するテキストファイル
"日付","提出先","作成者","件名"
"1999/03/01","青田 恵","初音 玲","書籍出版について"

テンプレートを作成する

(1) Wordを使って、dotファイルを作成する。dotファイルといえども何も特別なことはなく、ごく普通に文章を入力する(図2)。
(2) [ツール]-[差し込み印刷ヘルパー]メニューをクリックして、作業中のウィンドウを指定(図3)。
(3) [データファイル指定]ボタンをクリックして、一時ファイルを指定する(図4)。
(4) 「差し込みフィールドが見つからない」というメッセージが表示されるが、気にせずdotファイル(メイン文書という名前で呼ばれる)への差し込みフィールド挿入を開始する(図5)。
(5) [差し込みフィールド挿入]ボタンをクリックすると、一時ファイルの1行目で指定した項目名が表示される(図6)ので、ここで項目名を選び、適切な印刷位置に挿入する(図7)。
(6) フィールドの挿入が終わったら、[差し込んだデータの表示]をクリックして印刷結果を確認する(図8)。

図2:Wordのテンプレートファイルを作成する
図2:Wordのテンプレートファイルを作成する

図3:「差し込み印刷ヘルパー」で作成しているテンプレートを指定
図3:「差し込み印刷ヘルパー」で作成しているテンプレートを指定

図4:差し込み印刷のデータとして一時ファイルを指定する
図4:差し込み印刷のデータとして一時ファイルを指定する

図5:差し込みフィールドが見つからなくてもそのまま続行
図5:差し込みフィールドが見つからなくてもそのまま続行

図6:一時ファイルの1行目に指定した項目名が表示される
図6:一時ファイルの1行目に指定した項目名が表示される

図7:項目名を選んで印刷位置に挿入
図7:項目名を選んで印刷位置に挿入
図8:挿入したデータを表示させて確認
図8:挿入したデータを表示させて確認

データを取得する

 利用者がテンプレートを作成している間に、システム開発者側はRDBMSからデータを取得する部分を作成する。Visual Basicは人気のあるツールなので、大抵のRDBMSは、Visual Basic用のミドルウェアを用意している。これは帳票ツールがODBC程度しかサポートしていないのと大きく異なる点だ。よって、一時ファイルを作成することにより、帳票ツールがサポートしている方法に縛られず、それぞれのRDBMSに最適なミドルウェアを選択することができる。たとえば、Oracleであれば、Oracle Objects for OLEだ。今回は、私が慣れているRDBMSでもあり、使っている人も多いと思われるので、Oracleをサンプルプログラム(サンプル1)のターゲットとしている。

テキストファイルを作成する

 取得したデータを使ってテキストファイルを作成する。

Wordと連携する

 Wordと連携する上での注意点は、dotファイルからデータソースの情報を削除することだ。削除方法は単純で、一時ファイルをリネームまたは削除してから、[差し込み印刷ヘルパー]を使い、差し込みデータの削除を行なえばよい(図9)。
 そして、「Microsoft Word 8.0 Object Library」を参照設定してから、Word.Applicationオブジェクトを生成してdotファイルと一時ファイルを関連づければよい(リスト2)。

図9:差し込みデータの削除を行なう
図9:差し込みデータの削除を行なう

リスト2:dotファイルとデータファイルを関連づける
    Dim wrdappl         As Word.Application
    Dim wrdmail         As Word.MailMerge

    Set wrdappl = New Word.Application

' 指定した名前のファイルを開きます。
    wrdappl.Documents.Open mstrRootDir & "\SAMP01.dot"

' 開いたウィンドウを定型書簡としてメイン文書にします。
    Set wrdmail = wrdappl.Documents("Samp01.dot").MailMerge

' 指定したデータファイルを作業中の文書に結合して、メイン文書にします。
    wrdmail.OpenDataSource _
        Name:=mstrRootDir & "\SAMP01.txt", _
        ConfirmConversions:=False, _
        ReadOnly:=True, LinkToSource:=False, _
        AddToRecentFiles:=False, _
        Connection:="DSN=Text Files;DBQ=" _
          & mstrRootDir & ";FIL=RedISAM;", _
        SQLStatement:="SELECT * FROM `SAMP01.txt`", _
        SQLStatement1:=""

'差込印刷を実行(出力先は文書)。
    wrdmail.Destination = wdSendToPrinter

再印刷を考える

 さて、一時ファイルを使ったときには、副次的な利点が生じる。それは、再印刷を素早く行なえるということだ。もし、帳票ツールから直接RDBMSのデータを取得しているような時に、紙詰まりなどが発生した場合、データ検索からやり直さなければならない。これは、プリンタサーバーやプリンタなどに帳票データを出力し終わった段階で、プログラムに印刷完了の通知が上がってきてしまうからだ。一部のプリンタでは、プリンタドライバ側およびプリンタ側で再印刷の機能を持っているものもあるが、まだまだ一般的ではない。そこで、今回採用した一時ファイルが活躍する。

(1) プログラム起動時にbakファイルが存在しない場合、再印刷かどうかを確認する(リスト3)
(2) プログラム正常完了時に一時ファイルをbakファイルにリネームする(リスト4)

リスト3:bakファイルの有無を調べて再印刷処理を行なう
'再印刷処理
   If Dir$(mstrRootDir & "\SAMP02.txt") = "" And _
      Dir$(mstrRootDir & "\SAMP02.bak") <> "" Then

       If MsgBox("再印刷処理しますか。", _
         vbYesNo + vbInformation _
         + vbDefaultButton2, App.Title) = vbYes Then

           FileCopy mstrRootDir & "\SAMP02.bak", _
             mstrRootDir & "\SAMP02.txt"
           Call blnWordOutput
           Kill mstrRootDir & "\SAMP02.txt"

       End If
   End If
リスト4:プログラムの正常終了時にはファイルをリネームする
Private Sub cmdPrint_Click()
    If blnFileMake Then
        If blnWordOutput Then
            On Error Resume Next
            Kill mstrRootDir & "\SAMP01.bak"
            FileCopy mstrRootDir & "\SAMP01.txt", _
                     mstrRootDir & "\SAMP01.bak"
        End If
    End If
End Sub

 これならば、最後に印刷した結果を短時間で再印刷可能だ(サンプル2、図10)。

図10:再印刷の確認を行なうダイアログ
図10:再印刷の確認を行なうダイアログ

セキュリティを考える

 さて、テキストファイルを一時ファイルに使用するとき、心配になる点があるとしたら、セキュリティだ。データをOracleに格納して、select権限などによりデータ参照を制限していたとしても、ローカルディスク上に情報をおいてしまったら、せっかくのセキュリティが甘くなってしまうと考えたなら、システム設計のセンスがあると言えるだろう。
 残念ながら今回の方法では、プログラムで簡単にセキュリティを確保するのは不可能だ。

OSの力を借りる

 プログラムでセキュリティを確保するのは大変だが、OSの力を借りればセキュリティは確保できる。Windows NTを使っているならば、一時ファイルを作成するディレクトリを利用者ごとのフォルダにすればいいのだ。
 要は、1台のPCを共有するならば、Windows NTの使用が大前提ということだ。Windows 95/98を使うならば、1人1台にして、NTドメインへのログオンを必須にする必要がある。

中間ファイルを削除する

 そうは言っても、Windows 95/98でセキュリティ確保の方法が全然ないということではない。たとえば、もっとも単純な方法として考えられるのは、一時ファイルを消す方法だろう。問題は、そのタイミングだ。
 再印刷の問題はあるが、印刷終了後、一時ファイルを消すという方式が思い浮かぶかもしれないが、このタイミングでは、一時ファイルを消す前にプログラムが異常終了してしまったり、Windowsがフリーズしてしまった場合を考慮すると、確実に一時ファイルを消せる方法とは言えない。
 そこで考えられるのが、ログオン時に一時ファイル削除をする方法だ。一時ファイルを作成するディレクトリ(たとえば「c:\temp」)を決めておけば、[スタートアップ]フォルダに、

del c:\temp\*.*

を実行するbatファイルを用意するだけでよい。Windows NTのときは、

del c:\temp\*.* /yes

となる。この方式では、使い終わったらログオフしておくことにより、他の人がログインしたときに、自分が使っていた一時ファイルを確実に削除することができる。ただし、この方法では、[スタートアップ]フォルダからbatファイルを外されたり、batファイルの中身を書き換えられたりする可能性もある。また、普通の利用者では変更されたことも気づきにくいことを理解しておく必要があるだろう。


VB Magazine ライブラリ| Visual Basic WorkGroup
int21 ホームページ| PCDN ホームページ

PCDN
Copyright (c) 1998 int21 CorporationAll Rights Reserved.
For questions or comments, please send mail to: pcdn@int21.co.jp