2023/06/28
【Excel】VBAとOfficeスクリプトのコードを比較(対象行の削除)

【Excel】VBAとOfficeスクリプトのコードを比較(対象行の削除)

Excelのマクロ開発に使われるプログラミング言語には、VBAとOfficeスクリプトがあります。
Officeスクリプトに関しては、2021年5月27日に一般公開された比較的新しい言語になります。

デスクトップ版のExcelでは、VBAでマクロ開発ができるのですが、Web版ではVBAを使うことができません。
そこでWeb版のExcelのマクロ開発用として登場したのが、Officeスクリプトになります。

現時点では、デスクトップ版のExcelでもOfficeスクリプトを使用することができるのですが、スクリプトファイルはExcelファイルとは別で、OneDrive上で管理する必要があります。
そのため、ネットに繋がっていないパソコンのExcelでは実行することができません。(2023年6月22日時点)

Officeスクリプトが使用できるライセンスは現時点では以下になります。

・Microsoft 365 Apps for business
・Microsoft 365 Business Standard
・Microsoft 365 Apps for enterprise
・Office 365 ProPlus for Devices
・Office 365 Enterprise E3
・Office 365 Enterprise E5
・Office 365 A3
・Office 365 A5

365でも家族向けのFamilyやPersonalではなく、一般法人向けである必要があるので、新規で登録する場合は注意する必要があります。

OfficeスクリプトはWeb業界では一般的なプログラミング言語「JavaScript」をベースとしています。
もう少し細かく解説すると、「JavaScript」をベースにMicrosoft社によって2014年頃に発表された「TypeScript」をベースとした言語になっています。

VBAを理解している方の場合は、比較的、簡単にOfficeスクリプトを理解できるかと思います。

こちらでは、そんなVBAとOfficeスクリプトのコードの違いを簡単に比較していきたいと思います。

今回、VBAとOfficeスクリプトで作成する内容は以下になります。

・A列に〇が入力されている行を削除する

VBAで開発した内容とOfficeスクリプトで開発した内容は以下になります。
アルゴリズム(仕組み)をVBAに寄せてOfficeスクリプトで開発しています。

処理の流れは以下になります。

1.アクティブシートの情報を取得(ws)
2.A列に〇が入力されている最終行の行番号を取得(lastRow)
→シート上のA列の最終行を選択し、「Ctrl+↑」で移動して選択した位置にあるセルの行番号を取得
3.対象の表の範囲を取得(rng)
4.繰り返し文(for)で、手順2で取得した最終行から表の先頭行までを繰り返し、A列に値が入力されている場合は、対象行(A列からC列)を削除して上に詰める

※あくまで一例のため、他の方法でも実現は可能になります。

比較すると、書き方は大きく異なってはいるのですが、全体の構造は似ているかと思います。
Officeスクリプトに挑戦してみたい方は、基礎コンテンツを用意しているため、ご確認ください。

>Officeスクリプトの基礎


コピーして活用できるようにコードを載せておきます。

Sub 対象行の削除()
    
    Dim sh As Worksheet
    Set sh = ActiveWorkbook.ActiveSheet
    
    Dim lastRow As Integer
    lastRow = sh.Cells(sh.Rows.Count, "A").End(xlUp).Row
    
    Dim rng As Variant
    rng = sh.Range(sh.Cells(1, 1), sh.Cells(lastRow, 1)).Value
    
    Dim i As Long
    
    For i = lastRow To 3 Step -1
        If rng(i, 1) <> "" Then
            sh.Range(sh.Cells(i, 1), sh.Cells(i, 3)).Delete Shift:=xlShiftUp
        End If
    Next i
    
End Sub
function main(workbook: ExcelScript.Workbook) {
    // Your code here

    const sh = workbook.getActiveWorksheet();
    var maxRow = sh.getRange('A:A').getRowCount();
    var lastRow = sh.getCell(maxRow - 1,0).getRangeEdge(ExcelScript.KeyboardDirection.up).getRowIndex() + 1;
    var rng = sh.getRangeByIndexes(0,0,lastRow,1).getValues();
    
    for (var i = lastRow - 1; i >= 2; i--){
        if (String(rng[i]) != ''){
            sh.getRangeByIndexes(i,0,1,3).delete(ExcelScript.DeleteShiftDirection.up);
        }
    }
}