ChatGPTで作ったマクロ

記事
IT・テクノロジー
最近、勤務先の社長から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と言葉をこねくり回すより、自分で書いた方が早いというのは、時代遅れ?

「実行結果」
sample1.png

sample2.png

sample3.png

作成プロシージャフルコード
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言語などで開発していた時期が長い古株プログラマーの私には、変数宣言が途中で出てくるのには、チョー違和感です。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す