前編では、ChatGPTとVBAの連携を通じて、ChatGPTの柔軟性とVBAの強力な機能が組み合わさり、効率的な業務プロセス改善の可能性を確認しました。
ここでは、もう少し複雑な業務課題を例に、解決するためのアプローチについての考察と、より効果的にChatGPTとVBAを連携活用しながら業務改善を進めるためにはどうすれば良いか考えていきたいと思います。
参考)
前回の記事です。
ChatGPTとコラボしてVBAを業務改善に活かそう! – 実践的なプログラミングガイド① – ライフ&ジョブブログ (life-and-job.com)
VBAの設定の仕方は以下の記事を参照ください。
Excelの魔法を解き放つ!VBA入門:ステップバイステップガイド – ライフ&ジョブブログ (life-and-job.com)
https://chat.openai.com/ ChatGPTはOpen AIのサイトで登録できます。
ChatGPTの使い方についての記事です。
【その2】ChatGPTとは?使い方や機能、活用方法を徹底解説 – ライフ&ジョブブログ (life-and-job.com)
ChatGPTを利用したプログラミングの実践
課題;商品リストの表から必要情報を抽出したリストを作成する
以下のような商品リストがあります。最初の行には品名として、B列に商品コード、C列に商品名が記載され、それ以降の行に、メーカー、スペック、価格、などの情報が記載されています。これが数百程度の商品情報が順に載っているリストであるとします。
いま、このリストからスペック情報だけを抜粋したリストを作成する必要があります。規格項目は、B列に規格コード、その右側の列に規格項目とその単位、規格値が並んだ表になっています。
イメージとしては、以下の右側の表のように品名の行に、商品コードと商品名を、その下の行に規格項目、単位、規格値までのセルをA列から並べた表になります。オリジナルのリストから単純にコピーペーストするにもどうすれば良いか迷います。
ChatGPTへの指示(プロンプト)と回答
そこでChatGPTへ以下のように指示をしました。人間が作業するときの工程を一つずつ文章にして指示する内容です。コピーするセル、行、列なども具体的に書きました。
※xlDownは後述しますが、セル範囲を指定するときの表現方法(プロパティ)の一つです。
これに対して以下のように回答が得られました。うまくいかないのでコードは全部表示しませんが、なかなかのボリュームのコードです。
実行結果①
このコードを入力して実行した結果が以下の表です。
もとの表とあまり変わりません。規格項目だけ抜粋するという指示が伝わらなかったようです。
【プロンプトエンジニアリングに学ぶ】上手なAIとの対話や質問の仕方 – ライフ&ジョブブログ (life-and-job.com)
修正のための指示(プロンプト)
省略しますが、このあとこちらが意図する表になるようChatGPTへ修正の指示を何度も伝えましたがうまくいきませんでした。
最終的に以下のような指示にしています。
ちょっとややこしいので後でも説明しますが、修正においては以下のプログラムの流れに示すように、商品ごとにコピーしていくために、品名に着目した行数リストを作成し(3)、その行数の情報を起点にコピー元のセル範囲をすべて数式化したうえで、コピー先へ貼り付ける(4)操作を繰り返す。そのために必要な変数を定義(2)して指示しています。
プログラムの流れ
- 開始
- 変数の定義
- scrSheetを”Sheet1″として定義
- dstSheetを”Product”として定義
- LastRowをscrSheetのA列の最終行数に設定
- A()とnumの宣言と初期化
- 品名の行数リストの作成
- ループ開始
- cntの初期化
- For文 (i = 1 to LastRow)
- If文 (Cells(i, 1)が”品名”かどうか)
- A(cnt)にiを格納
- cntを増加
- If文 (Cells(i, 1)が”品名”かどうか)
- Next文
- ループ終了
- ループ開始
- 情報の貼り付け
- ループ開始
- pasterowの初期化
- For文 (i = 1 to num)
- 品名の行のセル範囲(A~C列)を”Product”シートにコピー&貼り付け
- 規格項目の数nの取得
- セル範囲(A(i),1).Offset(2,1)から(n+1,5)を”Product”シートにコピー&貼り付け
- pasterowをn+2増加
- Next文
- ループ終了
- ループ開始
- 終了
修正されたコード
以下の通りのコードを生成しました。早速実行します。
Sub 整理コード修正()
Dim scrSheet As Worksheet, dstSheet As Worksheet
Dim LastRow As Long, i As Long, cnt As Long
Dim pasterow As Long, n As Long
Dim A() As Long
Dim num As Long
' ソースシートとデスティネーションシートの指定
Set scrSheet = ThisWorkbook.Sheets("Sheet1")
Set dstSheet = ThisWorkbook.Sheets("Product")
' A列の最終行を特定
LastRow = scrSheet.Cells(scrSheet.Rows.Count, "A").End(xlUp).Row
' "品名"がいくつあるかカウント
num = Application.WorksheetFunction.CountIf(scrSheet.Range("A1:A" & LastRow), "品名")
' 配列の要素数を設定
ReDim A(1 To num)
' 品名の行数のリスト(配列変数)を作成
cnt = 1
For i = 1 To LastRow
If scrSheet.Cells(i, 1).Value = "品名" Then
A(cnt) = i
cnt = cnt + 1
End If
Next i
' 次の製品の貼り付け行を初期化
pasterow = 1
' 品名ごとに情報を整理
For i = 1 To num
' 品名のセル範囲(A~C列)をコピーしてProductシートへ貼り付け
scrSheet.Range(scrSheet.Cells(A(i), 1), scrSheet.Cells(A(i), 3)).Copy _
Destination:=dstSheet.Cells(pasterow, 1)
' 規格項目の数を取得
n = scrSheet.Cells(A(i) + 2, 2).End(xlDown).Row - scrSheet.Cells(A(i) + 2, 2).Row
' 規格項目のセル範囲をコピーしてProductシートへ貼り付け
scrSheet.Range(scrSheet.Cells(A(i), 1).Offset(2, 1), scrSheet.Cells(A(i), 1).Offset(2, 1).Resize(n + 1, 5)).Copy _
Destination:=dstSheet.Cells(pasterow + 1, 1)
' 次の製品の貼り付け行を更新
pasterow = pasterow + n + 2
Next i
End Sub
実行結果②
以下のように目論見通りの表が作成されました!
考察
ChatGPTとの連携によるVBA作成のポイント
今回の課題達成においては、以下のような過程をたどりました。
- 指示(プロンプト): ChatGPTに、商品リストからスペック情報だけを抜粋した新しいリストを作成するプログラムを作成するよう指示。
- 回答(実行結果①): ChatGPTが提供したコードでは、規格項目だけを抜粋する指示が正確に伝わらなかった。修正のための指示を追加する。
- 修正のための指示(プロンプト): 製品ごとにコピーしていくために、品名に着目した行数リストを作成し、その行数の情報を起点にコピー元のセル範囲をすべて数式化し、コピー先に貼り付ける操作を繰り返す。必要な変数を定義し、これに基づいて修正を指示する。
- 回答(実行結果②): ChatGPTが提供した修正コード。修正により、指定された形式の表が作成された。
ポイントになったのは、具体的な指示の仕方です。上述のプログラムの流れのように手順をフローチャート化し、使用する変数やセル範囲を具体的に数式化して指示したことで意図する内容が伝えられたと思います。
- 具体的な手順: 修正後の指示では、商品ごとにコピーしていくための手順が具体的に述べられています。品名に着目した行数リストの作成、数式化、コピー先への貼り付けなど、操作の手順が具体的に指定されていました。
- 変数の定義: 必要な変数やその目的が明確に定義されています。例えば、
pasterow
やn
など、プログラム内で使用される変数が明確に定義され、役割が示されています。 - 段階的なアプローチ: 商品ごとにコピーするための手順が、品名の行数リストを作成し、その行数を基にコピー元のセル範囲を数式化してからコピー先に貼り付ける、という具体的な手順に分割されています。これにより段階的に進めるようになっています。
- 適切な用語の使用: プログラミングに関する用語が適切に使用されており、VBA言語において理解しやすい表現が使われています。
最低限必要な理解
それでは、結局ChatGPTと何度もやり取りをするより人間がVBAを独力で作成した方が効率的ではないか、と思われる方もいるかもしれません。
ですが、私のような素人が1週間程度でこのようにプログラムを作成して使用しているということを考えていただくと使わないより使った方が良いのは間違いないと思います。
今回の課題でセルの表現について、以下のような整理を行なって最終的なプロンプトを作りました。
詳細は別途説明する記事を作りたいと思いますが、セル範囲、表現について以下の理解が必要でした。
- Cells:ワークシート内のセルを表します。セルの行番号と列番号を指定して、特定のセルを指定できます。例えば、Cells(1,1) はワークシートのA1セルを表します。
- Range: セル範囲を表します。Range(“A1:B10”) のようにセル範囲を指定して、その範囲内のセルにアクセスできます。
- Offset: 特定のセルからの相対的な位置にあるセルを取得するために使用されます。例えば、Cells(1,1).Offset(1,0)は、A1セルから1行下に移動したセルを表します。
- Resize:セル範囲のサイズを変更するために使用されます。例えば、Range(“A1”).Resize(2,3)は、A1セルを起点として2行3列の範囲(A1:C2)を表します。
- End: 指定されたセルからデータの終端までを取得するために使用されます。例えば、Range(“A1”).End(xlDown)は、A1セルから下方向にデータが入っている範囲の終端セルを表します。
全般的には以下の知識があった方が良いと感じました。
- VBAの基本概念: VBA(Visual Basic for Applications)は、Microsoft Office製品などで使用されるプログラミング言語です。基本的なプログラムの構造、変数、データ型、演算子、条件分岐、繰り返し処理などの基本概念を理解していることが必要です。
- オブジェクト、プロパティ、メソッド:よく使うものは知っておく必要があります。
- 変数とデータ型: 変数の宣言やデータ型(整数、文字列、オブジェクトなど)の理解が重要です。
- 条件分岐と繰り返し処理: 条件分岐(If文)や繰り返し処理(For文、Do While文など)の構文によるプログラムの流れを理解しておくことが必要です。
- ワークシート関数の利用: VBA内でワークシート関数を使用して計算やデータ処理を行うことがあります。基本的なワークシート関数の利用方法を理解しているとVBAでも役に立ちます。
- VBAエディタの基本的な使い方: VBAコードを記述するためのVBAエディタ(VBE)の基本的な使い方を理解しておくと、コードの編集やデバッグが効率的に行えます。
おわりに
今回の第2編のまとめを以下に記載します。
- 課題の設定: 商品リストから必要な情報だけを抜粋した新しいリスト表を作成するという複雑な業務課題を例に取り上げました。
- ChatGPTへの指示と回答: ChatGPTに対して具体的な指示を与え、最初の回答では規格項目の抜粋がうまくいかなかったが、その修正指示を行いました。
- 修正されたコードと実行結果: ChatGPTが提供した修正コードを実行し、目論見通りの表が作成されました。
- ChatGPTとの連携におけるポイント:以下の点に留意すると良いと思います。
- 具体的な手順:処理手順を具体的かつ段階的に進めるようなプロンプトを作成すること
- 変数の定義:必要な変数やその目的を明確に定義し、理解しやすいようにすること
- 適切な用語の使用:関数やセル表現をVBA用語を使用して、理解しやすいようにすること
- 最低限必要な理解: そのために以下のような知識、理解が必要と感じました。
VBAの基本概念:プログラムの構造、変数、データ型、演算子、条件分岐、繰り返し処理などの基本概念が必要です。
オブジェクト、プロパティ、メソッド: VBAにおいて、オブジェクト、プロパティ、メソッドの概念を理解することが重要です。
変数とデータ型: 変数の宣言やデータ型についての理解が求められます。
条件分岐と繰り返し処理: 条件分岐や繰り返し処理の構文によるプログラムの流れを理解する必要があります。
ワークシート関数の利用: VBA内でワークシート関数を使用する場面があるため、基本的なワークシート関数の使い方を理解しておくことが望ましいです。
VBAエディタの基本的な使い方: VBAエディタ(VBE)の基本的な使い方を把握すると、コードの編集やデバッグが効率的に行えます。
次回は、今回の課題解決に最低限必要な知識をまとめたうえで、ChatGPTとの連携によるVBAによる業務改善プロセスを最終提案したいと思います。
コメント