投稿

ラベル(LibreOffice Basic)が付いた投稿を表示しています

ブログの説明

学校に通わないで学んだことを記しています。間違っているところが何かありましたらご指摘下さると幸いです。コメントに対する返信が遅れる可能性があります。その場合は申し訳ございません。

このブログでは広告を表示しています。このブログ内の投稿記事を検索するには右上の拡大鏡のアイコンを、アーカイブやラベル付けから投稿記事を閲覧するには左上の三重線のアイコンをクリックして下さい。

数式の表示にはMathJaxを利用させていただいています。数式の表示のためにJavaScriptが有効である必要があります。そうでない場合、訳の分からないLaTeXのコードが表示されます。幾何学図形やチャートの表示にはHTML5 CanvasやGoogle Chartを使用しています。その表示のためにもJavaScriptが有効である必要があります。

LibreOffice Basic ユーザーが定義するデータ型(構造体)

ユーザー定義のデータ型(構造体) この投稿ではLibreOfficeかApache OpenOfficeのマクロ言語であるBasicにおいてユーザー定義のデータ型を宣言する2種類の方法について記す。 ユーザー定義のデータ型はカスタム・データ型と呼ばれていることもある。それは型の違いに関わらず1つ以上の変数をまとめて1つのデータ型とし、そのデータ型に名前を付けたもの。その要素となる変数はメンバーと呼ばれている。 ユーザー定義のデータ型はC言語で言うところの構造体、Pascalで言うところのレコードによく似ている。Pythonの辞書にも似ているが、辞書はハッシュ・テーブルの一種であると解釈されるものかもしれない。 構造体やレコードとクラスとの違いは、構造体やレコードがデータ・プロパティだけを持ち、コード・プロパティを持たないこと。データ・プロパティとは単にプロパティと呼ばれていたりメンバー変数と呼ばれていたりするもの。コード・プロパティとはメソッドと呼ばれていたりメンバー函数と呼ばれていたりするもの。 LibreOffice BasicまたはApache OpenOffice Basicでは、ユーザー定義のデー型(構造体)を次のような2種類の方法で定義することができる。 Type宣言を用いる方法。 UNO(Universal Network Objects)を利用する方法。 Type宣言を用いて構造体を定義 モジュール内のサブルーチンの外にType宣言を記述することによって構造体を定義することができる。 Type宣言はサブルーチンの外側に置く必要があり、Typeというキーワードによって始まり、End Typeというキーワードによって終わる。 次の例では出版物の属性をひとまとまりにしたBooksという構造体を定義している。 REM ***** 構造体を定義 ***** 'VBA拡張 Option Compatible 'Typeを用いた構造体宣言 Type Books BookTitle As String Subtitle As String Author As String Translator As String Publisher As String PublicationDate As D...

LibreOffice Calcのダイアログ(ユーザーフォーム)のタブオーダー設定法

イメージ
LibreOffice Calc 6.1では、スプレッドシート上とダイアログ上にコントロールまたはフォームコントロールを配置することができる。ダイアログというのはエクセルでいうところのユーザーフォームのこと。 操作中のコントロールはアクティブになる。コントロールがアクティブな状態にあることは、キーボードからの入力などの操作をそのコントロールが受け付ける状態になっていることを意味している。 キーボードのTabキーを用いてアクティブな状態にあるコントロールを遷移させることができる。遷移させていくときの順番はタブの順序またはタブオーダーと呼ばれている。 コントロールには「タブの順序」と名付けられた属性を持っているものがあり、この値である数値によってアクティブな状態のコントロールが遷移していく順番を決定することができる。 LibreOffice 6.1 Calcには、スプレッドシート上に配置するフォーム・コントロールのタブオーダーを一括で管理することができるダイアログ・ボックスが用意されている。各コントロールの属性一覧を表示するダイアログ・ボックスを開けば「タブの順序」という項目があり、その右端のボタンを押せばタブの順序を一括管理するダイアログ・ボックスが開く。 しかし、ダイアログ上に配置するコントロールに関してはこの機能がどうやらないようだ。そのため、タブの順序を設定するのに手間取ることがある。ダイアログ上に配置したコントロールの数が多くなるとやっかい。 ここではこの問題に対するちょっとした対処方法を書き留めておく。 シート上のコントロールとダイアログ上のコントロール LibreOffice 6.1 Calcでは、スプレッドシート上のコントロールとダイアログ上のコントロールとでは、タブの順序を決める属性値の挙動が異なる。 スプレッドシート上のコントロールにおけるタブの順序を示す属性値では、コントロール間の同一値が受け入れられる。数値は0から始まるが、同じ番号が重複していても問題は起こらない。 例えば5つのコントロールがスプレッドシート上に配置されている場合、各々の属性値を0, 0, 1, 1, 2と設定することが可能。0, 0, 1, 1, 2という順番でアクティブなコントロールが遷移する。 しかし、ダイアログ上のコントロールの場合、コントロー...

