エクセルVBAを始めてみましょう。第5回プログラミングの手法応用編、テキストボックスを利用した電光掲示板を作ってみます。

エクセルVBA
ANNE PROⅡ
この記事は約9分で読めます。

今回は電光掲示板もどきを作ってみます。

今回は、電光掲示板風に見えるプログラムを開設します。
約12年前に筆者がまだVBAを覚えたてのころ作ったものですから、あまりうまくできていませんが、素人の初心者でもこの程度の物は作れるようになるという代物です。

概要

フォームのコンボボックスにメッセージを書き込んでボタンを押すと真っ黒の画面の上に緑の文字が右端から左端に向かって移動します。

ポイント

PC画面には掲示板を表現したフォームだけが表示されます。エクセル本体は見えなくなります。
PCのディスプレーの左端に追い出してエクセル本体は見えない状態にして、単体のアプリケーションっぽく見せるようにしました。

掲示板フォームを×ボタンで終了するとき、エクセルを元の位置に戻すようにしています。

フォームのコンボボックスにメッセージを蓄積するようにしました

メッセージデータはSheet2の特定のセル範囲に蓄積されます。

メッセージが流れるスピードを調節できるようにしました。
使用しているPCの処理能力によっては流れのスピードが極端に速かったり遅かったりするので調整できるようにしたのですが、いまいちその設定がうまくいっていないようです。改善の余地ありです。ですが、あえてそのままにのこしていますから、アタックしてみてください。

コードの説明

文字が流れる仕組みはすごく簡単です。
ラベルのロードの上にメッセージ用のテキストボックスを配置して、繰り返し処理を使ってテクストボックスのLeft位置をロードの右端から移動していくようにしています。
テキストボックスはメッセージの文字列の長さに自動的に長さを調節するように設定し、そのテキストボックスの右端がロードの左端に達したら、再度ロードの右端に戻すようにしているので、見た目にはstopボタンを押すまでロードを延々と流れ続けるように見えます。
それでは具体的にプログラムを見ていきましょう

Labelの上をTextBoxが流れる

掲示板のフォーム全体の様子

フォーム上に配置したオブジェクト

ラベル  (メッセージを走らせるロード用とオブジェクトの説明用に全部で3個)

テキストボックス  (メッセージ用)

ボタン  (Goとstop用に2個)

スクロールバー  (メッセージが流れるスピードの調整用)

スピンボタン  (スピード調整のしきい値調整用)

デザインポイント

フォームにラベルを貼り付ける。デザイン画面のLabelのプロパティーで背景色を黒にします。

その上にTextBoxを配置します。プロパティーで背景色を黒にして、ラベルと同化するようにします。ボーダーカラーも黒にしておきます。FontColorを緑に設定します。Fontはポップ調にしましたがこの辺は好みで設定してください。フォントサイズは24にしてますがこの辺もお好みで調整ください。

ポイントはTextBoxのAutoSizeをTrueにしてください(デフォルトはFalse)。文字列の長さに応じてTextBoxの幅を自動的に調整してくれます。

 

 

コードのポイント

電光掲示板の文字が流れる動作の表現の要はDo~Loopの繰り返し処理とDoEventsです。

繰り返し処理のやり方

繰り返しの処理では、繰り返す回数が決まっている場合はFor…Nextを使い、回数が決まっていない場合はDo…Loopを使います。

 

今回はストップをかけるまでは文字列を流し続けるのでDo…Loopを使いました。任意の時に文字の流れを止めるまでは延々と繰り返し処理、文字列が流れ続けます。(ストップ処理を入れ忘れると無限ループとなり他の処理ができなくなりますから十分注意が必要です)

 

下記のDoとLoopの間に入れた一文が処理を止める処理です。

コマンドボタンはクリックするたびにボタンの表面の文字列にstopとGoが交互に表示されるようにしています。

繰り返す処理の中で繰り返しの先頭に来たらコマンドボタンのキャプションをチェックしています。ユーザーがコマンドボタンをクリックしてボタンの表示がstopになったら文字の流れが止まります。

 

Do

If CommandButton1.Caption = “stop” Then Exit Do

・ 文字が流れる処理

Loop

 

待ち時間をつくる

繰り返しの処理は非常に高速です。千回でも万回でも瞬時に処理が終わりますからスピードの調整機能を入れないと、目にもとまらぬ速さで文字が流れてしまいます。あまりに早くて見た目には何も起こっていないように見えます。ここでは一番簡単な待ち時間を作る方法をとっています。(というか、これを作ったときは初心者すぎてwaitやsleepなど他の方法がわからなかったのです。それでも何とかなるものです。)

 

下記が待ち時間を作る処理です。

For…Nextを使って、利用しても差し支えないセルに、なんの意味もない空白文字を書き込み時間を浪費する処理です。変数maxsにはスピード調節用のスライダーのValueが入るようにしています

