ブログの説明

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

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

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

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 = Sheet.getCellRangeByName("A1")

セルに値を入力するにはセルのプロパティに値を代入すればいいが、その値の種類によってプロパティ名が異なる。その値が数値ならばValueプロパティ、文字列ならばStringプロパティ、数式ならばFormulaプロパティを用いる。

Cell.Value = 567
Cell.String = "東京都"
Cell.Formula = "= A1 + A2"

文字列や数式はダブルクォーテーションで囲む必要がある。

具体例

次のコードでは、LibreOffice Basicを用いて特定のセルに各種の値を入力している。

REM  *****  BASIC  *****
'セルの取得と各種値を入力するコード

'全ての変数を明示的に宣言
Option Explicit

Sub Main

   'オブジェクト型の変数を宣言
   Dim Doc As Object
   Dim Sheet As Object
   Dim Cell As Object

   '直近のアクティブなドキュメントを取得
   Doc = ThisComponent
   'シートをシート名で取得
   Sheet = Doc.Sheets.getByName("Sheet1")

   'セルの位置を座標番号で取得
   Cell = Sheet.getCellByPosition(0, 0)
   '数値をセルに入力
   Cell.Value = "298"

   Cell = Sheet.getCellByPosition(0, 1)
   '文字をセルに入力
   Cell.String = "鈴木"

   'セルの位置をセル名で取得
   Cell = Sheet.getCellRangeByName("A3")
   '数式をセルに入力
   Cell.Formula = "=1 + 1"

   Cell = Sheet.getCellRangeByName("A4")
   '日付を文字列としてセルに入力
   Cell.String = Format("2020/09/03", "yyyy年m月d日")

   Cell = Sheet.getCellRangeByName("A5")
   '現在の日付と時刻を文字列としてセルに入力
   Cell.String = Now()

End Sub

Explicitというオプションを指定すると、全ての変数を必ず宣言してからでないと使うことが許されない規則が適用される。

Format()函数は第1引数を文字列と見なして第2引数の書式に従って整形してくれる。ここでは何年何月何日の書式に直している。

Now()またはNowは函数であり、現在の年月日と時分秒を日付型として出力する。しかし、Cell.Dateプロパティは存在しないようなので、ここでは文字列型としてセルに入力している。

このコードの実行結果は次のようになるはず。

セルの値を参照

セルの値を参照するのにも入力の時の同じように、Cell.ValueまたはCell.StringまたはCell.Formulaを使う。

Dim int1 As Integer
Dim str1 As String
Dim str2 As String

Cell = Sheet.getCellRangeByName("A1")
int1 = Cell.Value
Cell = Sheet.getCellByPosition(0, 1)
Str1 = Cell.String
Cell = Sheet.getCellByPosition(0, 2)
Str2 = Cell.Formula

次のコードは、セルに入力されている値を参照してその値をメッセージボックスに出力するもの。ただし、このコードの実行は先ほどの「' セルの取得と各種値を入力するコード」の実行結果を前提にしている。

REM  *****  BASIC  *****
'セルの値を参照するコード

'文字列定数を有効にする宣言
Option Compatible
'全ての変数を明示的に宣言
Option Explicit

Sub Main

   '各種変数を宣言
   Dim Doc As Object
   Dim Sheet As Object
   Dim Cell As Object
   Dim int1  As Integer
   Dim str1 As String
   Dim str2 As String
   Dim str3 As String
   Dim date1 As Date

   '直近のアクティブなドキュメントを取得
   Doc = ThisComponent
   'シートをシート名で取得
   Sheet = Doc.Sheets.getByName("Sheet1")

   'セルの位置を座標番号で取得
   Cell = Sheet.getCellByPosition(0, 0)
   '数値を数値型として取得
   int1 = CInt(Cell.Value)

   Cell = Sheet.getCellByPosition(0, 1)
   '文字列を文字列型として取得
   str1 = CStr(Cell.String)

   'セルの位置をセル名で取得
   Cell = Sheet.getCellRangeByName("A3")
   '数式を文字列型として取得
   str2 = CStr(Cell.Formula)

   Cell = Sheet.getCellRangeByName("A4")
   '日付を文字列型として取得
   str3 = CStr(Cell.String)

   Cell = Sheet.getCellRangeByName("A5")
   '現在の日付と時刻を日付型として取得
   date1 = CStr(Cell.String)

   'メッセージボックスに表示。文字列定数で改行
   MsgBox int1 & vbNewLine & str1 & vbNewLine & _
   str2 & vbNewLine & str3 & vbNewLine & date1