LibreOffice Calcでダイアログ上のテキストフィールドからセルへの転記

イメージ
先回 は、LibreOffice Calcのスプレッドシート上に置いたプッシュ・ボタンを押すとダイアログ(フォーム)が開き、そのダイアログ上のコマンド・ボタンを押すとそのダイアログが閉じるマクロをLibreOffice Basicによって作った。 今回は、このダイアログを用いてスプレッドシート上のセルに文字列を入力・転記するコードを書くのが目的。その手順を以下に書き留める。 ここで前提とするLibreOfficeのバージョン LibreOffice 6.1 Calc マクロ作成に使用する言語 LibreOffice Basic (Apache OpenOffice Basic) スプレッドシート・ドキュメントの前提条件 Sheet1という名のシートを1つだけ用意 実装したい機能 今回実現したい機能はおおよそ次のとおり。 LibreOffice Calcのスプレッドシート上に設けたプッシュ・ボタンを押すとダイアログが表示される。 そのダイアログが表示される際、スプレッドシート上のA5というセルに入力されている文字列が、ダイアログ上にあるテキスト・フィールドにも反映される。 ダイアログのテキスト・フィールドに全角または半角の文字列を入力して特定のコマンド・ボタンを押すと、その文字列が10文字以内(11文字未満)であるかどうかを検証し、10文字以内であればその文字列をスプレッドシート上のA5というセルに転記する。 テキスト・フィールドに入力された文字列が11文字以上である場合はその旨を表示して処理を中止する。 ダイアログ上の特定のコマンド・ボタンを押すと、テキスト・フィールドに入力された文字列が削除される。 ダイアログ上の特定のコマンド・ボタンを押すとそのダイアログが非表示になる。 ダイアログとはダイアログ・ボックスのこと。Microsoft Excelではユーザーフォームと呼ばれているものに当たる。 ダイアログ上へ各種コントロールを追加 まずは、前回作成したダイアログ上に各種コントロールを追加する。例えば次のように配置する。 いちばん上にあるのがラベルフィールドと呼ばれるコントロール。上から2番目にあるのがテキスト・フィールドと呼ばれるコントロール。その下にコマンド・ボタンと呼ばれる3つのコントロールが配置されてい...

LibreOffice 6 Calcでフォーム(ダイアログ)を作成してマクロで表示

イメージ
ここで用いたLibreOfficeのバージョンと設定 LibreOffice 6.1 LibreOfficeの「ツール」-「オプション」-「LibreOffice」の「詳細」で「Java実行環境を使用」にチェックが入っていること。「インストール済みのJava実行環境(JRE)」が表示されていること。 LibreOffice 6.1 Calcにはデータを入力したり表示したりするのに使うことができるフォームが用意されている。そしてそのフォームはダイアログと呼ばれている。今回はそのダイアログを作成し、それを表示させたり閉じたりするマクロをLibreOffice Basicを使って実装してみる。 フォームコントロールの作成 LibreOffice Calcを起動。 トップメニューで「表示」-「ツールバー」-「フォームコントロール」という順に選び、フォームコントロールのツールバーを表示させる。 フォームコントロールのツールバーの中から「ボタン」(プッシュ・ボタン)を選び、スプレッドシートの適当な場所にプッシュ・ボタンを作成して配置する。 作成されたプッシュ・ボタンの上でマウスの右クリックメニューを表示させ、その中から「コントロール」を選ぶ。 「属性 プッシュボタン」というダイアログが表示されるので、「全般」タブ内にある「タイトル」の項目を「ダイアログ表示」に変える。 トップメニューで「ファイル」-「保存」を選んで変更内容を保存する。 スプレッドシート上でのプッシュ・ボタンの作成とその属性の設定はこれで終わり。 ダイアログを作成 「閉じる」というコマンド・ボタンだけを持つ単純なダイアログを作成する。 LibreOffice Calcのトップメニューで「ツール」-「マクロ」-「ダイアログの管理」を選ぶ。 そうすると「LibreOffice Basicマクロの管理」というダイアログが開く。「ダイアログ」というタブを選び、ダイアログに表示されている.odsファイル(今開いているスプレッドシート名)を選ぶ。 「新規作成」ボタンを押して「Dialog1」を作成し、「編集」ボタンを押す。 そうすると統合開発環境(IDE)が起動し、ダイアログの雛形が表示されるはず。 ツールバーの中から「ボタン」(コマンド・ボタン)を選び、ダイアログの雛...

