2023年末からサービスが始まったMicrosoftのCopilot。プログラムコードも答えてくれるそうなので、試しにBing版でVBAのコードについて相談してみました。結果、言葉で相談した内容をコードにしてくれるので、管理人の様に忘れた頃にコードを書く人には助かりますね。ただ、コードはやや冗長だったり、微妙な構文だったりしました。使い手の修正は必要な印象です。

Edge で Copilot を開いて質問を送信

ウェブブラウザ Edge で新しいタブを開き、検索フォーム右側の Copilot アイコンをクリック。

Edge新しいタブ

表示された Copilot の入力フォームへ "VBA 変数で指定した範囲の合計を求めるコード" と入力し、送信ボタンをクリック。

Copilotの入力フォーム

質問がサーバーへ送られ、しばらく考えこみます。

Copilot の回答

数秒~十数秒待つと Copilot からの回答が送られてきます。

Copilotの回答

Copilot が作ったVBAコード

ご回答頂いたソースコードの部分は見やすいようにコードウィンドウに表示します。

VBA

  1. Sub SumWithVariables()
  2. Dim sumRange As Range
  3. Dim total As Double
  4. Dim startCell As String
  5. Dim endCell As String
  6. Dim ws As Worksheet
  7. ' 計算する範囲の開始セルと終了セルを設定
  8. startCell = "A1" ' 開始セル
  9. endCell = "A10" ' 終了セル
  10. Set ws = ActiveSheet ' 現在のアクティブシートを設定
  11. ' Rangeオブジェクトを使用して範囲を設定
  12. Set sumRange = ws.Range(startCell & ":" & endCell)
  13. ' SUM関数を使用して範囲の合計を計算
  14. total = Application.WorksheetFunction.Sum(sumRange)
  15. ' 結果をメッセージボックスで表示
  16. MsgBox "指定された範囲の合計は " & total & " です。"
  17. End Sub

そして次の様な解説も付けてくれます

"このコードでは、startCellとendCell変数を使って合計を求める範囲を指定しています。

sumRange変数は、その範囲をRangeオブジェクトとして設定し、WorksheetFunction.Sumメソッドは、指定された範囲のセルの合計を計算します。

最後に、計算された合計値がメッセージボックスに表示されます。必要に応じて、startCellとendCellの値を変更して、異なる範囲で合計を求めることができます。また、合計値を別のセルに出力することも可能です。

ご質問や追加のサポートが必要な場合は、お気軽にお問い合わせください。"

Copilot回答の添削

このまま使えると便利なのですが、いくつか気になる点が・・・。

Rangeに変数を使う

Rangeオブジェクトに変数を使う場合、次のような書き方はおすすめできません。

 Range( 変数A & ":" & 変数B )

":"で繋ぐ場合、変数には"C2"の様なセル座標を入れる必要があります。しかし、For Next構文などでカウントしてセル位置を割り出す場合、値は数値になりますのでそのまま (2, 3)の様に入力できるcellsプロパティの方が便利です。

定義する変数の数が多い

範囲の始まりと終わりを指定する変数のほかに、範囲の変数や、対象のワークシートを指定する変数なども用意しており、1文にまとめればこうした変数定義は不要に見えます。

管理人が添削したコード

以上を踏まえて、作成中の集計マクロに組み込むに当たり、下記の様に修正しました。

VBA

  1. Sub SumWithVariables_2()
  2. Dim start_pos As Integer
  3. Dim end_pos As Integer
  4. Dim total As Double
  5.  
  6. ' 計算する範囲の開始セルと終了セルを設定
  7. start_pos = 1 ' 開始行
  8. end_pos = 10 ' 終了行
  9.  
  10. ' Rangeとcellsオブジェクトで範囲を設定、SUM関数で合計を計算
  11. total = Application.WorksheetFunction.Sum(ActiveSheet.Range(Cells(start_pos, 7), Cells(end_pos, 7)))
  12.  
  13. ' 結果をメッセージボックスで表示
  14. MsgBox "指定された範囲の合計は " & total & " です。"
  15. End Sub

変数は、開始位置、終了位置、結果、の3点に絞りました

範囲指定と合計の計算を一つの文にすることで他の変数を省略しています。

範囲の指定は Range(Cells(値, 値), Cells(値, 値)) の形にし、コードに組み込んだ際に取得した値がそのまま入力出来るようにしました。

まとめ

便利な Copilot のコード作成機能ですが、知識なしでコピペして使うのは難しそうです。しかし、その言語をある程度学習した人にとっては、原案を作ってくれる便利なアシスタントになってくれます。

また、サービスは始まったばかりなので、学習が進むとより強力な相棒になるかもしれませんね。何年かしたら同じテーマで試してみたいです。