End Sub

Compatibleをオプションとして指定すると文字列定数を用いることができるようになる。文字列定数は値をメッセージボックスに出力する際に用いているvbNewLineがそのひとつの例。vbNewLineは改行コードを意味する。

CInt()函数は任意の型を整数型に変換するもの。CStr()函数は任意の型を文字列型に変換するもの。セルから取り込んだ値を代入する変数の型になるように念のために変換している。

LibreOffice Basicでは変数の型に暗黙の型変換をしてくれる場合が多く、変数の型にそれほど神経質になる必要はないのかもしれないが、不本意な挙動を防ぐための普段からの心がけとして型変換函数を用いてみた。

メッセージボックスはMsgBox文またはMsgBox()函数を用いて表示することができる。

このコードの実行結果は次のようになるはず。

次のコードは、配列とFor Next文を用いて1から10までの整数値を順番にセルに入力するもの。

REM  *****  BASIC  *****
'配列の要素をセルに順番に入力するコード

'全ての変数を明示的に宣言
Option Explicit

Sub Main

   '各種変数を宣言
   Dim Doc As Object
   Dim Sheet As Object
   Dim Cell As Object
   '0から9までの整数型配列
   Dim Arr(0 to 9) As Integer

   '現在のドキュメントを取得
   Doc = ThisComponent

   'シートの0番目を取得
   Sheet = Doc.Sheets(0)

   '配列に1から10までの値を代入する繰返し文
   Dim i As Integer
   For i=0 to 9
      Arr(i) = i + 1
   Next

   '座標(1,0)から下方へ順番に配列の値を入力する繰返し文
   Dim j As Integer
   For j=0 to 9
     Cell = Sheet.getCellByPosition(1, j)
     Cell.Value = Arr(j)
   Next

End Sub

Arrが配列名。

For Next文内で配列に1から10までの値を代入する際に1を足しているのは、For Next文のカウンター用の変数iを配列の要素番号ばかりでなく値の代入にも使いまわしているから。+ 1を削除した実行結果をみればその意味が分かるはず。

実行結果は次のようになる。

次のコードは、セルの値を1から10まで配列に代入してメッセージボックスに表示するもの。

REM  *****  BASIC  *****
'セルの値を配列で参照してメッセージボックスに表示するコード

'文字列定数を有効にする宣言
Option Compatible
'全ての変数を明示的に宣言
Option Explicit

Sub Main

   '各種変数を宣言
   Dim Doc As Object
   Dim Sheet As Object
   Dim Cell As Object
   Dim Arr(0 to 9)  As Integer

   '直近のアクティブなドキュメントを取得
   Doc = ThisComponent
   'シートをリスト番号で取得
   Sheet = Doc.Sheets(0)

   'セル座標(1,0)から順番に値を配列に代入する繰返し文
   Dim i As Integer
   For i=0 to 9
     Cell = Sheet.getCellByPosition(1, i)
     Arr(i) = Cell.Value
   Next

   'メッセージボックスに配列を表示
   MsgBox Arr(0) & vbNewLine & Arr(1) & vbNewLine & Arr(3) _
   & vbNewLine & Arr(4) & vbNewLine & Arr(5) & vbNewLine _
   & Arr(6) & vbNewLine & Arr(7) & vbNewLine & Arr(8) _
   & vbNewLine & Arr(9)

End Sub

このコードの実行結果は次のようになるはず。

以上のコードはいずれも例外処理を一切していないことを考慮されたし。

関連記事

コメント

このブログの人気の投稿

LATEXで数式:指数と順列などで使う添数・添字

10の補数と9の補数と2の補数と1の補数

Visual Studio 2019にはC++のためのフォームデザイナーがない件