VBAでブロック崩し

タイトルの通り、最近プログラミングの勉強が必要であると感じることが多い。
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