‘待ち時間を作る

For i = 1 To maxs

Cells(i, 1) = “”

Next i

この処理を入れることで、あまりに早く流れてしまうスピードを調節できるようになりました。

 

文字列を流す

以下が文字列を左方向へ移動させる処理です

Do

TextBox2.Left = TextBox2.Left – 1

Loop

 

 

DoEventsの役割

繰り返し処理の中で文字列を表示しているテキストボックス2の位置を‐1でずらしていくことで文字が流れる様子を表現していますが、コンピュータのCPUは繰り返す処理に専念していてオブジェクトのUI表示は行われません。文字列はDoに入る前の状態を表示していて、繰り返し処理が終了したときLoopを抜けたときはじめてテキストボックスの位置が更新されます。つまり文字が流れる表示ができません。そこで、DoEventsの登場です。DoEventsは処理の流れをCPUに渡す役割をします。

Javaで言うとthread(非同期処理)のようなものらしいです。

 

この一文を入れることでテキストボックスの移動を見た目にわかるように表現できるのです。

 

Do

TextBox2.Left = TextBox2.Left – 1 

 

 DoEvents     ‘処理をwindowsに渡す

 

‘=========== ‘文字列の右端がロードの左端に達したら

‘ロードの右端に位置を変更する

If TextBox2.Left + TextBox2.Width <= 0 Then

TextBox2.Left = Me.Width

End I

Loop

 

DoEvents 以下の処理では、テキストボックスが移動を続けてフォームの左端を過ぎたら、右端に位置を戻すようにテキストボックスの位置をチェックしています。

 

この処理のおかげで、文字列が左端から消えたら続けて右端から現れるという電光掲示板らしき様子が表現できたと思います。

 

テキストボックスのプロパティーで文字列の長さで自動的にテキストボックスのwigth(横幅)を調節するよう指定しておきます

 

 

繰り返し処理の中でTextBoxのLeft値に左側に-1を与えて移動を表現しますが、繰り返し処理の動作中はエクセル本体の処理が繰り返しの処理に占有されているためUI(オブジェクト移動の状態)の変化を検知できません。テキストボックスが移動する状態を目に見て取れるようにするのがDoEventsです。この一行を入れることで繰り返し処理一回ごとにその処理の結果をUIに知らせることが出来るのだそうです。

 

 

具体的には、繰り返しが無限に続かないようにボタンを押したら繰り返しを終了する条件判断文を入れておきます。
If CommandButton1.Caption = “stop” Then Exit Do
この繰り返し処理が始まるのはGoボタンが押されたときです。
このGoボタンはStopボタンと連動するようにしています。最初Stopボタンは見えないようになったいます。Goボタンを押して処理が開始されると同時にStopボタンを表示してGoボタンは見えないようになります。繰り返し処理を終わらせるためにStopボタンを押すと同時にGoボタンのキャプションを ”GO” → ”stop” と変更します。するとDo Loopの中で、CommandButton1.Caption = “stop” がTrueとなり繰り返しが終了します。繰り返しが終了したらキャプションは”GO”に戻しています。

エクセル本体を消す

Application.Left = -Application.Width

Applicationというのはエクセル本体の事です。エクセルのLeft値に現在の表示幅の値をマイナスで与えるとディスプレーの左側端から追い出すことが出来ます。エクセルは消えたわけではなく画面の左側外に開いたままになっています。(消えたように見えるだけです。)

エクセルを追い出す前に元の位置を覚えておいてフォームが閉じたときこの位置をエクセルに与えれば追い出したエクセルは元の位置に戻ります。

エクセルが画面から追い出された状態のまま、エクセルの他のファイルを開いても見た目には何も変わりません。(画面から追い出されていると他のエクセルファイルは起動できない様です)

この設定には少し問題があります。このマクロが稼働中(フォームが開いてる間)に何らかの原因でエラーが起きるとマクロが終了してしまいます。そうなると、画面の外に追い出されたままの状態になるので、手動でエクセルを元に戻さないとなりません。(それはちょいと面倒ですね。)タスクバーに生きているエクセルがあるので、それをポイントして右クリックメニューから「移動」を選択して右矢印キーを数回押せば画面の左端からエクセルが出てきます。
ですが、エラーが起きそうな場所には、マクロが終了しないうちにエクセルを元の位置に戻すようにしていますから大丈夫だと思います。まぁ、エクセルが消えてフォームだけ表示されていたほうが、なんとなく単体のアプリケーションの様に見えるので、意味のない動きでもないとは思います。
プログラムのポイントはだいたいこんなところです。

練習用エクセルファイルのダウンロードは下記から

 

プログラム全部

 

 

 

コメント

  1. […] 詳細はこちらからどうぞ。 […]

タイトルとURLをコピーしました