ついて情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。エクセルでピアノを作るVBAの勉強このブログの記事一覧にもどるTweetエクセルでピアノの鍵盤を作る方法を解説します。直接的に何かの役に立つわけではなく、プログラミングの練習、もしくは単なる遊びです。楽しんでやれば挫折しないからです。それでは早速見ていきましょう。エクセルでピアノを作る方法のまとめエクセルでピアノを作る事の概要エクセルでピアノを作る方法についてその流れを押さえ、全体像を把握する事から始めます。その前に前提のお話を少しだけさせて下さい。前提:APIは上級技だけど難しくない題名に上級技とありますが、ピアノを作るエクセルのプログラミングが難しいと言うわけではありません。APIというWindowsの機能を借りてきて利用する事が一般にVBAでは「上級」と言われているためにその言い方に合わせました。他のシステムの機能を借りてきて使う事がエクセルの中だけで処理が済むプログラムより高度なので上級と呼ばれているのですが、上級=難しいと言うわけではありません。逆にIfやForなど基礎的な文法市価使っていなくても、複雑な分岐をする必要がある場合などはプログラミングをする事が難しい場合があります。このように、「上級」とされている技術を利用することが難しいとは限らないため、先入観で新しい技術を取り入れるのをためらわないようにしましょう。エクセルでピアノを作る作業の流れエクセルでピアノを作る作業は下のような流れとなります。エクセルシートに鍵盤の絵を描く標準モジュールにメインのプロシジャを挿入する標準モジュールの冒頭にAPIの宣言を書くシートモジュールにプロシジャを挿入する標準モジュールを仕上げるクリックした場所に応じた音を出すようにする一見難しいようでもこのように作業を細分化し、ひとつひとつを着実にこなしていくことで目的を達成する事ができます。エクセルシートに鍵盤の絵を描くまず、ピアノの鍵盤となる部分を作成します。分かりやすい様に、シート名はSheet1からkey_boardに変更しました。次に、行と列のスケールを調整します。私の場合は1行目の行の高さを150、2行目の行の高さを100にしました。E列からAT列までの列の幅を1.5に変更します。これはE列からAT列の部分ピアノの鍵盤にするためです。これで行と列の幅を整える作業は完了です。次に、黒鍵の部分を作ります。黒鍵は1行目に作ります。言葉で説明しても分かりづらいので、自作される方は下の図を真似して作成してみて下さい。罫線を引けば鍵盤はほぼ完成です。見栄えを良くするためにセルの灰色枠線を非表示にしています。セルの枠線を非表示にする方法はリボンの上にあるタグから表示を選択して、目盛線のチェックボックスを外せばOKです。表示タグを選択して「目盛線」のチェックボックスを外す標準モジュールにメインのプロシジャを挿入する今回はイベントプロシジャを使いますが、押された場所に応じた音を鳴らす部分は標準モジュールに記述します。ピアノをもしたエクセルシートを作成するのが今回の目的のため、メインのプロシジャ名はPianoにします。SubそしてこのPianoプロシジャの中にAPIを呼び出して、クリックされた場所に応じた音を鳴らすプログラムを書いていきます。標準モジュールの冒頭にAPIの宣言を書くこのプログラムの心臓部分となるPianoプロシジャの中身の作成に入る前に、APIを使う準備を行います。APIとは、他のアプリケーションの機能を借りてくることです。API、つまりWindowsの音を鳴らす機能を借ります。エクセルには音を鳴らす機能が無いからです*1。そとから機能を借りてくるので、何の機能を借りてくるのかを予め宣言しておく必要があります。そこで、先ほどのイベントプロシジャの上にAPIの宣言を記述します。'これは標準モジュールのPianoプロシジャの上に書きます。LongAPIの宣言は冒頭で行いますので、先ほど挿入したPianoプロシジャの上に記述して下さい*2。APIを使う手順(調べる→宣言する→使う)で詳しく解説していますので参考にしてみて下さい。シートモジュールにメインのプロシジャを呼び出すプロシジャを記述する今回はイベントプロシジャを利用します。イベントとは、ユーザーの入力など外部からの影響をトリガーに実行されるプログラムのことです。今回はシートをクリックされたら、標準モジュールを呼び出すようにします。このようにする理由は、押されたら音を鳴らすというイベントプロシジャにする必要があることと、シートモジュールのようにオブジェクトにくっついているモジュールではAPIの宣言ができないためです。シートモジュールはオブジェクトにくっついているため、既に存在しているこのことからシートモジュールはメインのモジュールを呼び出すところだけを担当し、メインの押された場所に応じて音を鳴らす部分は標準モジュールに記述します。シートモジュールはワークシートに付属したモジュールのため、既に存在します。ここに標準モジュールのPianoプロシジャを呼び出すVBAを記述します。イベントプロシジャを記述するときはモジュール名は自分で書くのではなく、トリガーとなる出来事に応じたプロシジャ名を選択します。ワークブックにチェック機能をつけるにイベントプロシジャの書き方を具体例を挙げながら解説しているので、参考にして下さい。ユーザーがシート上でクリックをするとクリックをしたところのセルがActiveとなります。選択した場所が変わります。このため、Worksheet_SelectionChangeを選択します。すると、下記の様になります。'これはシートモジュールに書きます。Subの間に標準モジュールに記述した音を流すプログラムを呼び出す記述をします。'これはシートモジュールに書きます。Sub押された場所が大事なので、呼び出すPianoプロシジャの所に引数にTarget.Row、Target.Columnを書く事で、クリックされた場所の行番号と列番号をPianoプロシジャに渡します。音を出すようにする準備が整いました。ここから実際にシート上のどこをクリックしたかで出す音が変わるプログラムを記述していきます。音程とヘルツ数を調べるドレミのという音の高さはヘルツという数字で表されます。そこで、ドからシまでのそれぞれの音程を調べます。:シ2オクターブ分の鍵盤があるので周波数も2オクターブ分調べました。この記事では音階を調べるために下のページを参考にさせて頂きました。https://tomari.org/main/java/oto.html今回使うAPIでは音の高さをヘルツを使って表現します。音が出るようにするそれではメインのPianoプロシジャを作成してみます。音を単に音を鳴らしてみましょう。Beepという音を鳴らすAPIを使うという宣言を既に行っているため、たった一行で音を鳴らすことができます。ラの音を1秒流すだけのプログラムを書いてみましょう。Subラは440Hzなので、第1引数に440を渡しました。Beepは音を流す間の時間をミリ秒で指定します。1秒は1,000ミリ秒なので、1000を第2引数にしました。この状態でどこかをシート状のどこかのセルをクリックすると「ポー」という聴力検査のような音が出ます。APIの利用が完了です。一行でとても簡単ですね。冒頭で述べた上級技なのに簡単ということはこういうことです。メインのプログラムを記述するそれでは次にメインのプログラムを作成していきます。Subまずは、クリックされた場所を知るためにイベントプロシジャから呼び出すときに渡された引数を受け取れるようにします。Target.Column)というように2つの引数を渡しながらPianoプロシジャを呼び出しました。この値をPianoプロシジャ側ではrwとclmという変数で受け取ります。rwはRowで行の意味、clmはColumnで列の意味です。ここは自分がわかりやすい変数名にしておけばよいです。条件分岐させてクリックされた場所に応じた音が出るようにするどこを押されたかによって出す音が違うので条件分岐を行うことにします。Case分を組み合わせて使うことにします。プログラムがしやすいようにセルの表示をR1C1形式にしておきます。リボンの上のタブのファイル⇒オプション⇒数式⇒R1C1参照形式を使用すると進みます。すると、列がABCではなく、1、2、3と言う表示になります。R1C1形式表記にしたエクセルシートピアノの構成をよく見て条件分岐をどうするか考えます。列は5列目から46列目の間以外は音が鳴らないことが確定です。5~46列目であれば、どこを選択したらド、などと一つ一つ条件分岐していきます。5列目、6列目ならド。7列目なら、1行目ならドの♯。2行目ならド、と言った具合です。これを地道にプログラミングしていくと下記の通りとなります。Subプログラムはかなり長くなってしまいましたが、どこを押されたかをひたすら分岐しているだけなので、命令としては1行しか実行されません。オクターブはヘルツ数を2倍しています。反省点としては音の長さが決め打ちな所です。クリックした瞬間から0.5秒を機械的にならしています。別のAPIを使えばマウスのクリックを離した瞬間*3に音が途切れるようにするなどが考えられます。複数の音を同時にならすこともできません。APIに慣れ親しむ目的で紹介しましたので、このあたりでご容赦頂ければと思います。エクセルでピアノを作る方法のまとめこの記事の内容をまとめます。VBAによるプログラミングでAPIは上級向けとされているが、難しくはないAPIは宣言さえ分かればあとは呼び出すだけで使えるピアノを作ろうとすると分岐が沢山必要であるピアノの鍵盤をセルで代用しようとすると、イベントプロシジャが必要となる勉強とは思わずに、遊びでこのようなプログラムを作ってみるのも良いと思います。VBAでクラスやオブジェクトの概念と使い方を丁寧に解説し、ワンランク上の実力を目指すガイドを書きました。APIを使う方法を解説します。00:281985年生まれの会社員。業務改善部隊に異動で芽を出し、現在に至る。本業での知識と経験を元に、ブログで1生産性向上2業務改善3自動化について情報発信しています。Unlimitedで無料で読めます。(1)はてなブログをはじめよう!mutable_yunさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。