仕事を効率化するために普段からよく使っている自動化プログラムってありますよね?
わたしの場合、特にExcel VBAを使って作業を自動化する機会が多いです。
皆で使うものというより、自分用のちょっとした便利ツールという感じなのですが、職場が変わると手間がかかるのが難点です。
というのも、前の職場からファイルの持ち出しができないので、その度に作り直すことになってしまうんです。
アルゴリズムは理解していても、普段からソースコードを眺めているわけではないのでExcel VBAのお作法とか忘れていて、調べながら組み直すのが面倒くさい…
そこで、Excel VBAの処理内容をChatGPTに伝えてコードを書かせたら、自分で調べながら組み直すよりも楽になるかもしれないと思い、試してみることにしました。
それでは具体的な実験過程を振り返ります。
特定の文字列が含まれるセルの背景色を変更するVBAの作成
作成するExcel VBAの要件は次のような感じです。
- VBAを書いたBookとは異なるBookの選択した範囲内の文字列を検索する
- 配列で指定した文字列を検索する
- 対象の文字列のどれかがあったら該当セルの背景色をオレンジ色に変更する
- 選択範囲内のセルのすべてを検証し終わったら処理を終了する
大規模な表の中から文字列を探すときに、この背景色を変更する処理を行うとExcelの機能で検索するよりも視認性が高まって作業効率が上がるんですよ。
これをChatGPTに作ってもらいます。
最初の要求と基礎コード
ここからVBAコードの構築に入るわけですが、まずは基本的な要求をChatGPTに伝えました。
他のBookの選択した範囲に配列で指定した文字列があったら対象セルの背景色をオレンジ色に変更するExcel VBA のコードを作成してください。
Excel VBAを使用して、指定した範囲内のセルで特定の文字列を検索し、それらのセルの背景色をオレンジに変更するコードを作成できます。以下はその例です:
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列 As String ' 対象の範囲と検索文字列を設定 Set 対象範囲 = ThisWorkbook.Sheets("シート名").Range("A1:A100") ' 対象の範囲を適切に変更 検索文字列 = "特定の文字列" ' 検索したい文字列を指定 ' 対象範囲内の各セルをループ For Each セル In 対象範囲 If InStr(1, セル.Value, 検索文字列) > 0 Then ' 検索文字列がセル内に見つかった場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です End If Next セル End Sub
これにより、指定した範囲内で特定の文字列を検索し、該当するセルの背景色をオレンジに変更するはずです。必要に応じて、対象の範囲や検索文字列を調整してください。>
即座にコードを提示してくれたので、内容を見てみましょう。
検索対象
「配列で指定した文字列があったら」と伝えたのですが、そうなっていませんね。
この部分です。
検索文字列 = "特定の文字列" ' 検索したい文字列を指定
特定の文字列をピンポイントで格納していて配列になっていません。
検索対象範囲
検索対象範囲も要求と違っていますね。
Set 対象範囲 = ThisWorkbook.Sheets("シート名").Range("A1:A100") ' 対象の範囲を適切に変更
「他のBookの選択した範囲」と伝えたのにそうはなっていません。
VBAのコードを記載したBookの[シート名]シートのA1セルからA100セルまでの範囲になっています。
「対象の範囲を適切に変更」とコメントされていますが、わたしの要求は範囲を動的に取得することなので決め打ちではなく指定できるはずです。
最初のコードの修正を依頼
明らかな間違いがあるので、ChatGPTに修正を依頼します。
修正点は1つずつ順に伝えることにしました。
検索文字列は配列に格納された文字列を次々と検索するようにしてください。
指定した範囲内で配列に格納された複数の文字列を順番に検索し、それらの文字列がセル内に存在する場合にセルの背景色をオレンジに変更するVBAコードを以下に示します。
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列() As String Dim 検索文字列 As String ' 対象の範囲と検索文字列を設定 Set 対象範囲 = ThisWorkbook.Sheets("シート名").Range("A1:A100") ' 対象の範囲を適切に変更 検索文字列配列 = Array("文字列1", "文字列2", "文字列3") ' 検索したい文字列を配列で指定 ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列 If InStr(1, セル.Value, 検索文字列) > 0 Then ' 検索文字列がセル内に見つかった場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
対象範囲は「他のBookの現在選択されている範囲」でお願いします。
他のBookから現在選択されている範囲を取得して、指定した配列内の文字列を順番に検索し、それらの文字列がセル内に存在する場合にセルの背景色をオレンジに変更するVBAコードを以下に示します。
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列() As String Dim 検索文字列 As String ' 現在選択されている範囲を取得 On Error Resume Next Set 対象範囲 = Application.InputBox("対象範囲を選択してください", Type:=8) On Error GoTo 0 ' 現在の選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "無効な選択範囲です。処理を中止します。", vbExclamation Exit Sub End If ' 検索文字列を設定 検索文字列配列 = Array("文字列1", "文字列2", "文字列3") ' 検索したい文字列を配列で指定 ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列 If InStr(1, セル.Value, 検索文字列) > 0 Then ' 検索文字列がセル内に見つかった場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
このコードは、ユーザーが他のBookから範囲を選択し、それを対象範囲として使用します。選択範囲内で指定した文字列を検索し、該当するセルの背景色をオレンジに変更します。必要に応じて、‘検索文字列配列’とオレンジの色を調整してください。
動作確認してみる
提示されたソースコードは、ぱっと見では動きそうな雰囲気ですね。
というわけで、実際にExcelで動作確認してみました。
すると…
「For Each を配列で使用する場合は、バリアント型の配列でなければなりません」
エラーで止まってしまいました。
エラーの原因を取り除く
動作確認をした結果、エラーになったので、エラーの内容をChatGPTに伝えて修正をしてもらいましょう。
「For Each を配列で使用する場合は、バリアント型の配列でなければなりません」というエラーになりました。
申し訳ありません、Array 関数で作成した配列は Variant 型です。VBAでは、Variant 型を使用して文字列型の配列を定義することもできますが、String 型の配列を使用する方が適切です。以下に、String 型の配列を使用するコードを示します。
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列() As String Dim 検索文字列 As String ' 現在選択されている範囲を取得 On Error Resume Next Set 対象範囲 = Application.InputBox("対象範囲を選択してください", Type:=8) On Error GoTo 0 ' 現在の選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "無効な選択範囲です。処理を中止します。", vbExclamation Exit Sub End If ' 検索文字列を設定 ReDim 検索文字列配列(1 To 3) As String ' 3つの文字列を検索する場合 検索文字列配列(1) = "文字列1" 検索文字列配列(2) = "文字列2" 検索文字列配列(3) = "文字列3" ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列 If InStr(1, セル.Value, 検索文字列) > 0 Then ' 検索文字列がセル内に見つかった場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
このコードでは、ReDim ステートメントを使用して String 型の配列を定義し、検索文字列を設定しています。必要に応じて、ReDim ステートメントで配列のサイズを調整し、検索文字列を指定してください。
配列の形式が気に入らない
修正案を提示してくれてエラーは取り除かれるのかもしれませんが、配列の書き方が気に入りません。
というのも修正前の配列への文字列の設定が
' 検索文字列を設定 検索文字列配列 = Array("文字列1", "文字列2", "文字列3") ' 検索したい文字列を配列で指定
そして修正後は
' 検索文字列を設定 ReDim 検索文字列配列(1 To 3) As String ' 3つの文字列を検索する場合 検索文字列配列(1) = "文字列1" 検索文字列配列(2) = "文字列2" 検索文字列配列(3) = "文字列3"
修正後の方法だと、検索対象文字列の数を指定して、配列番号を振ってあげないと検索にたどり着けないんですよ。
手間が多いのです。
それに比べて修正前のArrayで設定すると、検索対象の文字列を書き出してちょと置換して整えるだけで配列が出来上がります。
圧倒的に使い勝手が良いんですよ。
ArrayはVariantでないと使えないんですかね?
使い勝手の悪そうな部分を修正
配列の部分もそうですが、実行するたびに「対象範囲を選択してください」とメッセージを出すなど、使い勝手が悪そうな部分を修正してもらいます。
検索文字列をVariantで設定したいです。
検索文字列を Variant 型で設定する場合、次のようにコードを修正できます。以下のコードでは、検索文字列を Variant 型で定義し、配列内の各文字列を Variant として処理します。
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列 As Variant Dim 検索文字列 As Variant Dim i As Long ' 現在選択されている範囲を取得 On Error Resume Next Set 対象範囲 = Application.InputBox("対象範囲を選択してください", Type:=8) On Error GoTo 0 ' 現在の選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "無効な選択範囲です。処理を中止します。", vbExclamation Exit Sub End If ' 検索文字列を設定(Variant型の配列) 検索文字列配列 = Array("文字列1", "文字列2", "文字列3") ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列 If InStr(1, セル.Value, CStr(検索文字列)) > 0 Then ' 検索文字列がセル内に見つかった場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
このコードでは、検索文字列配列を Variant 型の配列として定義し、各文字列を CStr 関数を使用して文字列として処理しています。必要に応じて、検索文字列配列を変更してください。
“対象範囲を選択してください”と聞かずに、対象範囲は「現在アクティブになってるBookの現在選択されている範囲」を対象にしてください。
現在アクティブなブックの選択範囲を検索対象にしたい場合、以下のコードを使用できます。
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列 As Variant Dim 検索文字列 As Variant Dim i As Long ' 現在アクティブなブックから選択された範囲を取得 On Error Resume Next Set 対象範囲 = ActiveWindow.Selection On Error GoTo 0 ' 選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "有効な範囲が選択されていません。処理を中止します。", vbExclamation Exit Sub End If ' 検索文字列を設定(Variant型の配列) 検索文字列配列 = Array("文字列1", "文字列2", "文字列3") ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列 If InStr(1, セル.Value, CStr(検索文字列)) > 0 Then ' 検索文字列がセル内に見つかった場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
このコードは、現在アクティブなブックから選択範囲を取得し、指定した検索文字列を使用してセル内の文字列を検索します。必要に応じて、検索文字列配列を調整してください。
修正後の動作を確認
先ほどのVariant型エラーのような気づき難い問題が潜んでいなければ、うまく動いてくれそうなソースコードができました。
この辺でもう一度、動作を確認してみましょう。
検索対象文字列は、仮で入れてあったままです。
検索文字列配列 = Array("文字列1", "文字列2", "文字列3")
いざ実行
それっぽい動作になっていますね!
でもよく見ると「文字列12」「文字列13」「文字列14」もオレンジ色になっていますね。
これはたぶん部分一致ということでしょう。
完全一致の条件追加
わたしの使い方といては、部分一致よりも完全一致の方が使いやすいので、完全一致に修正してもらいます。
ほぼできましたが、検索文字列はセル内の文字列との完全一致にしてください。
検索文字列をセル内の文字列との完全一致とするために、=演算子を使用して比較できます。以下は修正されたコードです。
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列 As Variant Dim 検索文字列 As Variant ' 現在アクティブなブックから選択された範囲を取得 On Error Resume Next Set 対象範囲 = ActiveWindow.Selection On Error GoTo 0 ' 選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "有効な範囲が選択されていません。処理を中止します。", vbExclamation Exit Sub End If ' 検索文字列を設定(Variant型の配列) 検索文字列配列 = Array("文字列1", "文字列2", "文字列3") ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列 If セル.Value = CStr(検索文字列) Then ' 検索文字列がセル内の文字列と完全一致する場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
このコードでは、=演算子を使用してセルの値と検索文字列が完全に一致するかどうかを確認しています。見つかった場合、背景色をオレンジに変更します。
完全一致になったか確認
背景色の変更対象を完全一致に直してもらったので、動作確認してみましょう。
検索対象文字列は、今回も仮で入れてあった文字列1~3です。
検索文字列配列 = Array("文字列1", "文字列2", "文字列3")
では実行
今回は後方一致する文字列も用意しましたが、完全一致の動作になっていますね!
検索文字列の動的な取得
最初に考えていた動作になったので、欲を出してユーザビリティの向上を目指すことにします。
追加する要件は、以下です。
- VBAを書き込んだBookのB2セルに書き込んだ文字列を検索対象の配列に格納する
- B2セルには文字列を改行区切りで設定するので改行ごとに別の文字列として取得する
検索対象の文字列をいちいちソースコードを開いて記入するのではなく、ExcelシートのB2セルに改行区切りで入力した文字列を取得して配列に格納するように変更します。
こういう感じで入力したものを配列に格納してもらえれば、使い勝手が良くなりますよね。
ChatGPTに追加の仕様を伝える
自BookのB2セルに改行区切りで設定したものを取得して、検索文字列配列に設定する文字列にするように変更できますか
自分のブックのB2セルに改行区切りで複数の検索文字列を設定し、それを検索文字列配列に変換するには、以下のコードを使用できます。
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列() As String Dim 検索文字列 As Variant ' 現在アクティブなブックから選択された範囲を取得 On Error Resume Next Set 対象範囲 = Selection On Error GoTo 0 ' 選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "有効な範囲が選択されていません。処理を中止します。", vbExclamation Exit Sub End If ' B2セルから改行区切りの文字列を取得 Dim 検索文字列セル As Range Set 検索文字列セル = ThisWorkbook.Sheets("シート名").Range("B2") ' B2セルの参照を適切に変更 ' B2セルの値を改行で分割して配列に格納 検索文字列配列 = Split(検索文字列セル.Value, vbNewLine) ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列 If セル.Value = CStr(検索文字列) Then ' 検索文字列がセル内の文字列と完全一致する場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
このコードでは、B2セルの値を改行で分割して、検索文字列配列に格納します。それから、対象範囲内の各セルと検索文字列配列の要素を比較して、完全一致する場合に背景色を変更します。必要に応じて、シート名やセルの参照を変更してください。
追加仕様の動作確認
B2セルに検索対象の文字列を改行区切りで入力して、動作確認をしてみました。
ところが、エラーにはならないけれども、検索にヒットしなくなっていました。
検索対象の文字列をB2セルから取得する以外は変更していないので、文字列が上手く取得できていないということだと思います。
ChatGPTの実力を探る
改行区切りごとに文字列を切り出して配列に格納する動作ですから、きっと余分な改行コードが含まれていて完全一致していないと予想はつきます。
正直ここまでくると、自分でデバッグして修正した方が早そうですが、今回はChatGPTの実力を見るためにやらせてみます。
しかし、この判断がこの後の苦戦を招きました。
改行の扱いを修正させるのに苦戦
配列に入れる際、最後の改行は削除してください
最後の改行を削除して、改行区切りの文字列を配列に格納するには、以下のように修正できます。
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列() As String Dim 検索文字列 As Variant ' 現在アクティブなブックから選択された範囲を取得 On Error Resume Next Set 対象範囲 = Selection On Error GoTo 0 ' 選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "有効な範囲が選択されていません。処理を中止します。", vbExclamation Exit Sub End If ' B2セルから改行区切りの文字列を取得 Dim 検索文字列セル As Range Set 検索文字列セル = ThisWorkbook.Sheets("シート名").Range("B2") ' B2セルの参照を適切に変更 ' B2セルの値を改行で分割して配列に格納 Dim 検索文字列原文 As String 検索文字列原文 = 検索文字列セル.Value If Right(検索文字列原文, 1) = vbNewLine Then 検索文字列原文 = Left(検索文字列原文, Len(検索文字列原文) - 1) End If 検索文字列配列 = Split(検索文字列原文, vbNewLine) ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列 If セル.Value = CStr(検索文字列) Then ' 検索文字列がセル内の文字列と完全一致する場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
この修正により、B2セルからの文字列の末尾の改行が削除され、その後に Split 関数を使用して配列に格納されます。
セルの最後の改行ではなく、セル内にある改行「改行コードvbLf(ラインフィールド:Chr(10)」を削除する形にできませんか
また、B2セルの内容をvbLf(ラインフィールド)毎に区切って配列に格納する必要があります。
B2セルの内容をvbLf(ラインフィールド)で区切って配列に格納するには、以下のコードを使用できます:
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列() As String Dim 検索文字列 As Variant ' 現在アクティブなブックから選択された範囲を取得 On Error Resume Next Set 対象範囲 = Selection On Error GoTo 0 ' 選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "有効な範囲が選択されていません。処理を中止します。", vbExclamation Exit Sub End If ' B2セルから改行区切りの文字列を取得 Dim 検索文字列セル As Range Set 検索文字列セル = ThisWorkbook.Sheets("シート名").Range("B2") ' B2セルの参照を適切に変更 ' B2セルの値をvbLf(ラインフィールド)で分割して配列に格納 Dim 検索文字列原文 As String 検索文字列原文 = Trim(検索文字列セル.Value) 検索文字列配列 = Split(検索文字列原文, vbLf) ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列 If セル.Value = CStr(検索文字列) Then ' 検索文字列がセル内の文字列と完全一致する場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
この修正により、B2セルの値をvbLf(ラインフィールド)で分割して配列に格納するようになります。必要に応じて、シート名やセルの参照を適切に変更してください。
もう少しです。vbLf(ラインフィールド)で分割したとき、空文字になった場合は配列に格納しないで
空文字列を配列に格納しないようにするには、Split 関数で取得した各要素をチェックしてから配列に格納します。以下は修正されたコードです:
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列() As String Dim 検索文字列 As Variant Dim 検索文字列原文 As String ' 現在アクティブなブックから選択された範囲を取得 On Error Resume Next Set 対象範囲 = Selection On Error GoTo 0 ' 選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "有効な範囲が選択されていません。処理を中止します。", vbExclamation Exit Sub End If ' B2セルから改行区切りの文字列を取得 Dim 検索文字列セル As Range Set 検索文字列セル = ThisWorkbook.Sheets("シート名").Range("B2") ' B2セルの参照を適切に変更 ' B2セルの値をvbLf(ラインフィールド)で分割して配列に格納(空文字を除外) 検索文字列原文 = Trim(検索文字列セル.Value) 検索文字列配列 = Split(検索文字列原文, vbLf) ' 空文字列を除外 ReDim 検索文字列配列Filtered(0 To 0) Dim i As Integer For i = LBound(検索文字列配列) To UBound(検索文字列配列) If Len(検索文字列配列(i)) > 0 Then ReDim Preserve 検索文字列配列Filtered(0 To UBound(検索文字列配列Filtered) + 1) 検索文字列配列Filtered(UBound(検索文字列配列Filtered)) = 検索文字列配列(i) End If Next i ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列Filtered If セル.Value = CStr(検索文字列) Then ' 検索文字列がセル内の文字列と完全一致する場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
この修正により、Split 関数で分割した文字列の要素が空文字列であれば、配列に格納されないようになります。必要に応じて、シート名やセルの参照を適切に変更してください。
デバッグしながら手伝うことに
もう一息というところで、修正が上手くいきません。
こうなったら自分でデバッグしながら状況をChatGPTに伝えてあげることにしました。
B2セル内の空行がEmpty値として配列に入っています。配列に入らないようにしてください
B2セル内の空行がEmpty値として配列に入る問題を解決するには、vbLfで分割した後に各要素が空行でないかをチェックしてから配列に格納します。以下は修正されたコードです:
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列() As String Dim 検索文字列 As Variant Dim 検索文字列原文 As String ' 現在アクティブなブックから選択された範囲を取得 On Error Resume Next Set 対象範囲 = Selection On Error GoTo 0 ' 選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "有効な範囲が選択されていません。処理を中止します。", vbExclamation Exit Sub End If ' B2セルから改行区切りの文字列を取得 Dim 検索文字列セル As Range Set 検索文字列セル = ThisWorkbook.Sheets("シート名").Range("B2") ' B2セルの参照を適切に変更 ' B2セルの値をvbLf(ラインフィールド)で分割して配列に格納(空行を除外) 検索文字列原文 = Trim(検索文字列セル.Value) 検索文字列配列 = Filter(Split(検索文字列原文, vbLf), "") ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For Each 検索文字列 In 検索文字列配列 If セル.Value = CStr(検索文字列) Then ' 検索文字列がセル内の文字列と完全一致する場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列 Next セル End Sub
この修正により、Filter 関数を使用して空行を含まないように検索文字列の配列をフィルタリングします。必要に応じて、シート名やセルの参照を適切に変更してください。
Empty値が””(値無し)に変わっただけで、検索対象になっています。配列に格納しないようにしてください。
遂に完成
最後に行った質問で、ついに希望した動作をするソースコードを出力することに成功しました。
最終的なChatGPTからの返答は以下です。
Empty値を含まないように配列に格納しないように修正しました。以下は修正済みのコードです:
Sub 背景色を変更() Dim 対象範囲 As Range Dim セル As Range Dim 検索文字列配列() As String Dim 検索文字列 As Variant Dim 検索文字列原文 As String ' 現在アクティブなブックから選択された範囲を取得 On Error Resume Next Set 対象範囲 = Selection On Error GoTo 0 ' 選択範囲が有効でない場合、エラーメッセージを表示して終了 If 対象範囲 Is Nothing Then MsgBox "有効な範囲が選択されていません。処理を中止します。", vbExclamation Exit Sub End If ' B2セルから改行区切りの文字列を取得 Dim 検索文字列セル As Range Set 検索文字列セル = ThisWorkbook.Sheets("シート名").Range("B2") ' B2セルの参照を適切に変更 ' B2セルの値をvbLf(ラインフィールド)で分割して配列に格納(空行を除外) 検索文字列原文 = Trim(検索文字列セル.Value) Dim 検索文字列一覧() As String 検索文字列一覧 = Split(検索文字列原文, vbLf) ' 空行を除外した検索文字列配列を作成 Dim 検索文字列数 As Integer Dim 検索文字列Index As Integer ReDim 検索文字列配列(0 To UBound(検索文字列一覧)) For 検索文字列Index = 0 To UBound(検索文字列一覧) If Trim(検索文字列一覧(検索文字列Index)) <> "" Then 検索文字列配列(検索文字列数) = Trim(検索文字列一覧(検索文字列Index)) 検索文字列数 = 検索文字列数 + 1 End If Next 検索文字列Index ' 対象範囲内の各セルをループ For Each セル In 対象範囲 For 検索文字列Index = 0 To 検索文字列数 - 1 If セル.Value = CStr(検索文字列配列(検索文字列Index)) Then ' 検索文字列がセル内の文字列と完全一致する場合、背景色をオレンジに変更 セル.Interior.Color = RGB(255, 165, 0) ' RGB(255, 165, 0) はオレンジの色です Exit For ' 見つかったら内側のループから出て次のセルへ End If Next 検索文字列Index Next セル End Sub
この修正により、空行を含まないように検索文字列の配列が作成されます。必要に応じて、シート名やセルの参照を適切に変更してください。
おわりに
ChatGPTと対話しながら望む形のExcel VBAのコードを作成することができました。
実はまだ一列丸ごと選択して実行すると応答なしになるなど、修正すべき点はあるのですが、その辺は運用でカバーしたいと思います。
セルに入力した文字列から配列の要素を切り出す流れでは、わたし自身でデバッグをしていましたので、ChatGPTに全部任せるのはまだ難しいかもしれません。
しかし、最初に提示した要件までは言うほど苦労せずにたどり着いたので、ベースとなるコードを出力させて自分で手直しするのが一番効率的な使い方かなという印象でした。
限界があることは理解したうえで使えば、それなりに役に立ちそうですね。
あなたも生成AIを利用して効率的な生活を目指してみてください。