原文「Creating a macro」
記録されたマクロは、何度も繰り返しても、同じタスクを繰り返します。記録されたマクロを作成する前に、私は、通常、2つの疑問をもちます。:
- タスクは、変更をしないコマンドの単純な設定として、まとめることができますか?
- 最後のコマンドが、次のコマンドのために、準備のできたカーソルをそのままにしておくように、ステップを配置することはできますか?
複雑な例
A complicated example
私は、頻繁に、ウェブサイトからデータの行と列をコピーし、テキスト文書の表として、それらの書式を整えます。まず、私は、ウェブサイトからクリップボードへ、表をコピーします。変な書式設定とフォントを回避するために、私は、書式設定されていないテキストとして、Writerドキュメントにテキストを貼り付けます。私は、列間のタブで、テキストを再度、書式を設定します。そのため、私は、表に変換するために、Table > Convert > Text to Tableを使うことができます。
私が、テキストの書式を設定するために、マクロを記録する場合、私は、確かめるために、テキストを検査します。(私が、尋ねる2つの疑問を覚えておいて下さい)。一例として、私は、FontWeight定数グループを、OpenOffice.orgウェブサイトからコピーしました。最初の列は、定数名を示します。それぞれの名前の後に、スペースとタブが続きます。
フォントの太さは、specified/knownでありません。
DONTKNOW 50%のフォントの太さを指定します。
THIN 60%のフォントの太さを指定します。
LIGHT 75%のフォントの太さを指定します。
SEMILIGHT 90%のフォントの太さを指定します。
NORMAL 標準のフォントの太さを指定します。
SEMIBOLD 110%のフォントの太さを指定します。
BOLD 150%のフォントの太さを指定します。
ULTRABOLD 175%のフォントの太さを指定します。
BLACK 200%のフォントの太さを指定します。
私は、最初の列に数値が、2つ目の列に名前が、そして、3つの列に説明が含まれていることを望みます。適当と思われる操作は、数値が含まれていないDONTKNOWとNORMALを除いて、すべての行のために、簡単に達成されます。-しかし、私は、値が、0と100であることを知っています。それで、私は、それらを手作業で入力します。
データは、複数の方法で、片付けることができます。-それらのすべては、簡単です。最初の例では、キーストロークを使用します。 それは、カーソルが、テキストTHINの開始する行にあると想定します。
- 記録を開始するために、Tools > Macros > Record Macroを使用します。
- 始点を「指定する」ためのカーソルを移動するために、Ctrl+右矢印を押します。
- タブとスペースを削除するために、Backspaceを2回押します。
- Tabを押すと、定数名の後ろに空白がないタブが追加されます。
- Deleteを押して、小文字のsを削除し、Sを押して大文字のSを追加します。
- 数値の先頭へカーソルを移動するために、Ctrl+右矢印を2回押します。
- %記号の前にカーソルを選択し、移動するために、Ctrl+Shift+右矢印を押します。
- 選択したテキストをクリップボードにコピーするために、Ctrl+Cを押します。
- 行の終わりまでカーソルを移動するために、Endを押します。
- 2つの末尾のスペースを削除するために、2回Backspaceを押します。
- カーソルを行の先頭に移動するために、Homeを押します。
- 行の先頭に選択された数値をペーストするために、Ctrl+Vを押します。
- また、値を貼り付けると、余分なスペースも貼り付けられました。それで、余分なスペースを削除するために、Backspaceを押します。
- 数値と名前の間にタブを挿入するために、Tabを押します。
- 行の先頭に移動するために、Homeを押します。
- 次の行に移動するために、下矢印を押します。
- マクロの記録を停止し、マクロを保存します。
マクロを記録するよりも、ステップの読み書きに時間がかかります。あなたが、それらを行うように、ゆっくり作業して、手順について考えます。実践で、これは2つ目の性質になります。
生成されたマクロは、コードと上記のステップを一致させるために、コメントのステップ番号を含むように変更されています。
LISTING 2:列の先頭へ数値をコピーします。
sub CopyNumToCol1
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem (2) Press Ctrl+Right Arrow to move the cursor to the start of "specifies".
dispatcher.executeDispatch(document, ".uno:GoToNextWord", "", 0, Array())
rem (3) Press Backspace twice to remove the tab and the space.
dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
rem (4) Press Tab to add the tab without the space after the constant name.
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Text"
args4(0).Value = CHR$(9)
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args4())
rem (5) Press Delete to delete the lower case s ....
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, Array())
rem (5) ... and then press S to add an upper case S.
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "Text"
args6(0).Value = "S"
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args6())
rem (6) Press Ctrl+Right Arrow twice to move the cursor to the number.
dispatcher.executeDispatch(document, ".uno:GoToNextWord", "", 0, Array())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:GoToNextWord", "", 0, Array())
rem (7) Press Ctrl+Shift+Right Arrow to select the number.
dispatcher.executeDispatch(document, ".uno:WordRightSel", "", 0, Array())
rem (8) Press Ctrl+C to copy the selected text to the clipboard.
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
rem (9) Press End to move the cursor to the end of the line.
dispatcher.executeDispatch(document, ".uno:GoToEndOfLine", "", 0, Array())
rem (10) Press Backspace twice to remove the two trailing spaces.
dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
rem (11) Press Home to move the cursor to the start of the line.
dispatcher.executeDispatch(document, ".uno:GoToStartOfLine", "", 0, Array())
rem (12) Press Ctrl+V to paste the selected number to the start of the line.
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
rem (13) Press Backspace to remove the extra space.
dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
rem (14) Press Tab to insert a tab between the number and the name.
dim args17(0) as new com.sun.star.beans.PropertyValue
args17(0).Name = "Text"
args17(0).Value = CHR$(9)
dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args17())
rem (15) Press Home to move to the start of the line.
dispatcher.executeDispatch(document, ".uno:GoToStartOfLine", "", 0, Array())
rem (16) Press down arrow to move to the next line.
dim args19(1) as new com.sun.star.beans.PropertyValue
args19(0).Name = "Count"
args19(0).Value = 1
args19(1).Name = "Select"
args19(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args19())
end sub
カーソル動作は、(検索とは対照的に)すべての操作に使用されます。DONTKNOW行で実行する場合、単語の重みが、行の前に移動ます。そして、最初の"The"は、"She"に変更されます。これは、完璧ではありませんが、私は、行でマクロを実行してはいけませんでした。それには、適切なフォーマットがありませんでした。;私は、手作業でこれらを行う必要があります。
マクロをすばやく実行する
Running the macro quickly
Tools > Macros > Run Macroを使用して、マクロを繰り返し実行することは、面倒です(図3を参照してください)。マクロは、IDEから実行することができます。Basic Macroダイアログを開くために、Tools > Macros > Organize Macros > OpenOffice.org Basicを使用します。あなたのマクロを選択し、EditをクリックしてIDEでマクロを開きます。
IDEは、ツールバーに、IDEの最初のマクロを実行するRun Basicアイコンを持っています。あなたが、最初のマクロを変更しない限り、それは、Mainという名前の空のマクロです。MainをListing 3に示すように変更します。
LISTING 3:CopyNumToCol1を呼び出すために、Mainを変更します。
Sub Main
CopyNumToCol1
End Sub
次に、あなたは、IDEのツールバーで、Run Basicアイコンを繰り返しクリックすることで、CopyNumToCol1を実行することができます。これは、特に、一時的なマクロでは、極めて速く、簡単です。それは、数回使用されて、破棄されます。
ときどき、マクロ・レコーダーが機能しません
原文「Sometimes the macro recorder fails」
OpenOffice.orgの内部を理解することは、マクロ・レコーダーが頻繁に失敗する方法と理由を理解するのに役立ちます。主な犯人は、ディスパッチ・フレームワークとの関連づけとマクロ・レコーダーとの関係です。
ディスパッチ・フレームワーク
The dispatch framework
ディスパッチ・フレームワークの目的は、通常、メニュー項目に対応するコマンドのためのコンポーネント(ドキュメント)への統一されたアクセスを提供することです。私は、メニューから、File > Save、ショートカット・キーCtrl+S、あるいは、Saveツールバー・アイコンをクリックして、使用することができます。これら全てのコマンドは、現在のドキュメントに送信される、同じ"dispatch command"に変換されます。
また、ディスパッチ・フレームワークは、"commands"を、UI(ユーザーインターフェイス)に、送り返すために、使用することができます。例えば、文書を保存した後に、File Saveコマンドは無効になります。文書が変更されるとすぐに、 ファイルの保存コマンドは、有効にされます。
私たちが、コマンドのディスパッチを確かめる場合、それは、.uno:InsertObjectや.uno:GoToStartOfLineのようなテキストです。 コマンドは、文書のフレームに送られます。そして、フレームは、コマンドを処理することができるオブジェクトが見つかるまで、コマンドを渡します。
マクロ・レコーダーは、どのように、ディスパッチ・フレームワークを使用するのか
How_the_macro_recorder_uses_the_dispatch_framework
マクロ・レコーダーは、作成されたディスパッチを記録します。レコーダーは、実装が、比較的単純です。そして、発行された同じコマンドは、後で使用するため、記録されます。問題は、すべてのディスパッチされたコマンドが、完全であるわけではないということです。例えば、オブジェクトを挿入すると、次のコードを作成します。:
dispatcher.executeDispatch(document, ".uno:InsertObject", "", 0, Array())
それは、どんな種類のオブジェクトを作成するか、挿入するか、指定できません。オブジェクトが、ファイルから挿入される場合、 あなたは、どのファイルを挿入するべきか、指定することができません。私は、マクロを記録しました。そして、設定項目を開いて、修正するために、Tools > Optionsを使用します。作成されたマクロは、設定変更を全く記録しません。;実際に、生成されたコードは、コメントされ、実行されません。
rem dispatcher.executeDispatch(document, ".uno:OptionsTreeDialog", "", 0, Array())
ダイアログが、開かれる場合、ダイアログを開くコマンドが、作成される可能性があります。ダイアログ内で行われる作業は、記録されない可能性があります。たとえば、マクロ編成ダイアログ、特別な文字の挿入、そして、類似した種類のダイアログが含まれています。マクロ・レコーダーを使用して、他の可能な問題は、式を挿入する、ユーザ・データの設定、Calcのフィルタの設定、データベース・フォ-ム内の動作、そして、暗号化されたPDFファイルに文書をエクスポートすることのような事が含まれています。しかしながら、あなたが、それをためさない限り、あなたは、何が動作するか、決して、はっきりと知ることができません。例えば、検索ダイアログからの動作は、適切に取り込まれます。
他のオプション
Other options
マクロレコーダが、特定の問題を解決できない場合、通常の解決策は、OpenOffice.orgオブジェクトを使用してコードを記述することです。残念ながら、OOoオブジェクトの学習曲線は、急勾配です。通常、簡単な例から始めておくのが最善です。そして、その次に、あなたが、より多くを学ぶと、ゆっくり枝分かれします。生成されたマクロを読むことで学ぶことは、始めるのに適しています。
あなたが、Calcマクロを記録する場合、そして、レコーダーは、マクロを正しく作成することができます。Paolo Mantovaniによって、作成された、それらが記録されるとき、Calcマクロを変換するアドインがあります。最終的なコードは、ディスパッチを生成するのではなく、OpenOffice.orgオブジェクトを操作します。これは、オブジェクト・モデルを学ぶために、極めて役に立ちます。
あなたは、PaoloのWebサイトから直接、またはOOo MacrosのWebサイトからマクロレコーダーをダウンロードできます。 あなたは、最新版が含まれているか確かめるために、両方の場所(どちらもリンク切れのようです)を確認する必要があります。
http://www.paolo-mantovani.org/downloads/DispatchToApiRecorder/
http://www.ooomacros.org/user.php