Excel VBA

microsoft

Microsoft Excelといえば表計算のイメージが強いですが、Excel VBAというプログラムの開発もできる万能ツールでもあります。その能力を活かして、今回は3分経ったことを知らせてくれるカップラーメン用のタイマーを簡単に作ってみたいと思います。

Excel VBA

f_f_business_30_s128_f_business_30_2bg

はじめに

最近Excelを使うことが多くて、データを分類したり加工したりするマクロを作ったり、久しぶりにVisual Basicでプログラムを書きました。でもずっと方眼紙のようなマス目を見ていると、ファミコンのような昔のゲームを思い出します。

というわけで、今回はエクセルのセルを使って壁に跳ね返るボールのような動きを作ってみました。

 

動作環境

  • Microsoft Office 365 Soloを使用しています。
  • WindowsでもMacでも動きますが、Mac版の方はなぜかマクロが実行できないことがありましたのでWindows版の方が安定しているようです。

レイアウト

post-1162_01使うシートは1つだけです。名前は自動で付いている「Sheet1」のままで変更しなくて大丈夫です。

A1のセルからAF22のあたりまで、セルの色を黒く塗って壁を作ります。あとはマクロの実行用に図形を一つ作っておいてください。

 

マクロの作成

レイアウトの作成が終わったら、マクロを作成します。メニューの「ツール」-「マクロ」-「Visual Basic Editor」でマクロ編集画面を開いて、モジュールを作成します。

※作成方法がわからない場合は、「ツール」-「マクロ」-「新しいマクロを記録」を選んですぐに「ツール」-「マクロ」-「記録終了」を選ぶとサクっと作れます。

簡単に説明しますと、まずcheckCollisionという関数で、ボールが動く先に障害物があるかチェックしています。もし壁やカーソルがあれば移動する方向を反転するようにしています。

Sub dotmove()
    Dim x As Integer
    Dim y As Integer
    Dim nextX As Integer
    Dim nextY As Integer
    Dim moveX As Integer
    Dim moveY As Integer

    'スピード調整用の変数
    Const counter = 2

    '初期座標
    x = 2
    y = 2

    '初期移動方向
    moveX = 1
    moveY = 1

    Do While True
       ' 左右の障害物チェック
        If checkCollision(x + moveX, y) = True Then
            moveX = moveX * -1
        End If
        '上下の障害物チェック
        If checkCollision(x, y + moveY) = True Then
            moveY = moveY * -1
        End If
        '斜め前の障害物チェック
        If checkCollision(x + moveX, y + moveY) = True Then
            moveX = moveX * -1
            moveY = moveY * -1
        End If

        ' 次の表示位置を決定
        nextX = x + moveX
        nextY = y + moveY

        '障害物がなければ描画する
        If checkCollision(nextX, nextY) = False Then
            Worksheets("sheet1").Cells(nextX, nextY).Interior.Color = RGB(0, 0, 255)
            If nextX = x And nextY = y Then
            Else
                Worksheets("sheet1").Cells(x, y).Interior.Color = RGB(255, 255, 255)
            End If
            x = nextX
            y = nextY
        End If

        For I = 0 To counter
            DoEvents
        Next I
    Loop


End Sub

Function checkCollision(x As Integer, y As Integer) As Boolean
    checkCollision = False

    If Worksheets("sheet1").Cells(x, y).Interior.Color <> RGB(0, 0, 0) And Application.Intersect(Range(Worksheets("sheet1").Cells(x, y), Worksheets("sheet1").Cells(x, y)), ActiveCell) Is Nothing Then
    Else
        checkCollision = True
    End If

End Function

 

マクロをボタンに割り当て

post-1162_02ここまでできたら、最初に作成した図形にマクロを登録して完了です。図形をcontrolキーを押しながらクリック、または右クリックでメニューを開き、「マクロの登録」を選択して「dotmove」を設定します。

 

 

 

実行してみましょう

post-1162_03では図形をクリックして実行してみましょう。青いドットが動き回ります。機種やOSによって実行スピードが違うので、速すぎる場合はcounterの値を大きめにして調整してみてください。

壁やカーソルに当たるとはね返ります。黒でセルを塗りつぶしたり、十字キーでカーソルを追いかけてみたりできます。

 

 

おわりに

全く何かに役だつことはないですが、重要な情報が入ったセルに色を付けるマクロを作ってるうちに試してみたくなって、軽い気持ちで作ってみました。移動エリアを広くして障害物になる壁をたくさん配置して、一番移動量の少ない人が勝ち!みたいな遊び方ができるんじゃないかなと思います。

プログラムなんてそんなに難しく考えないで、楽しんで適当に作ってみるのも面白いですよ。

 

Excel VBA

f_f_business_30_s128_f_business_30_2bg

はじめに

