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

LibreOffice 6.0 Basicのサンプルコード「Changing Appearance」

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

説明

特定の単語に使われるスタイルを変更するために、あなたは、次の例から始めることができます。このコードは、正確に1つの小文字によって、それに続くテキスト部分を表す正規表現[a-z]を検索します。これらの4つの文字のすべての出現は、太字に変更されます。プログラムの次の部分でも同じことが起こります。今回は、すべての[a-z]の外観をイタリックに変更しました。この例が、機能するためには、あなたは、開いたテキスト文書から、それを実行する必要があります。

サンプルマクロが含まれているドキュメントの所在

Libre Officeは、初期設定のままでは、マクロが実行できません。そこで、マクロを使い始める前に、セキュリティ設定を変更し、マクロが実行できる設定にしておく必要があります。

サンプルマクロが含まれているドキュメントを開く

Changing Appearanceマクロを実行する

ドキュメントを開くと、英語の文章が記入されており、その下に「Start regular expressons」というボタンが配置されています。

「changing_appearance.odt」を開いた状態

「Start regular expressons」というボタンを押すとマクロが実行され、一部の文字が太く、あるいは、イタリックで表示されます。 マクロが実行されない場合は、セキュリティ設定を確認して下さい。

サンプルマクロが含まれているドキュメントを開く

「Start regular expressons」ボタンを押した状態

「元に戻す」が有効になっている

このマクロでは、「元に戻す」が有効になっているので、マクロで行われた文字属性の変更を元に戻すことができます。

正規表現を使用し、特定の文字パターンを検索し、検索された文字パターンに一致する部分の文字属性を変更しています。

コード・サンプルには、説明が全く記載されていませんでした。

コードを理解しやすくするために、コメントを追加しています。コメントは、私が追加したものなので、間違っていた場合のご指摘は、このサイトの連絡先にお願いします。

Sub Main
' 文書全体で、正規表現パターンに一致する文字の色を変更する

' 使用する変数を宣言する
  Dim oDocument As Object
  Dim oSearch As Object, oResult As Object
  Dim oFound As Object, oFoundCursor As Object
  Dim n As Long

  '処理の対象とするドキュメントを指定する
  oDocument = ThisComponent
  
  '  oSearchをoDocument.createSearchDescriptorオブジェクトとして定義する
  oSearch = oDocument.createSearchDescriptor
  
  ' 正規表現パターンを指定する
  oSearch.SearchString = "the[a-z]"
  
  ' 正規表現による検索を有効にする
  oSearch.SearchRegularExpression = TRUE

 ' *** 一度にまとめて検索する例 ***
  
  ' findAllで、一度に検索する。検索結果を格納する変数を指定する 結果は、配列として格納されるようです。
  oResult = oDocument.findAll(oSearch)

  ' 検索結果の文字列をボールドに指定する
  For n = 0 To oResult.count - 1
     ' 要素のインディックスを取得する
     oFound = oResult.getByIndex(n)
     ' 要素のカーソル位置を取得する
     oFoundCursor = oFound.Text.createTextCursorByRange(oFound)
     ' カーソル位置の文字をボールド体にする
     oFoundCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD
  Next n


' *** 1つ1つ検索する例 ***

  ' 正規表現パターンを指定する
  oSearch.SearchString = "all[a-z]"
  
  ' findFirstで、最初に見つかる検索結果を取得する
  oFound = oDocument.findFirst(oSearch)
  
  While NOT IsNull(oFound)	' 検索対象が見つからなくなるまで実行する
      ' 要素のカーソル位置を取得する 
     oFoundCursor = oFound.Text.createTextCursorByRange(oFound)
      ' カーソル位置の文字をイタリック体にする
     oFoundCursor.CharPosture = com.sun.star.awt.FontSlant.ITALIC
     ' findNextで、次に見つかる検索結果を取得する
     oFound = oDocument.findNext(oFound, oSearch)
  Wend

End Sub

解説:検索で特定した文字列のスタイルを変更する

検索を行うための下準備

まず、使用する変数を宣言します。

' 使用する変数を宣言する
  Dim oDocument As Object
  Dim oSearch As Object, oResult As Object
  Dim oFound As Object, oFoundCursor As Object
  Dim n As Long

