ONLYOFFICE Desktop EditorsをownCloudサーバーに接続する方法
ONLYOFFICE Desktop EditorsをownCloudサーバーに接続する手順を解説。ログイン、クラウド上のファイル編集、接続の管理、設定時によくあるトラブルの確認方法を紹介します。
LibreOffice Calcのマクロは、大きなワークシートでは動作が遅くなることがよくあります。その理由は単純で、マクロが実際の計算よりもUNOオブジェクトの境界を越える処理に多くの時間を費やしてしまうためです。1つのセルを読み込み、変更し、書き戻すという処理を何千回も繰り返すと、同じデータをより大きなブロックで移動するよりもはるかにコストがかかるのです。
目標は、抽象的にすべてのマクロを「高速化」することではありません。有用な最適化とは、同じデータセットで同じ出力を生成し、処理時間を短縮し、ワークフローに必要な応答性を維持し、新たな正確性やメモリの問題を引き起こさないことです。以下の手法は、こうした測定可能な成果に焦点を当てています。
2026年10月現在、LibreOffice SDKの最新ドキュメントでは、ここで使用されているスプレッドシートインターフェースはLibreOffice 26.8 APIリファレンスに記載されています。コアとなるメソッドは、新しく導入されたパフォーマンス機能ではなく、長年にわたりUNOで使用されてきたインターフェースです。
再現可能なベースラインから始めましょう。LibreOffice Basic にはGetSystemTicks()、システムティックを測定してプロセスを最適化する方法として公式ヘルプで説明されている機能があります。ワークブックの起動時間、ユーザーへのプロンプト、または無関係なセットアップ時間を計測するのではなく、実際に改善したいマクロの部分をラップしてください。
Dim t0 As Long, elapsed As Long
t0 = GetSystemTicks()
' Run the work you want to measure here.
elapsed = GetSystemTicks() - t0
MsgBox "Elapsed ticks: " & elapsed
同じファイルのコピーに対して、同じ操作を複数回実行してください。最初の実行結果は、ファイルシステムのキャッシュ、数式の状態、その他の一時的な処理などにより異なる場合があります。比較結果が意味のあるものとなるよう、データセットのサイズ、処理された範囲、および自動計算が有効になっていたかどうかを記録してください。
良い結果とは、単に処理時間が短いことだけではありません。行数、合計値、数式、テキスト値、日付、および出力範囲が基準値と一致していることを確認してください。
公式リファレンス: LibreOffice ヘルプ: GetSystemTicks 関数。
マクロが広い範囲をループ処理し、などのメソッドを繰り返し呼び出す場合getCellByPosition()、通常はそのパターンが最初に確認すべき箇所です。UNO API は、セル範囲全体を配列として移動するためのメソッドXCellRangeData.getDataArray()とsetDataArray()メソッドを公開しています。
公式APIによると、このgetDataArray()関数は行のシーケンスを返し、各行には列が含まれます。値は文字列またはdouble型で返されます。setDataArray()この関数は配列を範囲に書き戻し、配列の次元はその範囲と一致する必要があります。
例えば、A列からE列にマクロが変換する入力データが含まれているとします。各セルを個別に読み込む代わりに、正確な範囲を一度選択します。
Dim doc As Object
Dim sheet As Object
Dim sourceRange As Object
Dim data As Variant
doc = ThisComponent
sheet = doc.Sheets.getByName("Data")
' Example only: A2:E50001.
sourceRange = sheet.getCellRangeByPosition(0, 1, 4, 50000)
data = sourceRange.getDataArray()
処理をdataBASICメモリ内で実行し、結果配列を対応する宛先範囲に1回の操作で書き込みます。これにより、数千回に及ぶ個別の読み書き操作と比較して、UNO呼び出しの回数を大幅に削減できます。
公式リファレンス: LibreOffice SDK: XCellRangeDataおよびLibreOffice SDK: XCellRange。
配列への一括アクセスは便利ですが、不必要に大きなシートを配列に変換すると、ボトルネックがメモリに移動するだけである可能性があります。タスクが定義済みのテーブルのみにアクセスする場合は、列全体やCalcグリッド全体をハードコーディングすることは避けてください。
ワークブックが既に把握している情報(インポート行数、データベースの結果サイズ、指定キー列、またはアプリケーションが作成する範囲など)を使用して、最後に意味のある行を特定します。その後、マクロに必要な行と列のみを要求します。
これは、ワークシートに実際のデータよりもはるかに低いレベルの書式設定が含まれている場合や、古いコンテンツによって見かけ上の使用領域が拡大している場合に特に重要です。大きなインメモリ配列はRAMを消費するため、1つの過剰サイズの割り当ては、中程度のサイズのブロックを処理するよりも効率が悪くなる可能性があります。
単一の配列でメモリ使用量が急激に増加したり、処理開始前に長時間待機したり、マシンの実用限界に近づいたりする場合は、データをブロック単位で処理してください。例えば、数千行を処理し、結果を書き込み、次のブロックの処理に進みます。理想的なブロックサイズは一概には言えません。実際のワークブックとハードウェアでテストしてください。
CalcドキュメントはLibreOfficeのXModelインターフェースを実装しています。このlockControllers()メソッドは、表示更新に使用される一部のコントローラ通知を一時停止し、必要に応じてunlockControllers()再開します。これにより、マクロが多数の変更を実行する際に、不要な視覚的な作業を減らすことができます。
Dim doc As Object
doc = ThisComponent
doc.lockControllers()
' Perform bulk changes here.
doc.unlockControllers()
公式APIでは、コントローラーのロックとロック解除は必ずペアで実行する必要があると明記されています。つまり、本番環境のマクロには、unlockControllers()処理が失敗した場合でも確実に実行されるエラー処理を含める必要があります。ドキュメントをロックしたままにしておくことはパフォーマンスの最適化ではなく、クリーンアップ処理の不備につながります。
公式リファレンス: LibreOffice SDK: XModel。
マクロが多数の数式に渡すセルを繰り返し変更する場合、マクロが中間値を更新している間、Calc は再計算にかなりの時間を費やす可能性があります。スプレッドシート ドキュメントは、、、、、などのXCalculatableインターフェイスを公開します。isAutomaticCalculationEnabled()enableAutomaticCalculation()calculate()calculateAll()
より安全な方法は、ユーザーの現在の計算モードを記憶し、更新時のみ自動計算を無効にし、更新後に元の状態に戻すことです。
Dim doc As Object
Dim wasAutoCalc As Boolean
doc = ThisComponent
wasAutoCalc = doc.isAutomaticCalculationEnabled()
doc.enableAutomaticCalculation(False)
' Perform bulk updates.
doc.enableAutomaticCalculation(wasAutoCalc)
If wasAutoCalc Then
doc.calculate()
End If
calculate()ダーティセルを再計算します。calculateAll()すべてのセルを再計算するため、それ自体がコストのかかる処理となる可能性があります。そのため、マクロが終了したからといって自動的に呼び出さないでください。ワークブックのロジックで実際に必要な場合にのみ、完全な再計算を使用してください。
コントローラーのロックと同様に、エラー処理パスで計算状態を復元してください。マクロは、ユーザーのワークブックを手動計算モードのままにして、何も通知しないようなことは避けてください。
公式リファレンス: LibreOffice SDK: XCalculatable。
最も効果的な構造は通常、正確な範囲を決定し、それを一度読み込み、メモリ内で値を処理し、結果をまとめて書き込み、その操作の間だけ、回避可能なUI処理や再計算処理を抑制するというものです。
LibreOffice Basicにおける実用的なクリーンアップパターンは次のようになります。
Sub ProcessLargeData
Dim doc As Object
Dim sheet As Object
Dim dataRange As Object
Dim data As Variant
Dim wasAutoCalc As Boolean
On Error GoTo CleanUp
doc = ThisComponent
sheet = doc.Sheets.getByName("Data")
dataRange = sheet.getCellRangeByPosition(0, 1, 4, 50000)
wasAutoCalc = doc.isAutomaticCalculationEnabled()
doc.lockControllers()
doc.enableAutomaticCalculation(False)
data = dataRange.getDataArray()
' Transform data in memory here.
' Build an output array with dimensions matching its target range.
CleanUp:
doc.enableAutomaticCalculation(wasAutoCalc)
If doc.hasControllersLocked() Then
doc.unlockControllers()
End If
If wasAutoCalc Then
doc.calculate()
End If
End Sub
この例では、変換ロジックを意図的に省略しています。なぜなら、その部分はワークブックによって異なるからです。重要な最適化はワークフローの構造であり、架空のビジネス計算ではありません。
LibreOffice Basic は、com.sun.star.sheet.FunctionAccessサービスを介して Calc の関数を呼び出すことができます。マクロで、Calc が既に提供している検索、集計、その他の操作を手動で実装している場合、組み込み関数を使用することでコードを簡素化し、独自のループ処理を減らすことができます。
これは、すべての組み込み関数がすべてのカスタムアルゴリズムよりも優れたパフォーマンスを発揮することを保証するものではありません。実際のワークロードでベンチマークテストを実施してください。公式ヘルプには、BasicからCalc関数を呼び出す方法が記載されており、関数名は英語で指定されていることに注意してください。
公式リファレンス: LibreOffice ヘルプ: マクロで Calc 関数を使用する。
| チェック | 良い兆候 | アプローチを変えるタイミング |
|---|---|---|
| ランタイム | 繰り返しの走行は、ベースラインよりも一貫して短い。 | ほとんどの時間は依然として1つのセクションに費やされているため、そのセクションを個別に分析する必要がある。 |
| 正確さ | 合計値、行数、数式、および代表レコードは、元のマクロと一致します。 | 配列変換は、データ型または出力次元を変更します。 |
| メモリ | 大量注文にも対応できるため、入れ替えや長時間の割り当て停止なしに快適に利用できます。 | フルレンジ配列が大きくなりすぎた場合は、より小さなチャンクを使用してください。 |
| 再計算 | 数式処理は、書き込みのたびにではなく、メインの更新後に一度だけ実行されます。 | 数式間の依存関係には、中間計算値が必要となる。 |
| UIの動作 | 処理完了または処理失敗後、文書は通常の表示および計算状態に戻ります。 | 状態が変更されたままになる可能性がある場合は、より強力なクリーンアップ/エラー処理を追加してください。 |
getDataArray()が、すべての結果をセルごとに書き戻す。calculateAll()たとえ再計算が必要なのがダーティセルのみであっても、少量のバッチごとに呼び出しを行う。配列転送は主にスプレッドシートオブジェクトへのアクセスオーバーヘッドを削減するものであり、本質的にコストのかかるアルゴリズムを修正するものではありません。例えば、すべての行を他のすべての行と比較するネストされた比較は、すべての値がメモリに格納されていても処理速度が遅いままとなる場合があります。そのような場合は、アルゴリズムを変更してください。辞書やインデックスを使用する、繰り返しソートするのではなく一度だけソートする、重複処理を減らす、あるいはスプレッドシートが適切な実行環境でなくなった場合は、ワークロードをより適切なデータ処理ツールに移行するなどの対策を講じてください。
ネットワーク呼び出し、データベースクエリ、ファイルI/O、または外部サービスによって処理が支配されるマクロにも同様のことが言えます。目に見えるスプレッドシートのループではなく、実際のボトルネックを最適化するために、まずは測定を行いましょう。
大規模なCalcデータセットの場合、Basicとスプレッドシートオブジェクト間の呼び出し回数を減らすことが、通常最も重要な構造的改善策となります。あらゆる最適化は、単なる儀式ではなく、効果測定の指標として捉えるべきです。マクロの高速化は、正確性、予測可能性、保守性を維持できる場合にのみ有効です。
ONLYOFFICE Desktop EditorsをownCloudサーバーに接続する手順を解説。ログイン、クラウド上のファイル編集、接続の管理、設定時によくあるトラブルの確認方法を紹介します。
Collabora OnlineのCPU使用率が高い場合、ビジー状態のキットプロセスを特定し、メトリクスとログを確認し、同時実行性とクリーンアップを調整し、修正が安全に行われたことを検証することで、トラブルシューティングを行います。
ONLYOFFICE Docsをヘッダーロゴやインターフェースカラーでカスタマイズする方法を学びましょう。ライセンス制限、テーマJSONの設定、Dockerパス、テスト方法なども解説します。
LibreOffice Calc で読みにくいテキストを修正するには、アプリのテーマ、セルのフォントと塗りつぶしの色、スタイル、条件付き書式設定を確認し、印刷出力を検証してください。
LibreOfficeの不明ユーザーによるロック警告を安全に解除します。アクティブなセッションを確認し、コピーを保護し、検証済みの古いロックのみを削除して、ドキュメントをテストします。
LibreOffice Writerで、アラビア語またはヘブライ語のテキストが英語と正しく並ばず、位置がずれたり、混ざり合ったりする場合を修正します。複雑なテキストレイアウトを有効にし、段落の方向を設定して、結果を確認してください。
Learn VLOOKUP and XLOOKUP in LibreOffice Calc, including exact matches, left lookups, not-found results, reverse search, INDEX/MATCH alternatives, and common errors.
Collabora OnlineのWOPI認証検証エラーのトラブルシューティングを行うには、検出キー、キーローテーション、プロキシURL、タイムスタンプ、ホスト許可リストを確認してください。
ONLYOFFICEドキュメントで全員に対して変更履歴の記録を有効にし、再度開いた後もアクティブな状態を維持する方法、およびグローバルなデフォルト設定の制限事項を理解してください。
Collabora Onlineのビューごとのタイムアウト、フォーカスが外れた状態のタイムアウト、ドキュメントがアイドル状態のタイムアウト、自動保存のタイムアウト、プロキシのタイムアウトを比較し、導入環境に適した設定を選択して確認してください。