Home > コンピュータ > LibreOffice > マクロ

マクロを作成する

新規作成日 2017-12-10
最終更新日

原文「Creating a macro」

記録されたマクロは、何度も繰り返しても、同じタスクを繰り返します。記録されたマクロを作成する前に、私は、通常、2つの疑問をもちます。:

  1. タスクは、変更をしないコマンドの単純な設定として、まとめることができますか?
  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の開始する行にあると想定します。

  1. 記録を開始するために、Tools > Macros > Record Macroを使用します。
  2. 始点を「指定する」ためのカーソルを移動するために、Ctrl+右矢印を押します。
  3. タブとスペースを削除するために、Backspaceを2回押します。
  4. Tabを押すと、定数名の後ろに空白がないタブが追加されます。
  5. Deleteを押して、小文字のsを削除し、Sを押して大文字のSを追加します。
  6. 数値の先頭へカーソルを移動するために、Ctrl+右矢印を2回押します。
  7. %記号の前にカーソルを選択し、移動するために、Ctrl+Shift+右矢印を押します。
  8. 選択したテキストをクリップボードにコピーするために、Ctrl+Cを押します。
  9. 行の終わりまでカーソルを移動するために、Endを押します。
  10. 2つの末尾のスペースを削除するために、2回Backspaceを押します。
  11. カーソルを行の先頭に移動するために、Homeを押します。
  12. 行の先頭に選択された数値をペーストするために、Ctrl+Vを押します。
  13. また、値を貼り付けると、余分なスペースも貼り付けられました。それで、余分なスペースを削除するために、Backspaceを押します。
  14. 数値と名前の間にタブを挿入するために、Tabを押します。
  15. 行の先頭に移動するために、Homeを押します。
  16. 次の行に移動するために、下矢印を押します。
  17. マクロの記録を停止し、マクロを保存します。

マクロを記録するよりも、ステップの読み書きに時間がかかります。あなたが、それらを行うように、ゆっくり作業して、手順について考えます。実践で、これは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

このエントリーをはてなブックマークに追加