【宝探しゲーム】RndやCellsを使って宝箱をセル上にランダムに設置するVBAを作る!

当ページのリンクには広告が含まれています。

Excelで新しいゲームを作ります。

今回作るのは・・・・・

宝探しゲーム!

今回からたぶん3回ぐらいで完成させようと思います。

宝探しゲームを作る過程で、VBAを使ってマクロを作るので、VBAを知りたいという方にも有益な内容になるはずです。

この記事では、VBAの中でもCellsRndをを使います。

この記事を読むと、宝探しゲームを作れるだけでなく、CellsとRndの機能や使い方も知れるので、ぜひ最後までご覧ください。

「よーーーし、マクロ作るぞ!!!!!」

・・・・・5分後・・・・・

「マクロ、どう書けばいいんだ?(涙目)」

こんなことありませんか?

VBAで作るExcelマクロはとても便利で、いろいろなことができます。

でも、Excelを勉強するのにスクールに通うのは抵抗がありますよね?

めんどくさいし、お金もない・・・

独学するにも何から始めていいかわからない。

そんな時はUdemyを活用しましょう!

Udemyなら

  • 買い切りの動画教材でExcelマクロを学べる
  • スマホのアプリもあるから、どこでも勉強できる
  • 何より、スクールに通うより圧倒的に安い!!

特に「【Excel VBA】きちんと理解したい人のためのExcelマクロ入門」という教材がおすすめ!

マクロエディタを初めて開く人でもマクロを理解することができます。

Excelマクロを学びたいと思ったときが絶好のチャンスです!!

↓のボタンから教材をゲットしましょう!!

目次

宝探しゲームを作ります。

今回作る『宝探しゲーム』がどんなものか紹介します。

エクセルのシート状に5×5のボードの四角のボタンを順番に押して、消していきます。

そして、ボタンを消したときに宝箱が出た方が勝ちです。

このゲームには、主に3つの処理が必要になります。

  • 宝箱をボード上にランダムに配置する
  • 押したら消えるボタンをボード上に配置する
  • もう一度ゲームをする際に、①、②を実施する

今回は『①宝箱をボード上にランダムに配置する』処理を作ります。

STEP0.まずはマクロを作る準備をする

マクロを保存するには通常のxlsx形式のExcelファイルではなく、xlsm形式のExcelファイルを用意する必要があります。

また、開発メニューを表示したり、マクロのセキュリティの設定をする必要があります。

↓の記事に詳しくまとめてあるので、準備の方法を知りたいという方は見てみてください。

あわせて読みたい
【Excelマクロ】まずはゲームを作る準備!Excelマクロの表示&設定方法を紹介 当ブログでは、Excelでゲームを作る方法を紹介しています。 関数だけでゲームができることもありますが、Excelマクロが必要なこともあります。 しかし、Excelの初期設定...

STEP1.ボードと宝箱を用意する

マクロを作る前に以下の2つのことをします。

  • ボードを作る
  • 宝箱のイラストを用意する

それぞれ紹介します。

ボードを作る

Sheet1に宝探しゲームのボード作ります。作り方は以下の通りです。

STEP
Sheet1のセルを全選択
STEP
セルの幅と高さを100ピクセルにする
STEP
B2~F6のセルを選択し、罫線の『格子』を選ぶ
STEP
ボードが完成

宝箱のイラストを用意する

続いて、宝箱のイラストを用意します。

STEP
いらすとやで宝箱のイラストをゲット

いらすとやでなくても大丈夫です。

自分の好きな宝箱をゲットしてください。

STEP
Sheet2のA1セルの幅と高さを100ピクセルにする

宝箱のイラストを貼るセルです。

ボードの1マスのサイズと合わせるために幅と高さを調節します。

STEP
画像をA1セルに挿入する

『画像>セルに配置>このデバイス』から入手した宝箱の画像ファイルを選択し、挿入します。

STEP
A1セルに宝箱のイラストが表示されればOK

Sheet1とSheet2が↓こんな感じにできていたらOK

使うのは主にRndとCellsの2つ

ここでマクロで使うVBAの関数とプロパティを紹介します。

今回メインで使うのは以下の2つ

  • Rnd関数
  • Cellsプロパティ

それぞれ紹介します。

Rndは乱数を発生させる

Rnd関数は、0以上1未満の乱数を生成する関数です。

Excelの関数で使う『=RAND()』と同じ。

どんな書き方をするというとこんな感じです。

Sub 乱数()
 MsgBox “Rnd関数の値=” & Rnd
End Sub

このコードを実行するとこんな感じになります。

実行するたびに違う値が生成されます。

応用で、整数の乱数を生成したい場合は、↓のような書き方で実現できます。

Sub 整数の乱数()
 MsgBox “整数の乱数の値=” & Int(Rnd * 10)
End Sub