LibreOffice BasicでCalcのセルに値を入力するには?

イメージ
LibreOffice バージョン6.1 Calc LibreOffice Basicを用いてCalcのセルにデータを入力するためには、まず次のようなオブジェクト型の変数を宣言しておく。 Dim Doc As Object Dim Sheet As Object Dim Cell As Object DocはCalcのドキュメントを参照するための変数。Sheetはそのドキュメントの中のシートを参照するための変数。Cellはセルを参照するための変数。オブジェクト型の変数なのでo-という接頭辞を付け、oDoc、oSheet、oCellと名づける流儀もある。 現在のアクティブなドキュメントを得てオブジェクト型変数に代入。 Doc = StarDesktop.CurrentComponent このようにStarDesktop.CurrentComponentを利用してもいいが、これだとLibreOffice Basicの統合開発環境(IDE)上で実行したときにランタイムエラーが生じてしまう。この問題を避けるためにはStarDesktop.CurrentComponentの代わりにThisComponentを使う。 Doc = ThisComponent Sheetsオブジェクトの中から特定のシートを得るためにSheetsの番号を指定し、それをオブジェクト型変数に代入。Sheetsの番号は0から始まる。 Sheet = Doc.getSheets.getByIndex(0) 番号ではなくシートに付けられた固有の名前を指定する方法もある。それにはgetByName()メソッドを次のように用いる。 Sheet = Doc.Sheets.getByName("Sheet1") 特定のシートの特定のセルを得るためには、そのセルを座標系で指定する方法、または、列名と行番号との組み合わせから成るセル名で指定する方法がある。座標系によって指定する場合はgetCellByPosition()メソッドを用いる。そしてそれをオブジェクト型変数に代入。 Cell = Sheet.getCellByPosition(0, 0) セル名で特定のセルを指定する場合にはgetCellRangeByName()メソッドを次のように用いる。 Cell = ...

LibreOffice Basic 制御構文 繰り返し

For Next構文 繰り返し処理の代表はFor Next構文。指定した回数だけ処理を繰り返すときにそれを用いる。その書式は For カウンター変数名=開始値 To 最終値 Step 増分値 処理内容 Next のようになる。Step 増分値を省略すると増分値は1になる。Nextの次に Next カウンター変数名 のようにカウンター変数を置いてもよいが、それは省略可能。 Option Explicitステートメントをモジュールの冒頭に指定している場合は、繰り返し回数を数えるためのカウンターとして使う変数を Dim カウンター変数名 As Integer のように予め宣言しておく必要がある。 次のコードは、掛け算のことを同じ数を繰り返し足す累加法であると考え、For Next構文を用いることによって足し算だけで掛け算の計算をするもの。ただし整数倍なので、かけられる数は小数を許容するが、かける数は小数点以下を切り捨てる。 REM ***** 整数倍を累加法で計算 ***** '変数を明示的に宣言して使う Option Explicit Sub Main '変数を宣言 Dim x As Double Dim y As Double Dim answer As Double '値の入力を促す x = InputBox("数を入力してください") 'Int()の引数にして小数点以下は切り捨て y = Int(InputBox("何整数倍にしますか(小数点以下切り捨て)")) '足し算を整数倍だけ繰り返す Dim i As Double For i=1 To y answer = answer + x Next '計算結果を出力 MsgBox x & "の" & y & "倍は" & answer & "です" End Sub For i=1 To y answer = answer + x Next は、 answer = answer + x をy回繰り返すことに等しい。 Int函数は引数として丸括弧の...

LibreOffice Basic 制御構文 条件分岐

