Microsoft OfficeマクロをONLYOFFICEマクロに変換する方法

Microsoft OfficeのVBAマクロをONLYOFFICEでシームレスに動作するマクロに変換する方法を疑問に思ったことはありませんか？この変換に直接的な解決策はありませんが、この記事では、<a href="https://forum.onlyoffice.com/t/help-me-make-such-a-macro-on-onliofis/5200?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=users_vba_to_js" target="_blank" rel="noopener">ユーザー様</a>から送られてきたVBAマクロを変換する手順をご説明します。

<img class="aligncenter wp-image-64296" src="https://static-blog.onlyoffice.com/wp-content/uploads/2023/07/04175637/Transforming-a-Microsoft-Office-macro-into-an-ONLYOFFICE-macro.png" alt="Transforming a Microsoft Office macro into an ONLYOFFICE macro" width="736" height="372" />

<!--more-->
<h2><strong>VBAマクロ</strong></h2>
元のVBAマクロは次の通りです：
<pre class="theme:flatui-light font:monospace lang:vb decode:true ">Sub Button1_Click()
    Dim mycel As Range
    For Each mycel In Columns("D:D").SpecialCells(xlCellTypeConstants, 23)
        If mycel = [TODAY()] Then mycel.Offset(0, 1) = [This_value]
    Next
End Sub
</pre>
このマクロはD列の定数値23のセルをスキャンし、各セルの値が[TODAY(] と書かれたセルの値と等しいかどうかをチェックする。値が一致すれば、[This_value]とラベル付けされたセルの値で、1列右にオフセットされた次の列のセルを更新する。

<img class="img-popup aligncenter wp-image-64219" src="https://static-blog.onlyoffice.com/wp-content/uploads/2023/07/04123152/Vba.png" alt="Transforming a Microsoft Office macro into an ONLYOFFICE macro" width="736" height="490" />
<h2>ONLYOFFICEマクロの構築</h2>
このマクロをONLYOFFICEと互換性のあるJavaScriptマクロに変換するには、<a href="https://api.onlyoffice.com/docbuilder/spreadsheetapi?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=users_vba_to_js" target="_blank" rel="noopener">ONLYOFFICE API</a>を活用します。

ONLYOFFICEマクロでは、まず<em>Api.GetActiveSheet()</em>関数を使ってアクティブシートを取得します。そして、VBAマクロの[TODAY()]と[This_value]に対応するセルA2とA4から値を取得します：
<pre class="theme:github font:monospace lang:js decode:true ">var sheet = Api.GetActiveSheet();
var dateValue = sheet.GetRange("A2").GetValue();
var updateValue = sheet.GetRange("A4").GetValue();
</pre>
次に、<em>sheet.GetRange("D1:D10")</em>を使用して、反復処理するセル範囲を定義します。この範囲は、この例ではD列を表しますが、特定のニーズに応じて調整することができます：
<pre class="theme:github font:monospace lang:js decode:true ">var dateRange = sheet.GetRange("D1:D10");
</pre>
<em>ForEach</em>関数を使用して、定義された範囲内の各セルを繰り返し処理します。各セルについて、<em>range.GetValue()</em>を使って現在の値を取得し、セルA2の値と比較します。両者が一致すれば、<em>range.GetRow()</em>で現在のセルの行番号を取得し、<em>sheet.GetRange("E" + row)</em>でE列の対応するセルを取得します：
<pre class="theme:github font:monospace lang:js decode:true ">dateRange.ForEach(function(range) {
  var currentDate = range.GetValue();
  // Check if the current date matches the value in cell A2
  if (currentDate === dateValue) {
    // Get the corresponding cell in column E
    var row = range.GetRow();
    var oRange = sheet.GetRange("E" + row);  }
});
</pre>
最後に、<em>oRange.SetValue(updateValue)</em>を使って、次のセル（1列右にオフセット）の値をセルA4の値で更新します：
<pre class="theme:github font:monospace lang:js decode:true ">   // Update the value in the next cell
    oRange.SetValue(updateValue);
  }
});
</pre>
マクロコード全体は以下の通りです：
<pre class="theme:github font:monospace lang:js decode:true ">(function()
{
    var sheet = Api.GetActiveSheet();
var dateValue = sheet.GetRange("A2").GetValue();
var updateValue = sheet.GetRange("A4").GetValue();
var dateRange = sheet.GetRange("D1:D10");
dateRange.ForEach(function(range) {
  var currentDate = range.GetValue();
  // Check if the current date matches the value in cell A2
  if (currentDate === dateValue) {
    // Get the corresponding cell in column E
    var row = range.GetRow();
    var oRange = sheet.GetRange("E" + row);
    // Update the value in the next cell
    oRange.SetValue(updateValue);
  }
});
})();
</pre>

結論として、ONLYOFFICEではVBAマクロからJavaScriptマクロへの直接変換はできません。しかし、ONLYOFFICE用のマクロを構築する際に、既存のVBAマクロをリファレンスとして使用することは可能です。ONLYOFFICE APIメソッドを活用し、必要な調整を行うことで、同様の機能を実現することができます。

多少のコード再構築が必要かもしれませんが、そのプロセスは管理可能です。記事で概説したいくつかのガイダンスにより、強力なONLYOFFICEマクロをうまく作成できることを願っています。
<div class="useful-links">
<h3>お役立ちリンク</h3>
<a href="https://forum.onlyoffice.com/?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=users_vba_to_js" target="_blank" rel="noopener"><u>ONLYOFFICE フォーラム</u></a>

<a href="https://api.onlyoffice.com/docbuilder/spreadsheetapi?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=users_vba_to_js" target="_blank" rel="noopener"><u>ONLYOFFICE API ドキュメント</u></a>

<a href="https://api.onlyoffice.com/plugin/macrosamples/?utm_source=qiita&amp;utm_medium=article+&amp;utm_id=users_vba_to_js" target="_blank" rel="noopener"><u>マクロのサンプル </u></a>

<a href="https://github.com/ONLYOFFICE" target="_blank" rel="noopener"><u>ONLYOFFICE on GitHub</u></a>

</div>