<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>神経衰弱 - プログラミングで遊ブログ</title>
	<atom:link href="https://lemon818.com/tag/%E7%A5%9E%E7%B5%8C%E8%A1%B0%E5%BC%B1/feed/" rel="self" type="application/rss+xml" />
	<link>https://lemon818.com</link>
	<description>現役システムエンジニアが趣味でプログラミングする自由気ままなブログ</description>
	<lastBuildDate>Sun, 27 Oct 2019 06:28:21 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.4</generator>
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>	<item>
		<title>エクセルで遊べる「神経衰弱」の作り方【Vba ゲーム】</title>
		<link>https://lemon818.com/concentration_game/</link>
		
		<dc:creator><![CDATA[Take]]></dc:creator>
		<pubDate>Tue, 08 Oct 2019 13:26:27 +0000</pubDate>
				<category><![CDATA[Excel]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[自作ゲーム]]></category>
		<category><![CDATA[pickup]]></category>
		<category><![CDATA[vba]]></category>
		<category><![CDATA[エクセル]]></category>
		<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[神経衰弱]]></category>
		<guid isPermaLink="false">https://lemon818.com/?p=4469</guid>

					<description><![CDATA[はじめに &#160; どーも 暇人プログラマーTakeです。 今回も暇すぎて、Excel でトランプを使った「神経衰弱」を作ってみました！！ &#160; &#160; 作成時間はおよそ３時間くらいでした！ わたしは要…]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>&nbsp;</p>
<p>どーも 暇人プログラマーTakeです。</p>
<p>今回も暇すぎて、Excel で<strong>トランプを使った</strong>「<span style="color: #ff0000;"><strong>神経衰弱</strong></span>」を作ってみました！！</p>
<p>&nbsp;</p>
<p><img fetchpriority="high" decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei.gif" alt="" width="716" height="414" class="aligncenter wp-image-4530" /></p>
<p>&nbsp;</p>
<p>作成時間はおよそ３時間くらいでした！</p>
<p>わたしは要領が悪いので、作成に結構時間がかかってしまいました。。。</p>
<p>たぶんプログラミングが得意な人はもっと早くできると思います。</p>
<p>&nbsp;</p>
<p>この記事では、私が作成した「<span style="color: #ff0000;"><strong>神経衰弱</strong></span>」の<strong>操作方法</strong>と<strong>作成方法</strong>についてご紹介します～！</p>
<p>&nbsp;</p>
<h2>操作方法</h2>
<p>&nbsp;</p>
<p><img decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_2.png" alt="" width="1433" height="219" class="aligncenter size-full wp-image-4539" srcset="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_2.png 1433w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_2-300x46.png 300w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_2-768x117.png 768w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_2-1024x156.png 1024w" sizes="(max-width: 1433px) 100vw, 1433px" /></p>
<p>&nbsp;</p>
<p>操作方法は下記手順です。</p>
<p>&nbsp;</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">操作手順</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>数字の種類（２～１３）を設定します</li>
<li>マークの種類（<span style="color: #ff0000;">&#x2665;</span> &#x2660; <span style="color: #ff0000;">&#x2666;</span> &#x2663;）を設定します。</li>
<li>「START」押下します。すると、「ステータス」がゲーム中に変更されます。</li>
<li>セル上に赤いセルがでてきますので、どれかを二枚押します。</li>
<li>二枚同じ<span style="color: #ff0000;"><strong>数字</strong></span>ならカードの表示が消え、<strong><span style="color: #ff0000;">獲得枚数</span>が追加されます。</strong></li>
<li>全部カードの表示が消えれば、ゲーム終了です。</li>
</ol>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<p>簡単に言うと、設定することして、ボタンを押下すれば、</p>
<p>あとは普通の「<span style="color: #ff0000;"><strong>神経衰弱</strong></span>」です。</p>
<p>&nbsp;</p>
<h3><strong>数字の種類（２～１３）</strong></h3>
<p>&nbsp;</p>
<p>ゲームに使う<strong>トランプの数字の種類</strong>のことを指します。</p>
<p>たとえば、数字の種類（２～１３）＝ 3 と設定すれば、</p>
<p>トランプの数字（2 ~10、J、Q、K）のうち3種類の数字（たとえば、２、４、Jの3種類）</p>
<p>を使うように設定するということです（この数値はランダムで決定します）。</p>
<p>&nbsp;</p>
<h3>マークの種類（<span style="color: #ff0000;">&#x2665;</span> &#x2660; <span style="color: #ff0000;">&#x2666;</span> &#x2663;）</h3>
<p>&nbsp;</p>
<p>ゲームに使うトランプの<strong>マークの種類</strong>のことです。</p>
<p>これは、「2」か「4」のみ設定できるのですが、</p>
<p>「2」と設定すると、<span style="color: #ff0000;">&#x2665;</span> &#x2660;の2種類、「4」と設定すると、<span style="color: #ff0000;">&#x2665;</span> &#x2660; <span style="color: #ff0000;">&#x2666;</span> &#x2663;の4種類が</p>
<p>神経衰弱のゲーム内で使用されるということです。</p>
<p>&nbsp;</p>
<h3>配置されるカードの枚数について</h3>
<p>&nbsp;</p>
<p>また配置されるカードの枚数ですが、</p>
<p>数字の種類（２～１３）×記号の種類（&#x2665; &#x2660; &#x2666; &#x2663;）の枚数になります。</p>
<p>つまり、最大が１3×4枚＝52 枚となります。</p>
<p>&nbsp;</p>
<h3>「START」と「FIN」ボタンについて</h3>
<p>&nbsp;</p>
<p><img decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_3.png" alt="" width="883" height="249" class="aligncenter wp-image-4541" srcset="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_3.png 1375w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_3-300x84.png 300w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_3-768x216.png 768w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_3-1024x288.png 1024w" sizes="(max-width: 883px) 100vw, 883px" /></p>
<p>&nbsp;</p>
<p>「START」ボタンを押下することで、ゲームが開始されます。</p>
<p>その際に「ステータス」という箇所が「ゲーム中」に変更されるのが確認できます。</p>
<p>また、トランプが表示されることが確認でき、押下も可能です（画面<strong><span style="color: #ff0000;">赤色</span></strong>のセルの箇所）。</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_5-1.png" alt="" width="1370" height="400" class="aligncenter size-full wp-image-4551" srcset="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_5-1.png 1370w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_5-1-300x88.png 300w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_5-1-768x224.png 768w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_5-1-1024x299.png 1024w" sizes="auto, (max-width: 1370px) 100vw, 1370px" /></p>
<p>&nbsp;</p>
<p>「FIN」ボタンを押下することで、ゲームが終了します。</p>
<p>その際に「ステータス」という箇所が「ゲーム終了」に変更されるのが確認できます。</p>
<p>なお「ゲーム終了」状態では、カードを押下しても<span style="color: #ff0000;"><strong>反応しなくなります。</strong></span></p>
<p>&nbsp;</p>
<h2>作成方法</h2>
<p>&nbsp;</p>
<p>今回は、<span style="color: #0000ff;"><strong>Excel Vba</strong> </span>を用いて作成しました！</p>
<p>作成方法について、全部記述すると長くなるのですがご容赦ください。</p>
<p>&nbsp;</p>
<p>※ 専門的な用語もでてきますので、よくわかない方は、ページの一番下のダウンロードボタンから</p>
<p>Excel「神経衰弱」をダウンロードして遊んでみてください！</p>
<p>&nbsp;</p>
<h3>シート構成</h3>
<p>&nbsp;</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">シート構成</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>神経衰弱</li>
<li>トランプマスタ（非表示シート）</li>
<li>作業用</li>
</ol>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<p>「神経衰弱」はメインシートであるので、実施に<strong>神経衰弱を行う用のシート</strong>となります。</p>
<p>実装自体は Excel Vba で行っており、このシートはその実装結果を表示させているだけです。</p>
<p>&nbsp;</p>
<p>「トランプマスタ」は<strong>トランプに関する情報を登録するシート</strong>です。</p>
<p>具体的には、トランプで使用する数字とマークをどういうものを使用するかといったことを登録しています。</p>
<p>この値を参照してトランプとして扱う数字とマークを設定するように Excel Vba 上で動作させています。</p>
<p>&nbsp;</p>
<p>作業用シートは実際に<strong>神経衰弱のゲームを行っていく上で必要な情報を登録するシート</strong>です。</p>
<p>具体的には下記情報を登録しています。</p>
<p>&nbsp;</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">必要な情報</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>マウスからクリックされたカードの情報（カードの値とカードのセルの位置）</li>
<li>クリックされた二枚のカードが同じ数字のカードであるか判定</li>
<li>全カード枚数、残り枚数、獲得枚数</li>
<li>ゲームステータス（ゲーム中か終了か）</li>
</ol>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<h3>ソースコード</h3>
<p>&nbsp;</p>
<p>Excel Vba のソースコードについては下記のような構成になっています。</p>
<p>&nbsp;</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">ソースコード</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>Sheet1(神経衰弱)</li>
<li>STARTボタン押下処理</li>
<li>カード押下時の処理</li>
<li>ゲーム終了処理</li>
<li>定数定義</li>
<li>配置カードを設定</li>
<li>盤上へカードを配置</li>
</ol>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<h4>Sheet1(神経衰弱)</h4>
<p>&nbsp;</p>
<p>ここはシート上のクリックを検知し、その検知した結果、さまざまな処理を行う箇所です。</p>
<p>&nbsp;</p>
<p>具体的には、カードを配置する範囲のセルがクリックされている状態で</p>
<p>かつステータスが「ゲーム中」の場合にクリックが検知された場合に様々な処理を行うようにしています。</p>
<p>&nbsp;</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">様々な処理</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>カード押下前の処理</li>
<li>カード押下時の処理</li>
<li>カード押下後の処理</li>
<li>カード終了時のフラグ</li>
</ol>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<h5>ソースコード</h5>
<pre class="crayon-plain-tag">'シート操作の処理
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim NowCell
    Set NowCell = ActiveCell
    Dim GameStatus
    GameStatus = Worksheets(WORK_SHEET).Range(GAME_STATUS_PLACE).Value

    If GameStatus = MSG_GAME_START _
        And BOARD_Y &lt;= NowCell.Row And NowCell.Row &lt;= BOARD_Y + 8 _
        And BOARD_X &lt;= NowCell.Column And NowCell.Column &lt;= BOARD_X + 20 _
        And NowCell.Value &lt;&gt; "" _
    Then
        
        ' カード押下前の処理
        Call prepareCard(NowCell, NowCell.Address)
        
        ' カード押下時の処理
        Call openCard(NowCell)
        
        ' カード押下後の処理
        Call pushCard(NowCell.Value, NowCell.Address)
        
        'カード終了時のフラグ
        Call finGame
    
    End If
    
End Sub</pre>
&nbsp;</p>
<p>※ Excel シートのクリック検知について記事を以前記事を作成しましたの、よければ参考にご確認ください。</p>
<p>（わたしは以前これを知らなくてめちゃくちゃ悩んだ覚えがありますが、知っていれば超簡単です！）</p>
<div class="sc_getpost"><a class="clearfix" href="https://lemon818.com/excel-clickevent/" ><div class="sc_getpost_thumb post-box-thumbnail__wrap"><img loading="lazy" decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2018/10/5470d3ad4154f55e94757a88cf55ed08-150x150.png" width="150" height="150" alt="【Excel vba】マウスの左クリックのイベントを検知する簡単な方法"></div><div class="title">【Excel vba】マウスの左クリックのイベントを検知する簡単な方法</div><div class="date">2019.2.4</div><div class="substr">はじめに Excelで将棋のゲームをつくろうとしたときでした。 そういやどうやってマウスクリックを検知すればいいんやろう？ 私は仕事やブログでExcelを取り扱うことが多いですが、セルをクリックしたときにクリックしたことを検知しそこから処理を開始することがわかりませんでした。 いろいろ調べましたが、...</div></a></div>
<p>&nbsp;</p>
<h4>STARTボタン押下処理</h4>
<p>&nbsp;</p>
<p>ここでは、START ボタンが押下された場合の処理をまとめています。</p>
<p>私が作成したマクロは、STARTボタンを押下することでゲームが開始する仕様になっていますが、</p>
<p>ゲーム開始前の準備をここでは行うということです。</p>
<p>&nbsp;</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">ゲーム開始前の準備</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>メインシート 初期化</li>
<li>作業用シート 初期化</li>
<li>盤上にカードをセット</li>
<li>ゲームステータスの設定</li>
</ol>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<h5>ソースコード</h5>
<pre class="crayon-plain-tag">' START ボタン押下処理
Sub main()

    Application.ScreenUpdating = False
    
    Dim numArray
    
    ' メインシート 初期化
    Call setDefaultMainSheet

    ' メインシート 初期化
    Call setDefaultWorkSheet
    
    ' 配置するカードを設定
    numArray = setCard
   
    ' 盤上にカードをセット
    Call setBorad(numArray)

    ' ゲームステータス
    Worksheets(WORK_SHEET).Range(GAME_STATUS_PLACE).Value = MSG_GAME_START

    Application.ScreenUpdating = True

End Sub

' メインシート 初期化
Sub setDefaultMainSheet()

  With Worksheets(MAIN_SHEET)
    
    .Range(Cells(BOARD_Y, X + BOARD_X), Cells(BOARD_Y + 20, X + BOARD_X + 20)).Clear
  
  End With

End Sub


' 作業用シート 初期化
Sub setDefaultWorkSheet()

  With Worksheets(WORK_SHEET)
    
    .Range(FIRST_INFO_PLACE).ClearContents
    .Range(SECOND_INFO_PLACE).ClearContents
    .Range(FIRST_CELL_PLACE).ClearContents
    .Range(SECOND_CELL_PLACE).ClearContents
        
  End With

End Sub</pre>
&nbsp;</p>
<h4>カード押下時の処理</h4>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_0.png" alt="" width="759" height="389" class="aligncenter wp-image-4545" srcset="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_0.png 1001w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_0-300x154.png 300w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_0-768x394.png 768w" sizes="auto, (max-width: 759px) 100vw, 759px" /></p>
<p>&nbsp;</p>
<p>シート上の赤いセルをクリックした場合に実装される処理です。</p>
<p>Sheet1(神経衰弱)で動作を検知し、このソースコードに書かれたプロシージャが実行されるということです。</p>
<p>&nbsp;</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">ゲーム開始前の準備</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>カード押下前の処理</li>
<li>カード押下時の処理</li>
<li>カード押下後の処理</li>
</ol>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<h5>カード押下前の処理</h5>
<p>ここでは、まず一枚目と二枚目のカードが押下されたセルの情報（セルの値とセルの位置）を</p>
<p>「作業用シート」に記述します。</p>
<p>&nbsp;</p>
<h5>カード押下時の処理</h5>
<p>押下されたセルの配色を変更します。</p>
<p>赤色のカードとは、つまり赤色の背景色のセル（セル内の文字も赤色）ということですが、</p>
<p>カードが押下されたということが、カードを開く（表返す）ためにセルの背景色を<span style="color: #ff0000;"><strong>赤色</strong></span>から<strong>白色</strong>に変更しています。</p>
<p>また、この際に、<span style="color: #ff0000;">&#x2665;</span>と<span style="color: #ff0000;">&#x2666;</span>のマークを<strong><span style="color: #ff0000;">赤色</span></strong>、&#x2660;と&#x2663;を<strong>黒色</strong>にするように表示します。</p>
<p>&nbsp;</p>
<p>（<strong>下記はかなり悩んだところなんですが。。。</strong>）</p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Excel Vbaでは、</span> &#x2665;<span style="color: #000000;">&#x2660;</span></span><span style="color: #ff0000;">&#x2666;</span>&#x2663;という文字が<span style="color: #ff0000;"><strong>読み取れません。</strong></span></p>
<p>読み取ろうとすると「?」となってしまいます（Excel 2016ではそうなりました。。）。</p>
<p>ですので、今回の対策として、</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">Vbaでマークが読み取れないときの対策</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li><span style="color: #ff0000;"><span style="color: #000000;">Excel Vbaで値としては、</span>&#x2665;<span style="color: #000000;">&#x2660;</span></span><span style="color: #ff0000;">&#x2666;</span>&#x2663;ではなく別の文字に置き換える（「H」「S」「D」「C」のように）</li>
<li>表示の前に「作業用」シートに置き換える前の値を記述しておく</li>
<li>表示させるときのみ<span style="color: #ff0000;">&#x2665;<span style="color: #000000;">&#x2660;</span></span><span style="color: #ff0000;">&#x2666;</span>&#x2663;に置き換える（VLookup関数をつかって「トランプマスタ」シートから参照）</li>
<li>カードを裏返すときに、置き換える前の文字を入力するようにする</li>
</ol>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<h5>カード押下後の処理</h5>
<p>ここでは、カードが二枚クリックされたかを判定し、</p>
<p>判定した結果、同じ数字であるかそうでないかを比較し、同じならカードを削除します。</p>
<p>&nbsp;</p>
<p>判定方法は、「作業用シート」のB2、C2の値が両方空白かどうかで判定します。</p>
<p>両方とも値が含まれていれば、二枚クリックされたということです。</p>
<p>&nbsp;</p>
<p>数字の比較については、「作業用シート」のB2、C2の値を比較しますが、</p>
<p>このときカードのマーク無視するようにします（つまり一番最後の文字を無視して数字部分のみ判定します）。</p>
<p>&nbsp;</p>
<h5>ソースコード</h5>
<pre class="crayon-plain-tag">Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)

' カード押下前の処理
Sub prepareCard(ByVal CardInfo, ByVal CardAddress)

    Dim firstCard
    Dim secondCard
    Dim firstPlace
    Dim secondPlace
        
    firstCard = Worksheets(WORK_SHEET).Range(FIRST_INFO_PLACE).Value
    secondCard = Worksheets(WORK_SHEET).Range(SECOND_INFO_PLACE).Value


    ' 1枚目が押下されたとき
    If firstCard = "" Then
        
        Worksheets(WORK_SHEET).Range(FIRST_INFO_PLACE).Value = CardInfo
        Worksheets(WORK_SHEET).Range(FIRST_CELL_PLACE).Value = CardAddress
        
    ' 2枚目が押下されたとき
    ElseIf secondCard = "" Then
    
        Worksheets(WORK_SHEET).Range(SECOND_INFO_PLACE).Value = CardInfo
        Worksheets(WORK_SHEET).Range(SECOND_CELL_PLACE).Value = CardAddress

    End If

End Sub

' カード押下時の処理
Sub openCard(ByRef CellValue)

    Dim inputValue
    Dim cardValueLast
    
    inputValue = ouputVlookup(CellValue)
    cardValueLast = Right(CellValue, 1)
    
    With CellValue
        .Value = inputValue
        .Borders.LineStyle = xlContinuous
        .Borders.Color = RGB(255, 0, 0)
        .Interior.ColorIndex = CARD_COLOR_WHITE
        
        If cardValueLast = "H" Or cardValueLast = "D" Then
            .Font.ColorIndex = CARD_COLOR_RED
        Else
            .Font.ColorIndex = CARD_COLOR_BLACK
        End If

    End With
              
End Sub

' カード押下後の処理
Sub pushCard(ByVal CardInfo, ByVal CardAddress)

    Dim firstCard
    Dim secondCard
    Dim firstPlace
    Dim secondPlace
        
    firstCard = Worksheets(WORK_SHEET).Range(FIRST_INFO_PLACE).Value
    secondCard = Worksheets(WORK_SHEET).Range(SECOND_INFO_PLACE).Value

    firstPlace = Worksheets(WORK_SHEET).Range(FIRST_CELL_PLACE).Value
    secondPlace = Worksheets(WORK_SHEET).Range(SECOND_CELL_PLACE).Value

    ' 1枚目が押下されたとき
    If secondCard &lt;&gt; "" Then
            
        Sleep WAIT_TIME
        
        ' カードが同じとき
        If Worksheets(WORK_SHEET).Range(JUDGE_PLACE).Value = 1 _
        And firstPlace &lt;&gt; secondPlace _
        Then
            
            Call deleteCard(firstPlace)
            Call deleteCard(secondPlace)

        ' カードが違うとき
        Else

            Call backCard(firstPlace, firstCard)
            Call backCard(secondPlace, secondCard)
                    
        End If
        
        ' 作業用シート 初期化
        Call setDefaultWorkSheet
        
    End If
   
End Sub


' 違うカードをもとに戻す（ひっくり返す）
Private Sub backCard(ByVal CardPlace, ByVal CardValue)

    Application.ScreenUpdating = False
    
    With Worksheets(MAIN_SHEET).Range(CardPlace)
        
        .Value = CardValue
        .ColumnWidth = CARD_HEIGHT
        .RowHeight = CARD_WIDTH
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .Font.ColorIndex = CARD_COLOR_RED
        .Interior.ColorIndex = CARD_COLOR_RED
    
    End With
    
    Application.ScreenUpdating = True

End Sub

' 同じカードの場合削除する
Private Sub deleteCard(ByVal CardPlace)

    With Worksheets(MAIN_SHEET).Range(CardPlace)
        
        .ClearContents
        .ColumnWidth = CARD_HEIGHT
        .RowHeight = CARD_WIDTH
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .Font.ColorIndex = CARD_COLOR_WHITE
        .Interior.ColorIndex = CARD_COLOR_WHITE
    
    End With

End Sub</pre>
&nbsp;</p>
<h4>ゲーム終了処理</h4>
<p>&nbsp;</p>
<p>ここでは、ゲーム終了処理に関する処理が含まれます。</p>
<p>ゲームが終了するパターンは主に2通りです。</p>
<p>&nbsp;</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">マーク読み取れない対策</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>神経衰弱のカードがすべてめくられて終わるパターン</li>
<li>「FIN」ボタンが押下されて終了するパターン</li>
</ol>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<p>①のすべてカードがめくられたときの検知方法ですが、</p>
<p>二枚目のカードがクリックされた後に</p>
<p>作業用シートの「残り枚数」と記載のある個所（F2）が０になったときに終了するように処理します。</p>
<p><img loading="lazy" decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_6.png" alt="" width="1361" height="197" class="aligncenter size-full wp-image-4563" srcset="https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_6.png 1361w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_6-300x43.png 300w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_6-768x111.png 768w, https://lemon818.com/wp/wp-content/uploads/2019/10/shikei_6-1024x148.png 1024w" sizes="auto, (max-width: 1361px) 100vw, 1361px" /></p>
<p>&nbsp;</p>
<h5>ソースコード</h5>
<pre class="crayon-plain-tag">'ゲーム終了処理
Sub finGame()
    
    Dim finFlag
    
    finFlag = Worksheets(WORK_SHEET).Range(REMAIN_CARD_NUM).Value
    
    If finFlag = 0 Then
    
        MsgBox MSG_FIN_GAME
        
        Worksheets(WORK_SHEET).Range(GAME_STATUS_PLACE).Value = MSG_GAME_END

    End If
    
End Sub

'ゲーム終了押下
Sub pushFinGame()
            
    Worksheets(WORK_SHEET).Range(GAME_STATUS_PLACE).Value = MSG_GAME_END
    
End Sub</pre>
&nbsp;</p>
<h4>定数定義</h4>
<p>&nbsp;</p>
<p>ここでは、Excel Vba で扱う定数についてまとめて定義しています。</p>
<p>シート名、カードを配置する箇所（盤上という表現で記載）などなどです。</p>
<p>（たぶん、ソースコード見たほうがはやいとおもいます。）</p>
<h5></h5>
<h5>ソースコード</h5>
<pre class="crayon-plain-tag">' --- シート情報 ---

Public Const MAIN_SHEET As String = "神経衰弱"
Public Const MASTER_SHEET As String = "トランプマスタ"
Public Const WORK_SHEET As String = "作業用"


' --- 「神経衰弱」シート ---

' データの範囲 盤上の設定
Public Const BOARD_X As Integer = 3
Public Const BOARD_Y As Integer = 6

Public Const SET_NUM_MAIN_RANGE As String = "F3"
Public Const SET_KIGO_MAIN_RANGE As String = "L3"

' カード情報
Public Const CARD_HEIGHT As Integer = 5
Public Const CARD_WIDTH As Integer = 50
Public Const CARD_COLOR_RED As Integer = 3
Public Const CARD_COLOR_WHITE As Integer = 2
Public Const CARD_COLOR_BLACK As Integer = 1

' --- 「トランプマスタ」シート ---

Public Const MASTER_RANGE As String = "A2:B5"


' --- 「作業用」シート ---

' 残りカード枚数
Public Const REMAIN_CARD_NUM As String = "F2"

' 押下カードの情報
Public Const FIRST_INFO_PLACE As String = "B2"
Public Const SECOND_INFO_PLACE As String = "C2"

Public Const FIRST_CELL_PLACE As String = "B3"
Public Const SECOND_CELL_PLACE As String = "C3"

' カードが一致するか
Public Const JUDGE_PLACE As String = "D2"

' カードをもとに戻す時間
Public Const WAIT_TIME As Integer = 1000

' ゲームステータス確認
Public Const GAME_STATUS_PLACE As String = "H2"

' --- その他 ---

' 判定フラグ
Public Const PUSH_FIRST_CARD As Integer = 0
Public Const PUSH_SECOND_CARD_SAME As Integer = 1
Public Const PUSH_SECOND_CARD_DIFF As Integer = 2


' --- メッセージ ----

' ゲームステータス
Public Const MSG_GAME_START As String = "ゲーム中"
Public Const MSG_GAME_END As String = "ゲーム終了"

' ゲーム終了時
Public Const MSG_FIN_GAME As String = "お疲れ様でした！！ゲームを終了します！！"

' VLOOKUPの出力
Function ouputVlookup(ByVal Str)

    ouputVlookup = "=VLOOKUP(""" &amp; Str &amp; """,トランプマスタ!I:K,3,FALSE)"

End Function</pre>
&nbsp;</p>
<h4>配置カードを設定</h4>
<p>&nbsp;</p>
<p>ここでは「START」ボタン押下時にはじめにカードを配置する処理を記述しています。</p>
<p>大きくは setCard() プロシージャで処理を実装しています。</p>
<p>&nbsp;</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">実装内容</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>何種類の数字をゲームをするか、「神経衰弱」シートの数字とマークの種類から決定</li>
<li>上記の情報から、使用する数字を決定</li>
<li>最終的に使うカードの種類を決定し、配列に格納</li>
</ol>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<p>ちょっとわかりにくかったかもなので、補足します。</p>
<p>はじめに「神経衰弱」シートで「３種類」の数字と「４種類」のマークを使用するとします。</p>
<p>つぎに「３種類」の数字の中からどの数字にするか（1 ~ 10の中で）ランダムに選択します。</p>
<p>たとえば、1、４、９と使うとすると</p>
<p>１、４、９ ×　「４種類」のマーク<span style="color: #ff0000;">&#x2665;<span style="color: #000000;">&#x2660;</span></span><span style="color: #ff0000;">&#x2666;</span>&#x2663; = 12種類の文字列を作成し、配列に格納します。</p>
<p>そして最終的に配列をランダムにシャッフルし、その配列をシートに出力するということです。</p>
<p>※ ここでは、配列の生成のみで、シートへの出力は別の「盤上へカードを配置」で行います。</p>
<p>&nbsp;</p>
<h5>ソースコード</h5>
<pre class="crayon-plain-tag">' ゲームで使うカードの設定
' 数字 + 記号を文字列を含む配列で返す

Function setCard() As String()

    Dim numArray
    Dim allCardArray
    Dim setCardNumber As Integer
    
    ' 何種類の数字をゲームをするか
    setCardNumber = Worksheets(MAIN_SHEET).Range(SET_NUM_MAIN_RANGE)
    
    ' 上記の種類のランダム数字で決定
    numArray = getCardArray(setCardNumber)
    
    ' 最終的に使うカードの種類を決定
    setCard = decideCardArray(numArray)
    
End Function

' 上記の種類のランダム数字で決定
Private Function getCardArray(ByRef Num As Integer) As String()

    Dim i As Long
    Dim myNum As Long
    Dim numArray() As String
    Dim myFlag(1 To 13) As Boolean

    '乱数系列を初期化
    Randomize
    
    For i = 1 To Num
        Do
            myNum = Int((13 - 1 + 1) * Rnd + 1)
        Loop Until myFlag(myNum) = False
        
        ReDim Preserve numArray(i - 1)
        numArray(i - 1) = myNum
        myFlag(myNum) = True
    Next i

    getCardArray = numArray

End Function


' 最終的に使うカードの種類を決定
Private Function decideCardArray(ByRef numArray) As String()
    
    Dim i As Integer: i = 0
    Dim sumArray() As String
    Dim kigoMaster: kigoMaster = Worksheets(MASTER_SHEET).Range(MASTER_RANGE)
    Dim kigoNum: kigoNum = Worksheets(MAIN_SHEET).Range(SET_KIGO_MAIN_RANGE)

    For Each Var In numArray
        
        ReDim Preserve sumArray(i)
        sumArray(i) = Var &amp; kigoMaster(1, 1)
        i = i + 1
        ReDim Preserve sumArray(i)
        sumArray(i) = Var &amp; kigoMaster(2, 1)
        i = i + 1
        
        If kigoNum = 4 Then
            ReDim Preserve sumArray(i)
            sumArray(i) = Var &amp; kigoMaster(3, 1)
            i = i + 1
            ReDim Preserve sumArray(i)
            sumArray(i) = Var &amp; kigoMaster(4, 1)
            i = i + 1
        End If
    
    Next Var

    decideCardArray = cardShuffle(sumArray)

End Function

' カードをシャッフル
Private Function cardShuffle(ByRef cardArray) As String()

    For i = 0 To UBound(cardArray)
        Randomize
        rn = Int(UBound(cardArray) * Rnd)
        tmp = cardArray(i)
        cardArray(i) = cardArray(rn)
        cardArray(rn) = tmp
    Next
    
    cardShuffle = cardArray

End Function</pre>
&nbsp;</p>
<h4>盤上へカードを配置</h4>
<p>&nbsp;</p>
<p>「配置カードを設定」で生成した配列をシートに表示させます。</p>
<p>&nbsp;</p>
<p>その表示の際に、カードの装飾も行っています。</p>
<p>カードの装飾とはつまりセルの配色を指します（たとえば、セルの値、罫線、背景色など）。</p>
<p>&nbsp;</p>
<h5>ソースコード</h5>
<pre class="crayon-plain-tag">' 盤上へカードを配置
Sub setBorad(ByRef numArray)

    Dim X: X = 0
    Dim Y: Y = 0
    Dim j: j = 0
    
    Dim arraylength: arraylength = UBound(numArray) + 1
    
    Do
        ' カードの装飾
        Call paintCard(numArray(j), X + BOARD_X, Y + BOARD_Y)
        
        If X &gt;= 20 Then
            X = 0
            Y = Y + 2
        Else
            X = X + 2
        End If
        
        arraylength = arraylength - 1
        j = j + 1
    
    Loop Until arraylength = 0

End Sub

' カードの装飾
Private Sub paintCard(ByVal CardValue, ByVal X, ByVal Y)
 
    With Worksheets(MAIN_SHEET).Cells(Y, X)
        
        .Value = CardValue
        .ColumnWidth = CARD_HEIGHT
        .RowHeight = CARD_WIDTH
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .Orientation = xlVertical
        .Font.Bold = True
        .Font.ColorIndex = CARD_COLOR_RED
        .Interior.ColorIndex = CARD_COLOR_RED

    End With

End Sub</pre>
&nbsp;</p>
<h2>まとめ</h2>
<p>&nbsp;</p>
<p>いかがでしょうか？</p>
<p>&nbsp;</p>
<p>Excel Vba があれば簡単に作れますでのよければぜひ作ってみてください！</p>
<p>※ 作成した Excel 「神経衰弱」は下記からダウンロードできます。よければぜひ遊んでみてください！</p>
<p>&nbsp;</p>
<div class="button frame block green">
<div class="button frame block green"><a class="midium" href="https://lemon818.com/wp/wp-content/uploads/2019/10/shinkeisuijyaku.xlsm">Excel 「神経衰弱」をダウンロードする！！</a></div>
</div>
<p>&nbsp;</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
