仮想通貨100種類以上の特徴を紹介!だけど雑記ブログw

プログラミング講座2-3.5・ライフゲーム-【おまけ】セルの操作部分をもっときめ細やかに調整しよう

 

この賞は飛ばしてもらって結構です。前回作成したものでも、初めて作るものとしては十分な出来栄えだと思うのですが、個人的に気に入らないので、自己満足的改善をほどこしたいと思いますw

  • 複数選択できない
  • 同じセルを連続して選ぶことができない

気に入らなかった点はこの2点です。一気に塗りつぶしたい時ってのもあるはずじゃないですか?wただしそれを改善するには、選択したセル1つ1つの状態を把握する必要があります。そうすると、「For Next」や「Do Loop」の話をする前に「For Each」の話をしないといけなくなります。もしくは、むりやり「For Next」を使おうとすると、Target.Rows.CountとTarget.Columns.Countで最大値をとった上での話となりかなり複雑となります。そこで、今回はおまけの形でFor Eachを使ってみたいと思います。

また、同じセルを連続して選ぶことができない件については、簡単にTargetを移動させる方法を取ろうと思います。

For Eachで複数選択を可能にする

「For Each」の使い方としては、前回書いたようなTargetに複数のセルが含まれる場合に1つ1つをばらして、順番に処理することができます。そのセル1つ1つに対して、「.Row」や「.Column」で行番号、列番号を確認していけば、複数選択で横幅や縦幅の最大値を超えても塗りつぶさない設定をすることができます。

「For Each」の具体的な使い方は下のようなります。

For c In Target

    ‘cに複数選択したセルを1つずつばらしてcに格納しながら、選択したセルの個数分実行される

Next c

当然のことながら、cはTargetをばらした1つ1つの変数ということになりますので、cをばらした1つ1つのもの「オブジェクト」として定義してやる必要があります。オブジェクト型の場合、ざっくりと「Object」として、定義することもできますが、具体的にObject名が分かっていれば、そのオブジェクト名で定義してやることもできます。今回は「Range」という型で定義します。もちろん、わからない時は「Object」で大丈夫なので、下に2通り書いておきます。

Dim c As Object

Dim c As Range

さて、今回の場合、複数選択したすべてのセルを見るため、初めにTargetの「.Row」や「.Column」や「.Count」を見る必要はありません。(念のため、大きな範囲を選び過ぎた場合に処理を止めるコードは書いておきます。YMAX * XMAX *10を超えることを条件にします。)その代りに1つ1つのセルを見るFor Each文の中で、そのセルが範囲内に収まっているかどうかを見る必要があります。前回は「越えている時」という条件だったので、「>」を使いましたが、「○○以内」や「○○以上」という時は「<=」や「>=」を使います。数学で出てきた「≦(小なりイコール)」や「≧(大なりイコール)」に相当するものです。今まで説明した内容だけで書くと、以下のようになります。

If  c.Row <= YMAX Then

    If c.Column <= XMAX Then

        ‘ここに処理を記入

    End If

End If

でも、ちょっと複雑な感じがします。2つの条件を同時に使う時は「And」でつなぐことができます。ついでに書いてしまうと、○○かつ□□は「○○ And □□」、○○または□□は「○○ Or □□」と書くことができます。この方法で書くと、下のようになります。

If c.Row <= YMAX And c.Column <= XMAX Then

    ‘ここに処理を記入

End If

Targetをはずす

当然のことながら、中心の処理は前回と同様となります。ただし、今回はそれに加えて、Targetをはずす処理を加えます。これは単純に「Cells(セルの行番号, セルの列番号).Select」と指定してやるだけで実現できます。今回は1行目の右端のセルの一つ外側のセルを選択することにし、コードの最終行に追加します。当然のことながら、列番号は「XMAX+1」となります。

これを加えた完成版は下のようになります。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Target.Count > YMAX * XMAX *10 Then Exit Sub

    Dim c As Object

    For Each c In Target

        If c.Row <= YMAX And c.Column <= XMAX Then

            If c.Interior.Color = RGB(255, 0, 0) Then

                c.Interior.Color = xlNone

            Else

                c.Interior.Color = RGB(255, 0, 0)

            End If

        End If

    Next c

    Cells(1, XMAX + 1).Select

End Sub

大急ぎでここまで書いたので、本当に初心者で学ぼうとされている方はきっとわからなかったのではないかと思います(^^;

この部分はなくてもちゃんとライフゲームは作成できますので、分からなければ、無視してください。このコードは前回Sheet1に書いたコードと差しかえればそのまま使えます。興味のある方はぜひ動かしてみてください。使ってみると、すごく操作性は良いように感じられると思います。

前へ ・ 目次へ ・ 次へ

SNSでフォローする

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です