処理の対象とするドキュメントを指定します。ThisComponentが、マクロを実行した時、アクティブ状態のドキュメントを表します。

  '処理の対象とするドキュメントを指定する
  oDocument = ThisComponent

検索するために、oSearch変数を、oDocument.createSearchDescriptorオブジェクトとして定義します。定義後、定義後、このオブジェクト変数は、検索条件を表します。

  '  oSearchをoDocument.createSearchDescriptorオブジェクトとして定義する
  oSearch = oDocument.createSearchDescriptor
検索と置換で使用するオブジェクト
操作 オブジェクト
検索 oDocument.createSearchDescriptorオブジェクト
置換 oDocument.createReplaceDescriptorオブジェクト

oSearch変数に正規表現パターンを指定します。正規表現パターン自体は、それを使用する環境やアプリケーションで、微妙に異なります。そのため、意図した動作と異なる場合は、LibreOfficeでの正規表現のメタキャラクタの意味を確認して下さい。

  ' 正規表現パターンを指定する
  oSearch.SearchString = "the[a-z]"

正規表現で、検索を行うには、 SearchRegularExpression属性にTRUEを指定する必要があります。

  ' 正規表現による検索を有効にする
  oSearch.SearchRegularExpression = TRUE

ここまでが、検索や置換を行うための準備になります。

検索を行う

LiabreOffice Basicでも、他のさまざまな開発言語と同様に、一括で検索する方法と、1つ1つ検索する方法が用意されています。

一度にまとめて検索する

処理する文章が小規模な場合は、一度に検索する方法を選択すれば良いかと思います。

検索結果を格納するオブジェクト変数に、検索の対象とするドキュメントのfindAllメソッドを指定します。引数は、検索条件を指定したoDocument.createSearchDescriptorオブジェクトを指定します。検索結果を格納するオブジェクト変数に、結果(の参照)が格納されます。

  ' findAllで、一度に検索する。検索結果を格納する変数を指定する 結果は、配列として格納されるようです。
  oResult = oDocument.findAll(oSearch)

検索結果を格納するオブジェクト変数から、結果を取り出します。結果は、結果は、オブジェクトに、配列、あるいは、リスト構造で格納されていると思われます。そのため、インディックス(イテレーター)を使って、1つ1つ結果を取り出します。サンプルコードでは、検索された要素(の選択範囲)のカーソル位置を取得した後、文字スタイルをボールド体に変更しています。この操作を検索結果が無くなるまで繰り返しています。

  ' 検索結果の文字列をボールドに指定する
  For n = 0 To oResult.count - 1
     ' 要素のインディックスを取得する
     oFound = oResult.getByIndex(n)
     ' 要素のカーソル位置を取得する
     oFoundCursor = oFound.Text.createTextCursorByRange(oFound)
     ' カーソル位置の文字をボールド体にする
     oFoundCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD
  Next n

1つ1つ検索する

検索対象の文書の量が多い時、検索結果を使って行う処理が複雑な場合は、1つ1つ処理したほうが良いと思います。1つ1つ処理することで、処理時間が長く耐えられなくなったときのために処理を中断するコードを入れることができること、作業領域の不足で異常終了する可能性を減らすことができます。

検索を行い最初に見つかった結果を取り出します。

  ' findFirstで、最初に見つかる検索結果を取得する
  oFound = oDocument.findFirst(oSearch)

これ以降の操作は、検索結果が見つかるまで繰り返します。

  While NOT IsNull(oFound)	' 検索対象が見つからなくなるまで実行する
' 繰り返す処理
 Wend

この後、検索結果に対する処理を行います。サンプルコードでは、検索された要素(の選択範囲)のカーソル位置を取得した後、文字スタイルをイタリック体に変更しています。

      ' 要素のカーソル位置を取得する 
     oFoundCursor = oFound.Text.createTextCursorByRange(oFound)
      ' カーソル位置の文字をイタリック体にする
     oFoundCursor.CharPosture = com.sun.star.awt.FontSlant.ITALIC

検索された要素の処理が終ったあと、次の要素を取得します。

     ' findNextで、次に見つかる検索結果を取得する
     oFound = oDocument.findNext(oFound, oSearch)

正規表現を使用し、特定の文字パターンを検索し、検索された文字パターンに一致する部分の文字属性を変更しています。

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