マクロを使って、クエリーの結果を宛名ラベルに印刷したい †
ページ | OpenOffice.org FAQの登録ページ |
---|---|
投稿者 | GAKU |
分類 | |
優先順位 | |
状態 | |
カテゴリー | |
投稿日 | 2010-04-18 15:35:39 (日) |
OS | Windows XP |
依存するページ | |
バージョン |
メッセージ †
回答ページでは行末に「~」を付加する必要はありません |
いつもお世話になっております。
Baseを使って、イベントの参加者情報を管理しています。
過去に参加した人宛に、参加案内を発送するためのラベルをWriterの差し込み印刷で印刷したています。
この機能をマクロを使って自動化できないか、質問させていただきます。
下記のテーブル等を含むデータベース"sample.odb"と宛名ラベル用のテンプレート"差し込みsample.odt"を添付します。
テーブル
参加者マスター・・・参加者の氏名・郵便番号・住所を登録。
参加申し込み状況テーブル・・・各参加者が何年度に参加したかの履歴を登録。
クエリー
参加案内発送先(XX年以降指定)
・・・過去3年間に参加した人にだけ案内を発送するために必要なクエリー
例えば、2010年の参加案内は2007年以降に参加履歴のある人だけを抽出します。
フォーム
メニュー・・・このフォームにある”宛名ラベル印刷”ボタンをクリックすると、クエリーが実行され、
"2007"と入力すると、ラベルが印刷されるようにしたい。
どうぞよろしくお願いいたします。
こんな感じ? †
M.Kamataki (2010-04-18 23:11:11 (日))
メニューフォームの”宛名ラベル印刷”ボタンのアクションで「ドキュメントまたはHTMLを開く」を選び、URL欄の[...]ボタンから差し込み印刷用のWriterドキュメントを選んであげるとボタンのクリックで指定したドキュメントを表示できます(下図参照)。
差し込み印刷用ファイルでは、「ツール」-「カスタマイズ」で、「文章を開いた時」のイベントに下記のマクロを割り当てています。Sub PrintLabels dim document, dispatcher as object document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array()) End Sub以下のサンプルをダウンロードしたら、faq5_332sample.odbをデータソースに登録し、”宛名ラベル印刷”ボタンのアクションに指定したfaq5_332sample.odtファイルのパスを変更してください。
faq5_332sample.odb
faq5_332sample.odt
マクロはfaq5_332sample.odtファイル内にあるので、ファイルを開くと「セキュリティ警告」ダイアログで「マクロの有効化」ボタンをクリックしてください(オプションでマクロのセキュリティレベルを「中」に)。
下図のダイアログで「はい」をクリック。
「差し込み印刷」ダイアログで、faq5_332sample.odbの参加案内発送先(XX年以降指定)クエリーを指定すると下図のように「パラメータの入力」ダイアログで印刷したい開催年度を入力します。
あとは通常の差し込み印刷と同じです。
なお、添付の"差し込みsample.odt"では、1レコードが1ページに24面付けされて出力されてしまったので改めて作成しています。さらに「〒」「様」は「条件付きテキスト」機能を使い、「郵便番号」「氏名」フィールドが空の場合は非出力にしています。こうすることによって、未印刷のラベルの再利用ができます。エコに配慮しています。
ちょっと残念 †
M.Kamataki (2010-04-18 23:33:06 (日))
faq5_332sample.odbをご覧いただけるとわかりますが、パラメータクエリーをビューにしてみました。ところがパラメータクエリーなのに、ビューではパラメータが表示されません。
ビューでパラメータクエリーが実行できると、「差し込み印刷」ダイアログが表示された段階で、差し込み印刷ファイルに関連付けされたビューが自動で表示されるので、手間が1ステップ省略できるんですけどね。
無題 †
tani (2010-04-19 12:46:04 (月))
ちょっと前に差し込み印刷のマクロによる自動化に関して調べていて、以下を見つけました。
http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=25637
http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=22804
鎌滝さんのレスで解決しそうですが、何かの参考までに。
# ただ、そもそもマクロで実装するのであれば、わざわざ手間が多い差し込み印刷機能を
# 利用しなくても、通常の文書内の文字データの置換APIだけで充分な気がします。
# 「%名前%」「%住所%」とかいう文字列をテンプレートになる文書内に埋め込んでおいて、
# マクロから置換/複製/印刷の自動化を行うという感じで。
ありがとうございます †
GAKU (2010-04-19 21:59:51 (月))
M.Kamatakiさん、早々に回答いただき、ありがとうございます。
作っていただいたfaq5_332sample.odbとfaq5_332sample.odtをダウンロードし、上手くいくことを確認しました。
ビューを指定した場合は、確かに上手くいきません。
taniさん
まだまだOpenOffice初心者なんで、最後の4行で書いていただいた置換APIについて、もう少しご教授いただけないでしょうか?
差し込み印刷を使わず、できる方法も知って、使ってみたいです。
よろしくお願いします。
Re: ありがとうございます †
M.Kamataki (2010-04-20 00:04:14 (火))
サンプルとして添付していただいた 差し込みsample.odt は、1ページ24面のラベルすべてが1レコード分の住所、氏名になりますよね。GAKUさんの意図したものが、そのようなラベルであれば、1ページ分のテンプレートを用意しておき、レコード分のページ数に出力するというマクロになると思います。
この場合は、確かに置換するマクロで良いかもしれませんが、1レコード分が1ラベルだと差し込みフィールド方式のほうが良いのではないでしょうか。「条件付きテキスト」機能が使えるのも、差し込みフィールドでないと無理だと思います。「条件付きテキスト」機能をうまく使えば、会社名だけの際は会社名の後ろに「御中」を付け、名前欄は出力しないといったことも可能です。
ところで、faq5_332sample.odtファイルがメニューから呼び出されたら、マクロを有効化せずに、「F4」キーを押して見てください。faq5_332sample.odbがメモリにロードされている状態なら、比較的すぐに「参加案内発送先(XX年以降指定」クエリーが選択され、開催年度を入力する「パラメータの入力」ダイアログが表示されると思います。
レコードをすべて選んで、「データからフィールドへ」ボタンをクリックすれば、すべての差し込みフィールドにレコードが流し込まれます。このような順序で印刷するという方法もあると思います。
無題 †
tani (2010-04-20 10:41:21 (火))
基本的に差し込み印刷とかラベル作成とかの機能を利用するときって、
・手作業で大量の似たような文書を作るのはめんどくさい。
・プログラムを組むのはもっとめんどくさい。
って感じの状況なのかなーと勝手に思ってましたので、既にマクロで何かプログラムを実装するという
前提があるなら、別に差し込み印刷の機能にこだわらなくてもいくらでもやり方があるんじゃないかなと、レスしました。
大雑把に置換とかでいいのでは、とか書きましたが、何を書いているのかピンとこないようでしたら、
スルーしてください。
条件付きテキストはダメかも †
M.Kamataki (2010-04-20 11:14:12 (火))
ところで、「条件付きテキスト」機能はうまく動いてますか〜。作成しておいてなんですが、うまく動いていないのではないでしょうか。以下のようなIssueがあって、記号が入っているとよろしくないようです。
Conditional field doesn't work when DB field name contains a special character.
http://ja.openoffice.org/issues/show_bug.cgi?id=102229
上記が原因とは必ずしも特定できませんが、IssueTrackerを調べると「条件付きテキスト」機能に関する未修正の不具合はいくつかありました。
「条件付きテキスト」ではなくて、クエリー側で「〒」と「様」を付加するというのはどうでしょうか。SQLのCONCAT関数を使うと下図のようにデータに文字列を付加できます。
無題 †
ike@九州 (2010-04-20 12:27:55 (火))
私も動作しなかったので、自分だけの環境だと思い試行錯誤してました。
Issueの記述のように
条件式左辺を "[" 、"]" で囲むと日本語でもOKのようでした[faq5_332sample.参加案内発送先(XX年以降指定).郵便番号] == ""
ありがとうございます。 †
GAKU (2010-04-21 02:17:52 (水))
M.Kamatakiさま、taniさま、ike@九州さま
回答ありがとうございます。
私の確認が不十分でした。確かに「〒」と「様」が表示されていませんでした。
CONCAT関数を使えば、「〒」「様」ともに表示されることも確認しました。
ご指摘いただいた通り、作成したいのは1レコード=1ラベルです。
教えていただいた回答でも十分なのですが、後学のために、もう少し教えてください。
データベースのことを知らない人でも簡単に宛名ラベルが印刷できるよう、”宛名ラベル印刷”ボタンをクリックすると、いきなり”開催年度”のパラメータ入力のダイアログが表示されるようなことは難しいのでしょうか?
(つまり、使う人にクエリーの指定をさせないということです)
お手数ですが、よろしくお願いします。
いったん完了にします †
M.Kamataki (2010-04-21 10:19:36 (水))
以下のように検討すべき課題が幾つかあると思います。解決方法は当ページのものとはまったく異なるものになると思いますので、パラメータクエリーを利用した印刷については、ここでいったん完了とし、課題を整理した上で改めてご質問ください。
課題
・パラメータクエリーを利用するかどうか
実はマクロではパラメータクエリーを利用できません。input関数などを利用して検索値を入力してもらうか、フォーム上のテキストボックスから検索値を引っ張ってくるか、このあたりを検討しましょう。
参考:
faq/5/294「Baseマクロ(OOo Basic)のSQLについて」
・正しいデータの確認は必要ないかどうか
>データベースのことを知らない人でも簡単に宛名ラベルが印刷できるよう
とのことなので、オペレーションミスをされた際のことも考えておきましょう。印刷前に流し込まれたデータが正しいかどうか、確認が必要になるのではと思います。
そうすると、上記「Re: ありがとうございます」で紹介した方法が有効です。F4キーを押すと、「いきなり”開催年度”のパラメータ入力のダイアログが表示される」と思います。この「F4キーを押す」という手順は「マクロの記録」でコード化できるので、差し込み印刷用ファイルの「文章を開いた時」のイベントに割り当てれば、「いきなり”開催年度”のパラメータ入力のダイアログが表示される」状態になります。データを確認し、Writerのツールバーに置いてある「印刷」ボタンか、差し込み印刷用ファイルに「印刷」ボタンを置く方法が考えられます。この場合は、作成されたパラメータクエリーをそのまま利用することになりますね。
・Baseのフォームを使う必要があるかどうか。
いずれにしてもマクロは、差し込み印刷用ファイルに置く、あるいは「マイマクロ」に置くというのが良いように思います。そうすると、差し込み印刷用ファイルを直接開けば良いはずです。フォームはWriterでも、マクロのダイアログでも作成できるので、Baseファイルを起動しないと開けないというBase上のフォームは無駄なような気がします。一応、Baseファイルを起動したら指定したフォームを自動起動する方法は以下のようにありますので、このあたりもご検討ください。
参考:
faq/4/419「AccessのようにメニューフォームをBase起動時に表示したい」
faq/4/1259「コマンドボタンに割り当てたマクロが動作しません」
・すべてマクロで実現するかどうか
taniさんが紹介された以下がご理解できれば、可能だと思います。わたしはもうちょっと勉強しないといけないみたいです。
http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=25637
http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=22804
ありがとうございます。 †
GAKU (2010-04-21 16:00:53 (水))
M.Kamataki さま
問題点を細分化していいただき、ありがとうございます。
こちらの要件と合わせて考え、また質問させていただきます。
まずは、いただいたアドバイスを理解するのに時間がかかりそうですが・・・。
今回は本当にありがとうございました。