はじめに
Excel vba でオセロを作成しましたので、その機能の一部である「オセロの碁盤に石を置く方法」を Excel vba で実装する方法をご紹介します。
※ 作成した Excel オセロについては下記リンクを確認してください。
今回紹介する方法についてですが、Excel vba が下記のように動作することを前提とします。
- オセロの石(黒、白の石ともに)を画像とする
- シートに描いている「オセロ盤」に置く
- セルを選択し、キーボード入力(「Enter キー」を押下)からオセロの石(の画像)を置く
「オセロの石を置く」は「石の画像をセル上に配置する」
「オセロの石を置く 」= 「(オセロの石の)画像をあるセル番号に配置する」と考えます。
今回、キーボード入力から画像を配置するように動作させるため、vba では下記のステップを行います。
- キーボード入力のイベントを検知
- イベント後、オセロの石の画像の情報(高さと幅)を配列に格納し選択中のセルに画像をペースト
キーボード入力のイベントを検知
ソースコード(キーボード入力検知)
1 2 3 4 5 6 7 8 9 |
Public Const OSERO_SHEET As String = "オセロ" ' イベント設定 Private Sub setEvent() Worksheets(OSERO_SHEEAT).OnSheetActivate = "playGame" Worksheets(OSERO_SHEET).OnSheetDeactivate = "finGame" Application.OnKey "{ENTER}", "playGame" Application.OnKey "~", "playGame" End Sub |
解説
OnSheetActivate はシートがアクティブな状態になったときに、指定したプロシージャを自動実行してくれます。
逆に、OnSheetDeactivate はシートが非アクティブな状態になったときに、指定したプロシージャを自動実行してくれます。
OnSheetActivate = "playGame" とすると、シートがアクティブな状態がときに playGame プロシージャが自動実行されます。
しかし、これだけではキーボードイベントが検知できません。ですので、Application.OnKey "{ENTER}", "playGame" とします。
Application.OnKey は、指定したキー(「Enter」 キー)のイベントを検知すると、指定したプロシージャ(playGame)を自動実行してくれます。
※ 「Enter」以外のキーボード入力のイベントを取得したい場合はこちらを参考にしてください。
これによりシートがアクティブな状態のときに「Enter」キーが入力されると playGame プロシージャ が自動実行されるということです。
- playGame : オセロを開始するプロシージャ
- finGame : オセロを終了するプロシージャ
補足
OnSheetActivate で自動実行させるプロシージャ playGame を「オセロの石を置く」プロシージャではなく、「オセロを開始するプロシージャ」した理由は、オセロの石を置く前にいろいろと処理をしたかったからです。
- オセロを置くセル番号(行と列番号)を取得
- オセロの石が置くセルがルール上置ける箇所かをチェック(※ 今回は省略)
ソースコード(playGame プロシージャ)
1 2 3 4 5 6 7 8 |
' オセロの駒を配置 Private Sub playGame() Dim x As Long, y As Long x = ActiveCell.Row ' 選択中のセルの行番号 y = ActiveCell.Column ' 選択中のセルの列番号 ' ...... <省略> ..... Call pastePic(MYTURN, y - Y_PLACE, x - X_PLACE) ' オセロの石を置く End Sub |
オセロの石の画像の情報(高さと幅)を配列に格納し選択中のセルに画像をペースト
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Public Const OSERO_SHEET As String = "オセロ" Public Const PICTURE_SHEET As String = "画像" ' ...... <省略> ..... ' 石の挿入 Dim imgName() As Variant ReDim imgName(1 To Worksheets(PICTURE_SHEET).Shapes.Count) For i = 1 To Worksheets(PICTURE_SHEET).Shapes.Count imgName(i) = Worksheets(PICTURE_SHEET).Shapes(i).Name Height_y = Worksheets(PICTURE_SHEET).Shapes(imgName(i)).Height Width_x = Worksheets(PICTURE_SHEET).Shapes(imgName(i)).Width Worksheets(PICTURE_SHEET).Shapes(imgName(i)).Name = "Fig" & i Worksheets(PICTURE_SHEET).Shapes("Fig" & i).Copy Worksheets(OSERO_SHEET).Cells(Row + X_PLACE, Col + Y_PLACE).Select Worksheets(OSERO_SHEET).PASTE With Worksheets(OSERO_SHEET).Shapes("Fig" & i) .Height = Height_y .Width = Width_x End With End If Next i ' ...... <省略> ..... |
解説
難しく見えますがやっていることは単純です。「画像」シートに下記のようにオセロの石の画像を貼り付いているものとします。
そして、その画像の「名前、幅、高さ」などの情報を動的配列 imgName() に格納します。
わざわざこれらの情報を取得した理由は、画像をそのままの大きさで「オセロ」シートに貼り付けたかったからです。
そして、その画像をコピー(Copy)し、動的配列 imgName()の情報(名前、幅、高さ)をもとに「オセロ」シートに貼り付け(Paste)するだけです。
- シート上の画像の情報を取得し、動的配列に格納
- 画像をコピーして、配列の情報をもとにペースト
まとめ
いかがでしょうか?難しそうにみえてやっていること自体単純です。
- キーボード入力のイベントを検知 → OnSheetActivate と Application.OnKey でできる!
- シート上の画像の情報を取得し、動的配列に格納 → 画像情報を取得して配列に格納するだけ!
- 画像をコピーして、配列の情報をもとにペースト → Copy と Paste でできる!
二つ目の「シート上の画像の情報を取得し、動的配列に格納」だけ難しく見えるかもしれませんが、
画像をそのままの大きさで「オセロ」シートに貼り付けたかったからやっただけで、不要の人はやる必要は特にありません。
もし作成したオセロについて気になる方は下記リンクを確認ください!