https://blog.goo.ne.jp/nichikon2/e/bc53b832fb46b2466196b41cc1cdf2ff
の記事で作ったプログラムをちょっと改造してみた。
ユーザーが入力した文字の中に「円」または「直線」が含まれているかどうか判定し、
もし含まれていた場合のみ直線または円を描くプログラムを実行するようにした。
ちなみにbardでは何回も修正するように依頼したのだが、
全く直らないどころか同じ返答を繰り返すばかりだったので、
ChatGPTに頼んでみたら、一発で直った。
それが次のコードである。
Sub CAD()
Dim userInput As String
Dim hasLine As Boolean
Dim hasCircle As Boolean
userInput = InputBox("何をしましょうか?")
hasLine = InStr(userInput, "直線") > 0
hasCircle = InStr(userInput, "円") > 0
If hasLine Then
MsgBox "始点と終点の座標を指定してください。"
Dim StartX As Integer
Dim StartY As Integer
Dim EndX As Integer
Dim EndY As Integer
StartX = InputBox("始点のX座標を入力してください。")
StartY = InputBox("始点のY座標を入力してください。")
EndX = InputBox("終点のX座標を入力してください。")
EndY = InputBox("終点のY座標を入力してください。")
With ActiveSheet.Shapes.AddLine(StartX, StartY, EndX, EndY)
.Line.Weight = 2 ' Set the line thickness to 2 points
End With
ElseIf hasCircle Then
MsgBox "中心の座標と半径を入力してください。"
Dim centerX As Variant
Dim centerY As Variant
Dim radius As Variant
Dim drawingSheet As Worksheet
Dim newCircle As Shape
Set drawingSheet = ActiveSheet
centerX = Application.InputBox("Enter the x-coordinate of the center of the circle", "Center X", Type:=1)
centerY = Application.InputBox("Enter the y-coordinate of the center of the circle", "Center Y", Type:=1)
radius = Application.InputBox("Enter the radius of the circle", "Radius", Type:=1)
Set newCircle = drawingSheet.Shapes.AddShape(msoShapeOval, _
-radius, centerY - radius, radius * 2, radius * 2)
With newCircle.Line
.Weight = 2 ' Set the line thickness to 2 points
.DashStyle = msoLineSolid ' Set the line style to solid
.ForeColor.RGB = RGB(255, 0, 0) ' Set the line color to red
End With
newCircle.Fill.Visible = msoFalse ' Set the fill to transparent
Else
MsgBox "そのような操作はできません。"
End If
End Sub
てなわけで今回はChatGPTの勝ち。
最近発表されたgoogle のAIチャットで質問をしてみた。
VBAでチャットボットを作りたいと。
早速ソースコードの例が生成されたが、
Bard AI 「What would you like to talk about?」
俺様「hello」の場合、Bard AI「Hello there!」
俺様「goodbye」の場合、Bard AI「Goodbye!」
俺様「上記以外」の場合、Bard AI「I don't understand. Please try again.」
というショボいものだった。
あまりにもショボいので改造してみた。
Sub ChatBot()
Dim userInput As String
userInput = InputBox("何をしましょうか?")
Select Case userInput
Case "直線"
MsgBox "始点と終点の座標を指定してください。"
Dim StartX As Integer
Dim StartY As Integer
Dim EndX As Integer
Dim EndY As Integer
StartX = InputBox("始点のX座標を入力してください。")
StartY = InputBox("始点のY座標を入力してください。")
EndX = InputBox("終点のX座標を入力してください。")
EndY = InputBox("終点のY座標を入力してください。")
With ActiveSheet.Shapes.AddLine(StartX, StartY, EndX, EndY)
.Line.Weight = 2 ' Set the line thickness to 2 points
End With
Case "円"
MsgBox "中心の座標と半径を入力してください。"
Dim centerX As Variant
Dim centerY As Variant
Dim radius As Variant
Dim drawingSheet As Worksheet
Dim newCircle As Shape
Set drawingSheet = ActiveSheet
centerX = Application.InputBox("Enter the x-coordinate of the center of the circle", "Center X", Type:=1)
centerY = Application.InputBox("Enter the y-coordinate of the center of the circle", "Center Y", Type:=1)
radius = Application.InputBox("Enter the radius of the circle", "Radius", Type:=1)
Set newCircle = drawingSheet.Shapes.AddShape(msoShapeOval, _
-radius, centerY - radius, radius * 2, radius * 2)
With newCircle.Line
.Weight = 2 ' Set the line thickness to 2 points
.DashStyle = msoLineSolid ' Set the line style to solid
.ForeColor.RGB = RGB(255, 0, 0) ' Set the line color to red
End With
newCircle.Fill.Visible = msoFalse ' Set the fill to transparent
Case Else
MsgBox "そのような操作はできません。"
End Select
End Sub
結果はバッチリ!
次はセレクトボックスを表示させ、やりたい操作を選ばせて、数字を入力する形式にしてみたい。
Sub DrawCircleFromThreePoints()
Dim x1, x2, x3, y1, y2, y3 As Double
Dim a, b, c, d, e, f As Double
Dim xCenter, yCenter, radius As Double
Dim s, t As Double
Dim Msg As String
'3つの点を取得
x1 = InputBox("最初の点のx座標を入力してください")
y1 = InputBox("最初の点のy座標を入力してください")
x2 = InputBox("2番目の点のx座標を入力してください")
y2 = InputBox("2番目の点のy座標を入力してください")
x3 = InputBox("3番目の点のx座標を入力してください")
y3 = InputBox("3番目の点のy座標を入力してください")
'円の中心と半径を計算
a = x1 - x2
b = y1 - y2
c = x1 - x3
d = y1 - y3
e = (x1 * x1 - x2 * x2 + y1 * y1 - y2 * y2) / 2
f = (x1 * x1 - x3 * x3 + y1 * y1 - y3 * y3) / 2
s = (d * e - b * f) / (a * d - b * c)
t = (a * f - c * e) / (a * d - b * c)
xCenter = s
yCenter = t
radius = Sqr((x1 - xCenter) ^ 2 + (y1 - yCenter) ^ 2)
'結果を表示
Msg = "中心座標: (" & xCenter & ", " & yCenter & ")" & vbNewLine
Msg = Msg & "半径: " & radius
MsgBox Msg
'円を描画
With ActiveSheet.Shapes.AddShape(msoShapeOval, xCenter - radius, yCenter - radius, radius * 2, radius * 2)
.Line.Weight = 1
End With
End Sub