Rnd関数で生成した値を10倍にし、Int関数で小数点以下を切り捨てます。

これを実行するとこんな感じ

1~9までの整数がランダムに生成されます。

2桁の乱数が欲しければ、Rnd関数の値を100倍にするなど工夫すると、自分が求める桁の乱数を生成できます。

Cellsはセルが持つ値や書式を操作する

Cellsは、VBAのプロパティに分類されます。

「プロパティって何?」って思った方も多いと思いますが、とりあえずそういうものだと思ってください。

Cellsは何をするかというと、セルに値を入力したり、セルの値を取得したりすることができます。

例えば、こんな感じ

Sub セルの値を取得()
 MsgBox "セルA1の値は: " & Cells(1, 1).Value
End Sub

Cells(1,1).Valueで、A1セルの値を取得します。

.Valueの他にもいろいろ使うことが可能です。

追い追い紹介できればと思います。

宝箱をランダムに表示するマクロを作る

RndやCellsの特徴を理解出来たら、実際にマクロを作っていきます。

開発メニューの『マクロ』をクリックして、マクロ名に『宝探し』と入力します。

『作成』ボタンを押すと編集画面が開きます。

今回作成したマクロは下記の通りです。

Sub 宝探し()

    宝の配置

End Sub
Private Sub 宝の配置()
    
    '変数の宣言
    Dim rng As Range
    Dim selectedCell As Range
    Dim valueToInput As Variant
    Dim shp As Shape
    
    ' ボード上の画像を削除する(ボードの初期化)
    For Each shp In Worksheets("Sheet1").Shapes
        If Not Intersect(shp.TopLeftCell, Worksheets("Sheet1").Range("B2:F6")) Is Nothing Then
            shp.Delete
        End If
    Next shp
    
    ' ボード(Sheet1のB2:F6)の範囲を取得
    Set rng = Sheets("Sheet1").Range("B2:F6")
    
    ' ランダムで1つのセルを選択
    Set selectedCell = rng.Cells(Int((rng.Cells.Count * Rnd) + 1))

    ' Sheet2のA1にある画像をコピー
    Sheets("Sheet2").Range("A1").CopyPicture
    
    ' 選択されたセルにSheet2のA1の値を入力
    With selectedCell
        .Select
        .PasteSpecial
    End With
    
    ' クリップボードをクリア
    Application.CutCopyMode = False

End Sub

メインの処理『宝探し』から、『宝の配置』の処理を呼び出す形にしました。

今後、処理を追加し、メインから呼び出すようにしていきます。

その方が、コード読んでいてわかりやすいと思うので。

それでは、今回作った処理『宝の配置』の中身を紹介します。

処理1:ボード上の画像を削除する

    ' ボード上の画像を削除する(ボードの初期化)
    For Each shp In Worksheets("Sheet1").Shapes
        If Not Intersect(shp.TopLeftCell, Worksheets("Sheet1").Range("B2:F6")) Is Nothing Then
            shp.Delete
        End If
    Next shp

まずは、ボードを初期化するために、ボード上の画像を削除します。

そうしないと、ゲームを繰り返すうちに宝がどんどん増えていきます。

For Each shp In Worksheets("Sheet1").Shapes
~~~
Next shp

↑の行で、ワークシート「Sheet1」内のすべての図形(シェイプ)に対して繰り返し実行します。

shpは各図形を表す変数です。

If Not Intersect(shp.TopLeftCell, Worksheets("Sheet1").Range("B2:F6")) Is Nothing Then
  shp.Delete
End If

↑のVBAは、「もし図形の左上のセルがB2~F6のどれかではなければ何もしない。そうでなければ、図形を削除する」を意味します。

要するに、「ボード上の図形を消しますよ」ということです。

以上の処理で宝探しゲームのボードを初期化します。

処理2:ボード内のセルをランダムに選ぶ

    ' ボード(Sheet1のB2:F6)の範囲を取得
    Set rng = Sheets("Sheet1").Range("B2:F6")
    
    ' ランダムで1つのセルを選択
    Set selectedCell = rng.Cells(Int((rng.Cells.Count * Rnd) + 1))

ボードの初期化が終わったら、宝箱を表示するセルを選びます。

Set rng = Sheets("Sheet1").Range("B2:F6")

↑の処理で、ボードの範囲を認識します。

『Range』は、範囲を取得するためのコマンドです。

Set selectedCell = rng.Cells(Int((rng.Cells.Count * Rnd) + 1))

↑の処理で1つのセルに決めます。

特に『Int((rng.Cells.Count * Rnd) + 1)』の部分がややこしいですよね。

順を追って説明します。

まず、前の行の『.Range()』でボードの範囲を取得した際に、セルには↓のように1~25の番号が振られています。

『rng.Cells(1)』や『rng.Cells(24)』のように『.Cells()』のカッコ内に1~25の数字を入れるとセルが特定されます。

