CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

現在選択しているセル範囲をPDFデータで保存するマクロ

2023-11-28 19:40:25 | VBA
PDFビューワにCopilotのアドオンがついていたので、試してみた。

'■現在選択しているセル範囲をPDFデータで保存する

Public Sub call_RangeSavePDF()

Dim fPath As String

Dim fName As String

Dim rng As Range

'■現在開いているブック情報をファイル名にするため、変数に格納

fPath = ActiveWorkbook.Path & "\"

fName = Left(ActiveSheet.Name, InStrRev(ActiveWorkbook.Name, "."))

Application.DisplayAlerts = False

'■現在選択しているセル情報をrngに格納

Set rng = Selection

'■PDF出力(ActiveWorkBookと同じ階層にPDF保存)

rng.ExportAsFixedFormat Type:=xlTypePDF, Filename:=fPath & fName & ".pdf"

Application.DisplayAlerts = True

End Sub


VBAで簡易CADチャットボットを作った

2023-05-13 20:12:31 | VBA

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の勝ち。


VBAからPythonを呼び出す方法をbardに訊いてみた

2023-05-13 10:44:31 | VBA
VBAのソースコード内でPython言語を呼び出す方法は?

VBA は Microsoft Office アプリケーション用に開発されたマクロ言語です。 Python は、データ分析、機械学習、Web 開発など、さまざまなタスクに使用できる汎用プログラミング言語です。 VBA から Python を呼び出すには、xlwings ライブラリを使用できます。 xlwings は、VBA から Python コードを簡単に実行できるようにする COM アドインです。

xlwings を使用するには、まずライブラリをインストールする必要があります。 Windows の場合は、Microsoft Visual Studio からインストールできます。 macOS の場合は、Homebrew からインストールできます。

ライブラリをインストールしたら、VBA プロジェクトで参照する必要があります。これを行うには、プロジェクトの参照設定ウィンドウを開き、xlwings.xlam ライブラリを選択します。

ライブラリを参照したら、VBA コードで Python コードを呼び出すことができます。これを行うには、RunPython 関数を使用します。RunPython 関数には、呼び出す Python コードの文字列を引数として渡します。

たとえば、次の VBA コードは、Python の組み込みの print() 関数を呼び出します。

Sub CallPython()

Dim result As String
result = RunPython("print('Hello, world!')")

MsgBox result

End Sub

このコードを実行すると、次のメッセージボックスが表示されます。

Hello, world!

xlwings は、VBA から Python を呼び出すための強力なツールです。データ分析、機械学習、Web 開発など、さまざまなタスクに使用できます。

なるほど。んじゃやってみるわ。








VBAでチャットボットを作ってみた

2023-05-12 21:17:06 | VBA

最近発表された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

結果はバッチリ!

次はセレクトボックスを表示させ、やりたい操作を選ばせて、数字を入力する形式にしてみたい。


プロシージャとは何ぞや?

2023-05-07 10:48:19 | VBA
Wikipediaより引用。
プロシージャ (procedure)とは、プログラミングにおいて複数の処理を一つにまとめたものをいう。手続きとするのが定訳である。一連の処理を意味を持った一まとまりにすることで、再利用性が高まり、プログラム中に繰り返して現れる処理を1ヶ所で記述でき、プログラムの保守、管理を容易にする。

繰り返し利用されることから、ルーチンとも言う。呼び出し関係は通常階層構造をなし、その最上位にある、プログラム全体のエントリーポイントを含むルーチンをメインルーチン、呼び出されるものをサブルーチンと言う。また、関数と呼ばれることもある(通常、数学における関数とは違ったものであるので、注意が必要である)。

プログラミング言語により、プロシージャのような構文の分類や呼称はさまざまである。詳細はサブルーチンの記事を参照のこと。





記録したマクロのソースコードを編集するには?

2023-05-03 07:48:30 | VBA

記録したマクロを編集する ~Excel2010 マクロ講座

記録したマクロを編集する ~Excel2010 マクロ講座

NAMAE~ExcelVBA マクロ講座

なんだ!かんたん!Excel塾

Exelには手動での操作をマクロとして記録し、その操作を自動化できる便利な機能がある。

記録したマクロはVBAプログラムとして保存されているのではないか?と思ってググった結果がこのサイト。

まさにVBAのソースコードとして記録され、保存されていたのだから、ソースコードを見れて編集もできて当たり前だ。

これぞプチ自動化と言える。Exelの自動化においてはUIPATHなどのRPAは出る幕無しと言った状況かと思われる。

Pythonを使ってExelを自動化する方法ももちろんあるが、マクロの記録より簡単で使いやすいものはないだろう。

ちなみにAutocadやCATIAにもマクロの記録というボタンがあり、試してみたが、CATIAの方では全く使い物にならなかった。

VBAでLine風chatbotを作る

2023-04-22 09:32:11 | VBA
あなたは一流のVBAエンジニアです。VBAでLine 風のchatbotを作るプログラムを書いて

はい、Line風のチャットボットをVBAで作成することができます。以下は、基本的なスケルトンコードです。

Sub LineChatbot()

Dim message As String
' メッセージの受信をシミュレート
message = "こんにちは!"
' ユーザーからのメッセージを受け取る
Do While True
' メッセージの受信をシミュレート
message = InputBox("ユーザーからのメッセージを入力してください。", "Lineチャットボット")
' ユーザーが何も入力しなかった場合は、ループを抜ける
If message = "" Then
Exit Do
End If
' チャットボットの応答を作成する
Dim response As String
response = "「" & message & "」ですね。"
' チャットボットの応答を表示する
MsgBox response, vbOKOnly, "Lineチャットボット"
Loop
End Sub
このコードは、メッセージの受信をシミュレートし、ユーザーが何らかのメッセージを入力すると、チャットボットが応答します。ユーザーが何も入力しない場合は、ループが終了します。

このスケルトンコードを拡張して、実際のチャットボット機能を実装できます。たとえば、特定の単語に反応するように条件分岐を追加したり、外部APIを呼び出して、天気予報や最新ニュースを取得するようにしたりすることができます。

任意の3点を通る円を描くVBAソースコード

2023-03-25 15:14:22 | VBA

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


始点と終点の座標を入力する方式で直線を描画するVBAプログラムを実行してみた結果

2023-03-22 13:54:22 | VBA
ChatGPTの回答の通りにやってみた。
【始点と終点の座標を入力する方式で直線を描画するVBAプログラム】
 
Sub DrawLine()
 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 ' 線の太さを指定
 End With
End Sub
 
 
この通り、ExelのマクロからViualBasicEditorを開き、コピペで入力して実行してみた。
 
入力ボックスが現れ、始点のX座標の入力を求めてきたので100と入力。
次に同様に始点のY座標を入力するよう求められた。
以下略。
最終的に無事ワークシートに斜線が描かれた。
 
※ChatGPT Good Job!!!