なぜかIT系のお仕事では万能ツールとして親しまれているMicrosoft Excelさん。フレキシブルな方眼紙としてプロジェクトの提案資料や仕様書の作成に使用されるだけでなくシステムの一部として帳票印刷に使われていたりと、よほど大規模なシステムでもない限りこれだけで何でもできてしまいそうな優秀な存在です。

今回は、ちょっとした練習にExcel VBAを使って英単語アプリを作って見ました。10行で作ろうとしたらちょっとオーバーしました。惜しい。

 

動作環境

  • Microsoft Office 365 Soloを使用しています。
  • WindowsでもMacでも動きますが、Mac版の方はなぜかマクロが実行できないことがありましたのでWindows版の方が安定しているようです。

 

まずはレイアウト

使うシートは2つです。1つは「出題シート」で、勉強するときはこちらを使用します。もう一つは「問題シート」で、こちらは問題に使う英単語とその和訳を登録します。ではそれぞれ作っていきましょう。

出題シートの作成

post-416_01

シート名を「出題シート」にしたらB2のセルに「No」、B3に「問題」、B4には「答え」の見出しを入れます。問題と答えが表示されるC2〜C4のセルを含めて罫線で体裁を整え、図形を「次の問題」、「答えを見る」用の2つ作成します。図形はマクロを登録できるものなら何でも大丈夫です。

これで出題シートは完成です。

 

 

 

 

問題シート

post-416_02次にもう1つ「問題シート」という名前のシートを作ります。

まずはA1のセルに「回数」、C1には「No」、D1には「問題」、E1に「回答」を入力して見出しを作ります。

次に問題の個数を把握できるようにA2のセルに以下の式を入力します。マイナス1しているのは最初の行が見出し用なのでその分を引いています。

 

 

=COUNTA(D:D)-1

 

次に、問題と答えをD列とE列に入力しましょう。手入力が面倒な方はインターネットで検索するといろいろ出てくるので探してみてください。上の画像にあるサンプルは以下のリストを使用させて頂きました。

TOEICによく出てくる英単語100語リスト

最後に、問題に番号を付けておきます。C2のセルに以下の式を入力してください。ここでも最初の行が見出しなのでマイナス1しています。

=IF(D2= "", "", ROW()-1)

 

入力したら、C2を選択したときにセルの右下に現れる小さな点(フィルハンドル)を、D列の問題が登録されているセルの行まで真下にドラッグしていきます。すると自動的に連番が振られていきます。

 

マクロ作成

レイアウトの作成が終わったら、マクロを作成します。メニューの「ツール」-「マクロ」-「Visual Basic Editor」でマクロ編集画面を開いて、モジュールを作成します。

※作成方法がわからない場合は、「ツール」-「マクロ」-「新しいマクロを記録」を選んですぐに「ツール」-「マクロ」-「記録終了」を選ぶとサクっと作れます。

モジュールを作成したら、以下のコードを追加します。長く見えますが、実際に動くコードは10行くらいですよ。

Sub 次の問題()
'
' 次の問題 Macro
'
    ' 答えを非表示にする(文字色を白にする)
    Worksheets("出題シート").Cells(4, 3).Font.ColorIndex = 2

    ' データ個数を取得
    cnt = Worksheets("問題シート").Cells(2, 1)

    ' ランダムで呼び出すデータナンバーを決定する
    Randomize
    num = Int(Rnd() * cnt) + 2

    ' 出題No、問題、と答えと出題回数を取得
    no = Worksheets("問題シート").Cells(num, 3)
    q = Worksheets("問題シート").Cells(num, 4)
    a = Worksheets("問題シート").Cells(num, 5)

    ' 出題シートに表示する
    Worksheets("出題シート").Cells(2, 3) = no
    Worksheets("出題シート").Cells(3, 3) = q
    Worksheets("出題シート").Cells(4, 3) = a

End Sub

Sub 答えを見る()
'
' 答えを見る Macro
'
    ' 答えを表示する(文字色を黒にする)
    Worksheets("出題シート").Cells(4, 3).Font.ColorIndex = 1

End Sub

 

マクロをボタンに割り当て

post-416_03ここまでできたら、「出題シート」に作成した図形にマクロを登録して完了です。図形をcontrolキーを押しながらクリック、または右クリックでメニューを開き、「マクロの登録」を選択して「次の問題」、「答えを見る」のマクロをそれぞれのボタンに設定します。

 

 

 

これで完成!

post-416_04あとは実行するだけです。「次の問題」のマクロを登録した図形をクリックすると、英単語がランダムで表示されます。「答えを見る」をクリックして答え合わせしましょう。英単語が少ないと同じ問題ばっかり出てきますが、反復練習にはいいのかも。

 

 

 

最後に

ちょっとカスタマイズすれば、単語が出題された回数とか、苦手な英語にチェックを付けるとかいろんな機能を拡張できますね。英語も記憶できてプログラムも覚えられて一石二鳥です。もしかしたらバージョン2が登場するかも?

 

PAGE TOP