『.Cells()』のカッコ内の『Int()』はカッコ内の値を整数で返すメソッドです。

この『Int()』で1~25の数字を返すことができれば、ボード上のセルを正しく指定することができます。

最後に『(rng.Cells.Count * Rnd) + 1』の部分です。

『rng.Cells.Count』は範囲内のセルの個数を表します。今回の場合は、『25』です。

Rndは、先述のように0以上1未満の乱数を発生させる関数です。

よって、『25×0以上1未満の乱数』を計算すると0以上25未満の値が求まります。

一見、『Int(rng.Cells.Count * Rnd)』でも良さそうですが、これだと算出される値が『0~24』となってしまい、ボードの範囲とズレてしまいます。

そのため、『(rng.Cells.Count * Rnd) + 1』のように『+1』をすることで、ボードの範囲と算出される値の範囲を一致させることが必要です。

ここまでで、ボードのどこに宝箱をコピーするかが決まりました。

処理3:選択したセルに宝箱のイラストを貼る

    ' Sheet2のA1にある画像をコピー
    Sheets("Sheet2").Range("A1").CopyPicture
    
    ' 選択されたセルにSheet2のA1の値を入力
    With selectedCell
        .Select
        .PasteSpecial
    End With
    
    ' クリップボードをクリア
    Application.CutCopyMode = False

最後にSheet2の宝箱のイラストをコピーして、Sheet1のボード上に貼り付ける処理です。

Sheets("Sheet2").Range("A1").CopyPicture

↑の行でSheet2のA1セルにある画像(宝箱のイラスト)をコピーします。

    With selectedCell
        .Select
        .PasteSpecial
    End With

↑の処理で、処理2で特定したボード上のセルを選択して、コピーしたイラストを貼り付けます。

『With~』は同じセルに対して、複数の処理をするときに使うコマンドです。

今回の場合は、特定したボード上のセルに対して『選択して(.Select)』『イラストを貼り付け(.PasteSpecial)』ます。

Application.CutCopyMode = False

↑でクリップボードにコピーしてある宝箱のイラストを削除します。

以上で『ボード上の特定のセルに宝箱のイラストを貼り付ける』処理の解説は終わりです。

RndとCellをゲーム作りに活用する方法を紹介!宝箱をランダムに表示させよう!(まとめ)

今回は、宝探しゲーム作りのステップ1として、『ボード上に宝箱をランダムに出現させる』ためのマクロ作りました。

実際に作ったプログラムは以下の通りです。

Sub 宝探し()

    宝の配置

End Sub
Private Sub 宝の配置()
    
    '変数の宣言
    Dim rng As Range
    Dim selectedCell As Range
    Dim valueToInput As Variant
    Dim shp As Shape
    
    ' ボード上の画像を削除する(ボードの初期化)
    For Each shp In Worksheets("Sheet1").Shapes
        If Not Intersect(shp.TopLeftCell, Worksheets("Sheet1").Range("B2:F6")) Is Nothing Then
            shp.Delete
        End If
    Next shp
    
    ' ボード(Sheet1のB2:F6)の範囲を取得
    Set rng = Sheets("Sheet1").Range("B2:F6")
    
    ' ランダムで1つのセルを選択
    Set selectedCell = rng.Cells(Int((rng.Cells.Count * Rnd) + 1))

    ' Sheet2のA1にある画像をコピー
    Sheets("Sheet2").Range("A1").CopyPicture
    
    ' 選択されたセルにSheet2のA1の値を入力
    With selectedCell
        .Select
        .PasteSpecial
    End With
    
    ' クリップボードをクリア
    Application.CutCopyMode = False

End Sub

RndやCellsが何度か出てきました。

ただのゲーム作りではなく、それぞれの処理内容を理解するいい機会になったら幸いです。

次回は、『クリックしたら消えるボタンをボード上に表示する』マクロを作りたいと思います。

では、今回はここまでです。

「よーーーし、マクロ作るぞ!!!!!」

・・・・・5分後・・・・・

「マクロ、どう書けばいいんだ?(涙目)」

こんなことありませんか?

VBAで作るExcelマクロはとても便利で、いろいろなことができます。

でも、Excelを勉強するのにスクールに通うのは抵抗がありますよね?

めんどくさいし、お金もない・・・

独学するにも何から始めていいかわからない。

そんな時はUdemyを活用しましょう!

Udemyなら

  • 買い切りの動画教材でExcelマクロを学べる
  • スマホのアプリもあるから、どこでも勉強できる
  • 何より、スクールに通うより圧倒的に安い!!

特に「【Excel VBA】きちんと理解したい人のためのExcelマクロ入門」という教材がおすすめ!

マクロエディタを初めて開く人でもマクロを理解することができます。

Excelマクロを学びたいと思ったときが絶好のチャンスです!!

↓のボタンから教材をゲットしましょう!!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次