最近、勤務先の社長からChatGPTを使ったマクロ作成の話があり、
「Excelも、Pythonも、もうChatGPTでプログラムが作れちゃうよ!」
と言われて、
よーし!と妙に闘志満々となり、ChatGPT使い倒してみました。
そんなに意地悪するつもりはなく、基本的なものをと以下のお題を出したところ、
「Excelの選択中範囲がある範囲に含まれるかVBAで確認するには?」
帰ってきたマクロは以下のようなものでした。
Dim selectedRange As Range
Set selectedRange = Selection
Dim selectedRangeAddress As String
selectedRangeAddress = selectedRange.Address
Dim targetRange As Range
Set targetRange = Range("A1:B10") ' 適切な範囲を指定します。
Dim targetRangeAddress As String
targetRangeAddress = targetRange.Address
If InStr(targetRangeAddress, selectedRangeAddress) > 0 Then
MsgBox "選択範囲が含まれます。"
Else
MsgBox "選択範囲は含まれません。"
End If
わっはっはっはっは
1人パソコンの前で大爆笑。
このコードは、Selection.AddressがtargetRangeAddressと全く同じか、$A1:$B1とかであれば上手くいきますが、$A2:$B5とか、あまりにも多くのパターンで上手くいきません。
「含まれる」という単語からInstr関数を引っ張ってきたのでしょうか?
AIとお付き合いするには、言葉選びがチョー重要ですね。
今回のお題で実際によく使われるのは、Application.Intersect関数だと思います。Intersectの日本語の意味は「交わる」なので、以下のようにお題を変えてみました。
「Excelの選択中範囲がある範囲と交わっているかVBAで確認するには?」
すると、最後の7行、以下に変わってきました。
If Not Intersect(selectedRange, targetRange) Is Nothing Then
MsgBox "選択範囲と対象範囲は交わっています。"
Else
MsgBox "選択範囲と対象範囲は交わっていません。"
End If
はっはっはっはっはっは
これで、要件は達しましたが、あまり日本語で「範囲が交わる」とは言わないもので、別の表現を探し、ググって「範囲が重なる」とIntersect関数の説明に載っていたりするので、
「Excelの選択中範囲がある範囲に重なっているかをVBAで確認するには?」
とお題を変えてみたら、再度Intersect関数を使ったコードを出してきました。
If Not (Intersect(selectedRange, targetRange) Is Nothing) Then
MsgBox "選択範囲は、対象範囲に重なっています。"
Else
MsgBox "選択範囲は、対象範囲に重なっていません。"
End If
ところで、Intersect関数は、重なっている範囲を返すのですが、選択範囲が、ある範囲の中に納まっているかどうかを確認するには、関数の返り値がNothing出ないかどうかだけでは不十分で、返り値の範囲が対象範囲と同一という確認が必要です。
お題を変えてみました。
「Excelの選択中範囲がある範囲の中にあるかをVBAで確認するには?」
すると帰ってきたのは、、
If Intersect(selectedRange, targetRange) Is Nothing Then
MsgBox "選択範囲は、対象範囲の中に含まれていません。"
ElseIf selectedRange.Address = targetRange.Address Then
MsgBox "選択範囲は、対象範囲と一致しています。"
Else
MsgBox "選択範囲は、対象範囲の中に含まれています。"
End If
はっはっはっはっは
一見、やっと要件足したと思いましたが、違いました。
範囲のアドレスが一致している時と、違っているけれど重なっている時のメッセージを分けているだけで、選択範囲がある範囲の中にあるチェックにはなりません。
Dim wRange as Range
Set wRange = Intersect(selectedRange,targetRange)
if (wRange is nothing) then
msgbox "選択範囲は対象範囲に含まれません"
elseif (wRange.Address = selectedRange.Address) then
msgbox "選択範囲は対象範囲の中にあります"
else
msgbox "選択範囲の一部は、対象範囲の中にありません
end if
AIと言葉をこねくり回すより、自分で書いた方が早いというのは、時代遅れ?
「実行結果」
作成プロシージャフルコード
Sub checkRange()
Dim selectedRange As Range
Set selectedRange = Selection
Dim selectedRangeAddress As String
selectedRangeAddress = selectedRange.Address
Dim targetRange As Range
Set targetRange = Range("A1:B10")
Dim wRange As Range
Set wRange = Intersect(selectedRange, targetRange)
If (wRange Is Nothing) Then
MsgBox "選択範囲は対象範囲に含まれません"
ElseIf (wRange.Address = selectedRange.Address) Then
MsgBox "選択範囲は対象範囲の中にあります"
Else
MsgBox "選択範囲の一部は、対象範囲の中にありません"
End If
End Sub
ChatGPT君(人?)が生成したコードをなるべく活用しましたが、私のいつも書いているコードとはまったく違うスタイルであることをコメントしておきます。
ExcelVBAではOKなのでしょうけれど、C言語などで開発していた時期が長い古株プログラマーの私には、変数宣言が途中で出てくるのには、チョー違和感です。