かっきぃーの雑記帳

おもしろき こともなき世を おもしろく

作りながら学ぶ!エクセルVBAマクロ超入門(3) 100回の繰り返しをボタンひとつで一気に実行!(抽選器マシーンシリーズ機能追加②)

さて、実践!エクセルVBAマクロ超入門「抽選器マシーンシリーズ」も第3弾。今回は、

  • 当選結果の自動記録
  • 複数の抽選を連続実行
  • スペシャルな賞は特別なファファにメロディー変更
  • 100回の抽選でも1000回の抽選でもボタンひとつで一気に実行

あたりを機能追加しました。

 


実践!エクセルVBAマクロ超入門03 100回の繰り返しをボタンひとつで一気に実行!そしてスペシャルな賞は特別なファンファーレで(抽選器マシーンシリーズ機能追加②)

 

途中、抽選のタイミングとファンファーレ音のタイミングが合わない不具合が発生したり、100回の抽選には時間がかかりすぎたりということもありましたが、都度解決している過程も含まれています。

動画ではひととおり解説していますが、いくつかここで補足をしたいと思います。

スポンサーリンク

 

 

PlaySound関数の同期再生と非同期再生

PlaySound関数で音声ファイルを再生することができますが、大きく同期再生と非同期再生があります。それぞれの違いは下記の通り。

同期再生 サウンド再生が終了したら次の処理へ

非同期再生 サウンドの開始と同時に次の処理へ

前回までは非同期再生の設定でした。こうしておくと、サウンドを流しながら次の処理に入れるので、スムーズに進むわけです。

しかし、音声ファイルの再生が繰り返される場合は、再生が終わらないうちに次の再生が実行されることとなり、タイミングがズレたりすることとなります。今回、試行錯誤をしている過程でタイミングがズレてきたので、同期再生に修正しました。

具体的にはPlaySound関数の4つ目の引数を「SND_ASYNC」から「SND_SYNC」に変えます。

PlaySound wrkSndFile, 0, SND_ASYNC
  ↓
PlaySound wrkSndFile, 0, SND_SYNC

 

これに伴い、宣言文も一文追加しておいてください。

Public Const SND_SYNC = &H0

 

パブリック変数として定義された変数は活躍の場が広がる!

通常、Subプロシージャ内で定義される変数は、プロシージャの外に値をもってでることはできません。ただ、いくつかのプロシージャで値を共有して処理をすることがあります。そんな時に使用するのがパブリック変数です。

パブリック変数として定義することでSubプロシージャの枠のみならず、Moduleの枠を超えて活躍させることが出来ます。

Public (変数名)

これをModuleの冒頭に記載しておけばOKです。

 

スポンサーリンク

 

 

「塗りつぶしパターン」で処理を分岐

処理を変える条件に「セルの入力値」以外に「セルの色」や「塗りつぶしパターン」なども使うことができます。今回は「塗りつぶし」の有無で判定することとしました。

この手の処理は、調べればで比較的ラクに出てきますし、何度も使えば覚えるかもしれませんが、今回は「マクロの記録」機能を使って、そこで表示される内容をヒントにマクロを作っていくという手法を取りました。

まず、セルを選んで、塗りつぶすという作業のマクロを紹介します。

Range("O4").Select
With Selection.Interior
  .Pattern = xlSolid
  .PatternColorIndex = xlAutomatic
  .Color = 49407
  .TintAndShade = 0
  .PatternTintAndShade = 0
End With

 

ここで、セルの塗りつぶし判定に関わるのは「.Interior(背景色)」「.Pattern(網掛けパターン)」「xlSolid(塗りつぶし)」。

これを基に作ったIf文はこちら。

If Range("¥winner").Offset(m, 1).Interior.Pattern = xlSolid Then ~

「Range(“¥winner”).Offset(m, 1)の網掛けが塗りつぶしだったら ~ する」ということ。

このように、背景色や網掛けパターンをどのように表記すればいいか分からなくなっても、「マクロの記録」でヒントが得られます。

秘儀!マクロの記録!!

ちなみに「網掛けなし」は「xlNone」で表記します。これも、秘儀・マクロの記録で調べることができます。

 

あとは工夫と試行錯誤!

今回いくつか補足をしましたが、これ以外は特別なことは使っておらず、For文やIf文、Rangeオブジェクトの組み合わせや工夫で何とかなっています。

処理の繰り返しはFor文+Exit Forではなく、While文の方がスマートでは?という意見もあると思いますし、それはその通りだと思います。ただ、While文だと処理に失敗したときに無限ループに陥る心配があるので、むかしからどうも好きにはなれず、エラーとなっても、For文で設定した100や1000の処理で止まる方が安心感が勝り、どうもこの方法から抜け出せません。

あと、できるだけ少ない知識と工夫で乗り越えるというのが好きというのもあります。

Excelの関数も調べるより、マクロで作っちゃう方を選びがち。

 

いちおう「抽選機マシーン」シリーズでやってみたいことは、大体できました。第1弾は超入門編にふさわしく、基本的なエッセンスが満載でしたが、機能追加①と機能追加②は若干、超入門編というには微妙な感じもあります。ただ、超入門初心者でもついてこれる内容だと思います。

今回の流れを見ていただければわかるように、だいたいやりたいことは実現可能です。ヒントはGoogle先生が教えてくれたり、秘儀・マクロの記録で調べることができます。

あとは試行錯誤と工夫の積み重ね。もっとも大事なのはやってみようと思う気持ちとはじめの第一歩。やってみると次が見えますので、なにはともあれ、やってみるのが一番。

ぜひ、いろいろと試してみてください。試行錯誤を繰り返しながら、経験を積んでもらえればうれしいです。

k-create.hatenadiary.com

k-create.hatenadiary.com

 

魅惑のユーザーフォーム!アラーム鳴動マシーンをつくる。

 

スポンサーリンク