タイトルの通り、最近プログラミングの勉強が必要であると感じることが多い。
VVVFインバーターを動かす際もArduinoを用いて制御信号の生成を行っている。
それはまた後日更新するが、VBAについても業務の効率化のためには必要な知識の一つであり、こと、ハード屋なんかは取ったデータがCSVで吐き出されたりしてグラフの描画もしくはソフトウェアの通信ログ解析などエクセルを使う機会が多い。
このような単純作業を効率化するにはVBAもいいがPythonも効果的という。
しかしいざPythonを動かそうと思っても導入から躓いておりすぐに取り掛かれない。(スペックの高いPC環境の整備が必要)
VBAならリソースをそのまま使えるしまずはそういったところから取り組むのもありなのでは、と考えたりして手が動かないこと幾日。。。
このように日常的にエクセルを使っていてなんだが、結構パワープレイでコピペや関数を駆使し今までやってきた。
しかしいつまでも同じことを繰り返し続けるような進歩の無さには反省するべきで、いままで理解の遠く及ばなかったVBAについても取り組むことにした。
いつもそうなのだが、目的や明確な成果物を用意しないまま学習に取り組むと長く続かない傾向にある。
なのでできるだけ楽しく取り組むためにいい教材はないものかと探していた矢先、下記のURLにたどり着いた。
情報授業実践記録 (shinko-keirin.co.jp)
ここでタイトル回収する。
そう、エクセルのマクロを使ってブロック崩しができるというのである。
噂にはSTG(シューティングゲーム)も作れるとかなんとか聞いたことはあった。
しかしブロック崩しはかなり初歩的なプログラムで作れるという。
とてもいい教材だと思ったし、人に見せたときのインパクトも結構あるのでは?
ということで早速作ることにした。
上記URLに掲載されているプログラム文は古いエクセルのバージョンになっているため、2022年現在のエクセルではそのまま張り付けただけではうまく動作してくれなかった。
従って、上記URLの記事の内容を読みながらうまくいかない部分をググりつつ何とか動かすことに成功したので進捗をアップする。
グラフの体裁が壊滅的なのはあまり触れてほしくないところである。
■サンプルプログラム
Declare PtrSafe Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Integer
Dim bContine As Boolean
Dim vx As Single
Dim vy As Single
Dim dt As Single
Dim x As Single
Dim y As Single
Dim Rk As Single
Dim n As Integer
Dim b_px(100) As Single
Dim b_py(100) As Single
Dim b_vx(100) As Single
Dim b_vy(100) As Single
Sub Ball()
dt = Cells(9, 3)
vx = Cells(6, 3)
vy = Cells(6, 4)
x = Cells(3, 7)
y = Cells(3, 8)
Do
Calculate
x = x + vx * dt
y = y + vy * dt
Cells(3, 3) = x
Cells(3, 4) = y
Call ボールの壁反射
Call ブロック崩し
Call ラケット
DoEvents
Loop
End Sub
Private Sub ボールの壁反射()
Select Case Cells(3, 3).Value
Case Is >= 9.5
vx = -1 * vx
Case Is <= 0.35
vx = -1 * vx
End Select
Select Case Cells(3, 4).Value
Case Is >= 9.5
vy = -1 * vy
Case Is <= 0.35
vy = 0
End Select
End Sub
Private Sub ブロック崩し()
For n = 0 To 17
b_px(n) = Cells(6 + n, 7)
b_py(n) = Cells(6 + n, 8)
If y > b_py(n) - 0.75 And y < b_py(n) + 0.75 Then
If x < b_px(n) + 0.45 And x > b_px(n) - 0.45 Then
vy = -1 * vy
Cells(6 + n, 8) = 12
Else
End If
Else
End If
If x > b_px(n) - 0.75 And x < b_px(n) + 0.75 Then
If y < b_py(n) + 0.45 And y > b_py(n) - 0.45 Then
vx = -1 * vx
Cells(6 + n, 8) = 12
Else
End If
Else
End If
Next n
End Sub
Private Sub ラケット()
If GetAsyncKeyState(49) < 0 Then
Rk = Rk - 0.1
End If
If GetAsyncKeyState(48) < 0 Then
Rk = Rk + 0.1
End If
Cells(3, 11) = Rk
If Cells(3, 4) > 1.5 Then
ElseIf Cells(3, 3) > Rk + 1 Then
ElseIf Cells(3, 3) < Rk - 1 Then
Else
vy = -1 * vy
End If
End Sub