If構文 条件分岐は、なんらかの条件によって処理を分岐する制御構文。その代表的なものがIf構文。その書式は If 条件式 Then 処理内容 ElseIf 条件式 Then 処理内容 Else 処理内容 End If のようになる。ただし、ElseIf文とElse文は必要なければ用いなくてよい付属文。 次のコードは、身長と体重の入力を促し、その値が0以下であるかどうかを検証し、0以下であればその値が無効であるとメッセージボックスに出力し、0以下でなければボディマス指数(BMI)を計算する函数を呼び出してその計算結果をメッセージボックスに出力するもの。 REM **** BMIを計算 **** '変数を明示的に宣言して使う Option Explicit Sub Main '局所変数をSingle型で宣言 Dim height As Single Dim weight As Single Dim bmiValue As Single '身長と体重の値の入力を促す height = InputBox("あなたの身長(cm)を入力してください") weight = InputBox("あなたの体重(kg)を入力してください") 'If構文を用いて入力された値を検証 If height <= 0 Then MsgBox "身長が無効な値です" ElseIf weight <= 0 Then MsgBox "体重が無効な値です" Else 'BMIを計算する函数を呼び出して返り値を代入 bmiValue = funBmi(height,weight) '計算結果をメッセージボックスに出力 MsgBox "あなたのボディマス指数は" & bmiValue & "です" End If End Sub 'BMIを計算する函数 Private Function funBmi(height As Single, weight As Single) '身長と体重からBMIを...

LibreOffice Basic サブルーチン 函数 引数

サブルーチンと函数 サブルーチンと函数は、一つのまとまった処理を行う一連のステートメントに名前を付けて部品化する仕組み。サブルーチンのことをプロシージャと呼んだり、サブルーチンと函数を両方まとめてプロシージャと呼ぶことがある。函数が呼び出し元に返す値を持つのに対してサブルーチンは呼び出し元に返す値を持たないという違いがある。 サブルーチンは Sub サブルーチン名 によって始まり、 End Sub によって終わる。その間に一連の処理を行うステートメントを置く。サブルーチン名はそのサブルーチンを呼び出すために用いられる。 REM **** BASIC **** '変数を明示的に宣言して使う Option Explicit Sub Main 'サブルーチンHelloWorldを呼び出す HelloWorld End Sub 'Hello, World!を出力するサブルーチン Sub HelloWorld MsgBox "Hellow, World!" End Sub 一方、函数は Function 函数名 によって始まり、 End Function によって終わる。その間に一連の処理を行うステートメントを置く。函数名と同じ名前の変数に値を代入すれば、その値が返り値となって呼び出し元に返される。函数名はその函数を呼び出すときに使われる。 REM **** BASIC **** '変数を明示的に宣言して使う Option Explicit Sub Main 'Kyooという関数を呼び出して返り値を出力 MsgBox(Kyoo) End Sub '今日の日付を返す函数 Function Kyoo Kyoo = date() End Function モジュールの冒頭にOption Explicitを宣言していても、値を返すための変数、つまり函数と同じ名前の変数は、宣言する必要なく使うことができるようだ。函数の中に函数名と同じ名前の変数が複数ある場合には、もっとも終わりの行にあるものが返り値となる。 サブルーチン名と函数名には変数名と同じ命名規則が適用される。つまり、英字で始まり、それ以降は英字か数字かアンダースコアを使うことができ、スペースを含む場合には角括弧で名前全体をはさむ...

LibreOffice Basic 変数 データ型 スコープ 定数 演算子 配列 構造体

LibreOffice Basicの文法はマクロソフトのVBAに似ている。ExcelでVBAを使っている人にとっては覚えやすい。ただしVBAのほうがより厳格なので、VBAの構文がLibreOffice BasicでエラーになるよりもLibreOffice Basicの構文がVBAでエラーになることのほうが多いらしい。 コメントの付け方 アポストロフィ(')かREMで始まってその行末までがコメント。REMは大文字と小文字を区別しないのでremでもREMでもRemでもみな同じ。 '改行までがコメント REM 改行までがコメント rem 改行までがコメント ステートメント 一つの命令や一つの宣言を表すLibreOffice Basicの基本単位がステートメント。文章でいえば一つの文。LibreOffice Basicでは改行によって一つ一つのステートメントが区切られる。改行をまたいで一つのステートメントを記述したい場合にはアンダースコア(_)を使う。また、一つの行に複数のステートメントを記述したい場合にはコロン(:)を使う。 REM **** BASIC **** Sub Main MsgBox("Hello World") '2行に渡って1つのステートメントを記述 MsgBox("Hello") & _ " LibreOffice" '1行に複数のステートメントを記述 MsgBox("Hello Basic") : MsgBox("Good Night") End Sub 文字列定数 Option Compatibleとモジュールの冒頭に宣言しておくと、マイクロソフトのVBやVBAと同じように、次のような文字列定数を使用することができる。Option CompatibleはLibreOffice BasicにVBAと同様の機能を付け加えるためのもの。 vbLf ラインフィード(改行)。C言語でいうところの\n vbCr キャリッジリターン(行頭)。C言語でいうところの\r vbCrLf キャリッジリターンとラインフィード vbTab 水平タブ。C言語では\t vbVerticalTab ...