squeak とexcel vba でコンピュータシミュレー...
TRANSCRIPT
高校生のためのプログラミング入門 Squeak と Excel VBA でコンピュータシミュレーション
高校生のためのプログラミング入門 Squeak と Excel VBAでコンピュータシミュレーション
目次
第 1章 Squeak編 ・・・・・・ 1
〔1〕Squeakの基礎 ・・・・・・ 2
〔2〕実習 ハンドルで操作する自動車 ・・・・・・ 9
〔3〕実習 自動的に道路に沿って走る自動車 ・・・・・・11
〔4〕モデル化とシミュレーション ・・・・・・17
〔5〕実習 円周率を求める ・・・・・・20
〔6〕実習 運動シミュレーション ・・・・・・25
〔7〕参考 ・・・・・・30
第 2章 ExcelVBA編 ・・・・・・33
〔1〕Excelの基礎 ・・・・・・34
〔2〕Excelのマクロ ・・・・・・41
〔3〕Excelによるシミュレーション ・・・・・・49
〔4〕Excelワンポイント ・・・・・・57
- 1 -
第 1章 Squeak編
- 2 -
1.Squeakの新規作成,ファイル呼び出し,保存
(1)プロジェクトの新規作成
○起動すると右図のような画面が表示されます。
この画面で新しいプロジェクトを作成します。
〔メニューから新規作成〕
①上端の緑色の帯がメニュー(ナビゲータ)です。
左端のアイコン(図の○印)をクリック
②下のようなアイコンがでてきたらそれをクリック
(2)プロジェクトファイルを開く
①ナビゲータの右から2番目のアイコンを長押し
②「プロジェクトを開く(より多くの場所から)」
を選択
③ファイルを選択して「OK」
〔1〕Squeakの基礎
☆デスクトップやマイコンピュータ
からファイルをドラッグ&ドロッ
プしても開くことができます。
Squeakは操作方法が個性的なので,最初は少し戸惑うかもしれません。
☆「長押し」は,特徴的な操作です。
覚えておいてください。
ナビゲータ
①
注意
②
①
③
☆ナビゲータは Ctrl+Cで表示,非表
示を切り替えることができます。
- 3 -
(3)プロジェクトファイルの保存
①ナビゲータの右端のアイコンを長押し
②「異なるサーバに保存」を選択
③名前をつけて(他の項目は入力しなくてもよい)「OK」をクリック
④保存先を選択して「保存」をクリック
(4)終了
①ウィンドウ右上の×ボタンで終了してください
②下のようなダイアログが出たら,保存済みであることを確認して「はい」をクリック
☆「保存」や「名前を付けて保存」は,
通常の保存とは異なる動作をします。
☆Wordや Excel では,変更したものが保存されていないとき,
「~~は変更されています。保存しますか?」
と聞いてきますが,Squeak ではそのような確認はされないので
注意してください。
①
②
① 注意
③
④
このマークをクリッ
クするとフォルダが
開きます
- 4 -
2.絵(スケッチ)の作成
(1)絵(スケッチ)の作成
①ナビゲータの ボタンをクリック
②ペイントツールを使って描画
③完成したら,「OK」ボタンをクリック
(2)絵のファイルを読み込む
方法1 デスクトップやマイコンピュータから絵のファイルをドラッグ&ドロップ
方法2 ①ナビゲータの右から2番目のアイコンを長押し
(ファイルを開くときと同じアイコン)
②「任意のファイルを開く」を選択
③ファイルを選択して「OK」をクリック
注意
① スケッチは動かす単位ごとに作成します。1つのスケッチに2つの絵を描いてしてしまった場合,そ
れらを別々に動かすことはできません。
② 大きなスケッチを作成すると,動きが鈍くなります。また,離れたところに点を1つとっただけでも
大きなスケッチになってしまうので,いらないものは消しゴムできっちり消しておいてください。
③ 精細な絵を描くときは,大きく描いてあとで縮小するといいでしょう。
☆Squeak のペイントツールは機能が少ないので,それで描ききれ
ない図や絵は他のツールで作成して,読み込むとよいです。
写真のデータを読み込むこともできます。
絵をかくときに選択
色を抽出したい
ときに選択
筆の太さを選択
色を変えるときに選択
色を塗りつぶす
ときに選択
絵を消すときに選択
一つ前の段階に戻ります
絵を保存して終了します
かいているすべての絵を消します
絵を保存しないで終了します
- 5 -
3.ハロについて
(1)ハロの出し方
方法1 オブジェクトをマウスで右クリック
方法2 [ALT]キーを押しながらオブジェクトをクリックする
(2)ハロの各部分
☆Squeakでは,絵以外にもいろんなオブジェクト(すべてのもの?)にハロがついています。
オブジェクトの種類によってハロの内容も異なります。
ドラッグで回転
この絵を表す
タイルを作る
ビューワの表示
この絵をたたむ
この絵を捨てる
ドラッグで大きさを変更
描き直し
メニュー つまむ 動かす
コピー
このスケッチの名前
クリックで変更可能
- 6 -
4.ビューワとスクリプタ
ビューワは,絵などのオブジェクトの状態を表示したり変更したりするところです。プログラムで使
ういろいろな動作(コマンド)などもここにあります。
スクリプタは,プログラムを作成するところです。
(1)ビューワの操作
〇ハロの アイコンをクリックすると,ビューワが表示されます。
〇ビューワの傍らの のようなアイコンをクリックすると,ビューワの表示,非表示を切り替えら
れます。
○ を左右にドラッグすると,ビューワの幅が変わります。
〇ビューワの アイコンをクリックすると,その動作を 1回行います。
〇「基本」「テスト」などと表示された部分をクリックすると,
カテゴリの一覧が表示されます。
これで,別のカテゴリの機能を表示させることができます。
ビューワの表示・
非表示の切り替え
コマンドを1回実行
下の欄を追加する ビューワを画面から消す
( でまた表示できる)
ゴミ箱
- 7 -
(2)スクリプタの作成
方法1 ①ビューワの中の実行させたいコマンドをドラッグ
②画面の邪魔にならない位置でドロップ
方法2 ①ビューワの「スクリプト」カテゴリの「 の空スクリプト」をドラッグ
②方法1と同様に邪魔にならない位置でドロップ
*コマンドのない空のスクリプタができます。
ドラッグ
このスクリプトを1通り
だけ実行
スクリプタを画面から消去
メニュー
スクリプト名
クリックで変更可能
スクリプト実行状態
長押しで,実行ステップの細かさを変更できる
(「チクタク」は繰り返し実行を表す)
「進める」のときは進むステップ
▲▼ボタンクリックで変更可能
タイルパレット
ドロップ
- 8 -
(3)スクリプトの追加
①ビューワの中の追加したいスクリプトをドラッグ
②スクリプタの追加したい部分へ持っていき,目的の位置に黄緑色の帯が表示されたら,ドロップ
〔スクリプトの順序変更〕
①スクリプタの中の順序を変更したいコマンドをクリック
②目的の位置でクリック
〔スクリプトの削除〕
①スクリプタの中の削除したいコマンドをクリック
②スクリプタの外でクリック
*スクリプトがスクリプタの外に置かれます。
③右クリックまたは[ALT]+クリックでハロを出す。
④「ゴミ箱へ移動」アイコン(×印)をクリック
これが表示されたら
ドロップ
☆タイルの貼り付けや移動は,すべて「ドラッグ&ドロップ」で行うことができます。
ただし,スクリプタの中での順序変更など「クリック&クリック」で可能な場合もあります。
- 9 -
(1)準備
①自動車の絵を描く → 保存
→ ハロを出して名前を「くるま」等にしておく
②ハンドルの絵を描く → 保存
→ ハロを出して名前を「ハンドル」等にしておく
③「くるま」のスクリプトを右下のように作成する
(「進める」の後を「2」にしておく)
④「くるま」のビューワは小さくしておきましょう
(2)スクリプトの合成
①「ハンドル」のビューワを出し,「基本」カテゴリの
「ハンドルの向き」をクリック
②「くるま」のスクリプタの「くるまを回す」のあとに
つける
「くるま」のビューワ
ここの周囲が緑になったらクリック
〔2〕実習 ハンドルで操作する自動車
- 10 -
(3)調整
①スクリプタの「ハンドルの向き」のあとの横向き▲を
クリック
②出てきた▲▼をクリックして+を/に変える
③次の▲▼をクリックして1を5に変える
(2)までで,ハンドルで「くるま」の向きを操作できるようにはなりました。が,よほど小さ
くハンドルを切らないと「くるま」は急旋回してしまいます。もう少し,緩やかにハンドルが切
れるようにします。
/は÷と同じです。また,×は*で表されます。
(/……スラッシュ,*……アスタリスク)
これで,ハンドルの切れ方が1/5になりました。
5をもっと大きな数にすれば,さらに緩やかになります。
また,マイナスにすると……
数値は,数字をクリックすると直接書き換えるこ
とができます
- 11 -
先の実習では,ハンドルで車の向きを操作するプログ
ラムを扱いましたが,実行の流れは「進む」と「ハンド
ルの向きにまわる」の単調な繰り返しでした。
この実習で扱う「道路に沿って走る自動車」では,とりあえず車を走らせ,道路からはみ出たら道路
の側へ向きを変えます。道路からはみ出なければ,まっすぐ進みます。このような「条件分岐」を使い
こなせれば,プログラムの幅は一気に広
がります。
さて,目指すところは,右の図のよう
に,「右へはみでれば左へ,左へはみ出
れば右へと方向修正」するものですが,
まずは,右下のように,「右へはみでれ
ば左へ」を実現させましょう。
進む ハンドルの向きにまわる
進む 条件
分岐
道路上
右にはみ出ている
左にはみ出ている
左へ
右へ
進む 条件
分岐
道路上
右にはみ出ている
左へ
〔3〕実習 自動的に道路に沿って走る自動車
- 12 -
(1)準備
①自動車の絵を描く……左右にヘッドライトをつけておきます。
これは,道路からはみ出たかどうかをチェック
するのに使います。
・左右の色は変えておきます。
・車体に使っていない色を使います。
→ 保存
→ ハロを出して名前を「くるま」等にしておく
②道路の絵を描く → 保存
→ ハロを出して名前を「道路」等にしておく
③「くるま」のスクリプトを以下のように作成する
ヘッドライト
左右の色を変える
- 13 -
(2)条件分岐……「テスト」タイル
テストタイルをおく
①ビューワの「テスト」カテゴリの「もし ならば でなければ」クリック
②テストタイルが出てくるので,「くるまを進める」の下におく
条件の設定
③ビューワに「テスト」のカテゴリがなければ,
「基本」の左の▲▼をクリックして,「テスト」にする
④「くるまの■色が触れている色が■色」をクリック
「テスト」の横におく
⑤「くるまの」の次の■をクリック。
⑥スポイトの先で右のセンサー(ヘッドライト)をクリックして色を指定。
⑦2つ目の■をクリック。
⑧同様にして,道路の色を指定。
条件分岐は「テスト」というタイルを使います。これは,下のように,条件(質問)とそれを満た
すのときの処理,満たさないのときの処理で構成されます。
- 14 -
条件を満たさないときの処理
⑨ビューワの「基本」カテゴリを出す
⑩「くるまを回す」をクリック
⑪「でなければ」の右におく
⑫▲▼で数値を-5にする
左へ向けるにはここの
数値を-にします。
では,右のような位置に
「くるま」を置いて動か
してみましょう。
☆これで,左回りはできるはずです。この段階では,右回りはまだできません。また,それ以外にも
うまく動かないことがあります。どのようなときにうまくいき,どのようなときにうまくいかない
のかを考察してください。
- 15 -
(3)右回りもできるように
①もう1つ「テスト」タイルを出す。
②先ほどのテストタイルの下におく。
あとは先程と同じ手順
違いは2点
○センサー(ヘッドライト)は左のものを指定
○「くるまを回す」の数値は+に(これで右にまわる)
- 16 -
プログラムコードを覗いてみる
☆スクリプタ右上のメニューアイコンをクリッ
クし,「コードを文字表示」をクリックしてみ
ましょう。
右下のような表示に変わります。
(メニューの同じところをクリックすると戻り
ます)
☆これは「Smalltalk」と呼ばれるプログラム言
語です。
☆本来プログラムはこのように英文と数値の組
合せで記述するものなのですが,Squeakは,そ
れをタイルを並べるようにして組み上げてい
けるようにしたものなのです(「タイルプログ
ラミング」といいます)。
☆なお,「Smalltalk」の形式のままで直接記述す
ることもできます。
- 17 -
(1)モデル化-現実の問題の抽象化
複雑な現象(自然現象や社会現象)に向かったとき,それを考えやすくする工夫がモデル化です。
モデル化とは,現象をとらえ,その変化の予測を行うために,システム(物理現象・社会現象・人工
システム等)を構成する要素とそれらの間の関係を明確にして,その振る舞いの法則性を表現すること
です。
モデル化は,次のような手順で行います。
① モデル化の目的を明確にする
② モデル化の対象範囲を明確にする
③ 現象を決定している構成要素を取り出す
④ 構成要素間の関係を明確にして構造を決定する
⑤ 図や数式を用いて表現する
具体的には,次のような方法を用います。
○簡略化
数学では「点」を面積,長さ等の量を持たず,ただ位置のみを示すものとして扱います。直線や面も同
様にごく簡潔なものと考えています。力学では,質点という質量のみを持つ点を考えます。このように
考えることによって,計算を単純なものにしています。
○記号化
化学記号,化学式などは,化学変化を考えるのに役立っていますね。物事を,記号を使って表してい
る例は他にもたくさんあります。
○図式化
力の合成の図,ボーアモデル,人体図など数え上げたらキリがありません。図を描くのは,モデル化
の第1歩でもあります。
○偶然性のある事象には
乱数表などを用いて代用します。サイコロ,コイントス,コンピュータの乱数機能も大変に有効です。
etc.
〔4〕モデル化とシミュレーション
- 18 -
(2)シミュレーションの例
これは,座標平面で考えられます。2頭の最初の位置を A0(0,0)と B0(0,50)におきます。
ウサギはx軸上を正の向きに走り,それをキツネが追いかけるとします。
1秒後のウサギは A1(6,0)にいますので,そのときにキツネは B0から A1に向かって10の距離
の地点 B1にいます。さらに1秒後のウサギは A2(12,0)にいますので,そのときにキツネは B1か
ら A2 に向かって10の距離の地点 B2にいます。このように座標平面上で作図していくことで,軌跡を
求めることができます。キツネの軌跡を1秒単位の直線で近似していますが,これもモデル化での工夫
の一つです。
このように,紙の上でもシミュレーションができるわけですが,もしも,「1秒単位だけでなく,も
っと細かいいろいろな単位で近似してみたい」「キツネとウサギの速さをいろいろに変更してみたい」
というような要求が出てきた場合には,どうすればよいでしょう。
これも紙の上でシミュレーションできます。
駐車上の図と6台の車を想定したものを用意します。
サイコロを振って出た目の番号の車が出入りすることに
すればよいでしょう,
このような事象に対してもシミュレーションは有効
です。
〔例1〕ウサギを追うキツネ
キツネが50m前方を真横の方角に走るウサギを見つけ,追いかけはじめた。ウサギはキツ
ネに気付かずに6m/秒で一直線に走り,キツネはウサギの方向を向いて10m/秒で追いか
ける。2頭の走った軌跡はどのようになるか。
〔例2〕6台の狭い駐車場
図のような貸し駐車場があり,6人の借主がそれぞれ1台分ずつ借りている。ここでは,①
②の場所に車が駐車してあれば後ろの車は出入りできないが,図のような場合には,なんとか
出入りできる。現在,6人の借主の駐車位置は固定しているが,「駐車位置を固定しないで,奥
に入れられるときは奥の位置から駐車する」という規則にした場合,邪魔な車を移動させなけ
ればならないケースはどの程度減少するだろう。ただし,車はランダムに出入りするものとす
る。
道路
⑤
③
⑥
④
②
⑤
③
①
⑥
④
② ①
道路
- 19 -
千円札を2枚出す人が最初の方に偏れば,それだけ500円硬貨が必要になります。25枚用意すれ
ば確実ではありますが,たくさん残ることは避けたいわけです。「半々」という事柄を扱うので,コイ
ントスが使えます。実際に25回投げてみると,結果からどのようなことが分かるでしょうか。1通り
の試行で済ますだけでなく,何通りかやってみるとどうなるでしょうか。
「6割くらいは千円札を2枚出す」ことが分かっている場合や,「なるべく試行を多くしたい」とい
う場合は,どうすればよいでしょうか。
円周率というのは,決まったもの,つまり確定的なものですが,
ここでは,それを確率的な,つまり不確定的な方法で求めています。
このような手法を「モンテカルロ法」といい,この例4はモンテカ
ルロ法の代名詞ともいうべきものです。
なお,同じく確率的な方法で円周率を求めるものに「Buffonの針」
と呼ばれるものがあります(どんな方法か調べてみよう)。
モンテカルロ法そのものについて詳しく調べてみるのも面白いかも
しれません。
〔例3〕クラス会の釣り銭の用意
クラス会の幹事をやることになった。会費は1500円で出席者は25人。千円札を2枚出し
てお釣りを求める人と1500円ちょうどを支払う人が半々くらいだろうと予想すると,釣り銭
用の500円硬貨は何枚用意しておけばよいだろう。
〔例4〕円周率を実験で求める(モンテカルロ法)
地面に右下のような図を用意し,そこへゴマのような小さいものをまき,円(扇形)の内部
に落ちた粒の数を数える。たとえば,100粒まいて77粒が内部に落ちた場合,円周率はだ
いたいどれぐらいと考えられるか。
(ただし,円の面積の公式 S=πr2 は既知のものとする)
- 20 -
0.シミュレーションのための準備(1) 変数
(1)変数の作成(追加)
①オブジェクトを 1つ作る(●だけでよい)。
②スケッチのビューワを出す。
③ビューワのタイトル欄の をクリック
④「変数 1」を消して,変数名(たとえば「比」)を入力
(2)スクリプト
①「進める」「回す」のスクリプタを作る。
②「変数」カテゴリの
「スケッチの比」の右の をドラッグ
③スクリプタに貼り付ける。
④「基本」カテゴリの「スケッチの y 座標」を「スケッチの比」の後ろにつける。
⑤最後の横向き▲をクリック
⑥▲▼をクリックして「+」を「/」に変える。
⑦さらにその後ろに「基本」カテゴリの「スケッチの x 座標」をつける。
(3)変数の値をビューワ以外の部分に表示させる方法
〔方法1〕
①「変数」カテゴリの「スケッチの比」をクリック( ではなく前の方をクリック)
②背景をクリック
〔方法2〕
①「変数」カテゴリの「スケッチの比」の左の をクリック。
②メニューから,「じっくり見張る」を選ぶ。
③マウスにタイルがついてくるので,背景でクリック。
〔5〕実習 円周率を求める
☆プログラミングにおける変数は,数学の変数と同じようにいろいろな値をとり,「値の置き場」として使われま
す。Squeakでは,変数名に「 x 」のようなものだけでなく日本語も使えます。
☆ここでは,単純な「進める」「回す」のスクリプト使って,スケッチの x 座標と y 座標の比(つまり tan)の値
を変数に代入してみましょう。
☆方法2のメニューでは,数値の小数点以下の桁数も設定できます。
☆「ちょっと見張る」では数値だけが表示されます。
- 21 -
0.シミュレーションのための準備(2) 乱数
(1)乱数の使用例(オブジェクトの位置を乱数で決定)
①スクリプタのタイルパレットのアイコンをクリック
②乱数のタイル(右図○印)をクリック。
③乱数のタイルを「x座標」の後ろに貼り付ける。
④同様にして乱数のタイルを「y座標」の後ろにも貼り付けて
出来上がり。( )内の数値は 500くらいにしておきましょう。
0.シミュレーションのための準備(3) 軌跡を残す
○「ペンの使い方」カテゴリの「(オブジェクト名)のペンは下りているか」を「はい」にして使用す
ると,以後,オブジェクトの移動の際に,その軌跡を画面に残します。
○「(オブジェクト名)のペンは下りているか」を「いいえ」にして使用すると,以後,軌跡を残しま
せん。
○「(オブジェクト名)が入れ物のペン軌跡をすべて消す」で軌跡が消えます。
「乱数」とは,出現に規則性のないランダムな数のことで,通常,コンピュータでは「疑似乱数」
が用いられます(これは完全な乱数ではないが,必要な範囲内で乱数とみなせるものです)。
サイコロの目のように偶然的な事象を表すのに,乱数はもってこいです。
■Squeakの「乱数」について
☆「random(600)」とすれば,1~600の間の整数値をランダムにとります。
☆「random(6)」とすれば,1~6の間の整数値をランダムにとります。つまり,サイコロを振ったときと同じです。
☆工夫次第でいろいろな範囲の乱数を作ることができます。
たとえば2×「random(6)」とすれば,2,4,……,12という偶数の乱数になります。では奇数の乱数は?
■Squeak以外の言語での乱数について
☆よく見られるのが 0~1の間の小数値をランダムに取るものです。
☆これを用いて,サイコロの目のようにランダムな 1~6の整数値を得るには,どうすればよいでしょうか。
- 22 -
1.シミュレーションの実際
(1)図の用意
*他の描画ツールで右のような正方形と4分
の1円の組合せの図を描いておきます。
①ナビゲータの読み込みのアイコンを長押し
して,「任意のファイルを開く」を選ぶ。
②図のファイルを選び「OK」をクリック
③「キャンセル」でファイル選択の窓を閉じ
る。
④図のハロを出し,名前を「枠」にしておく
⑤ハロの右側の「描き直し」のアイコンを
クリック
⑥図の2つの領域をともに「むしょく」で塗
りつぶす
⑦「OK」をクリック
(2)ゴマの用意
①ペイントツールで「●」を1つ描いて「OK」。
(小さいものでよい)
(3)変数の用意
①「●」のビューワを開く。
②次の6つの変数を作成
pai……計算で求めた円周率
x1……ゴマのx座標
y1……ゴマのy座標
内部……扇形の内部に落ちた数
総数……ゴマを投げた総数が入ります
距離……ゴマと原点(左下端)の距離
③「pai」を小数点以下3桁表示にする。
☆ゴマの軌跡は背景に描かれるので,⑤⑥の操作で図を「むしょく」=透明にしています。
☆ここでは図のサイズを300×300[ピクセル]としています。
☆ゴマは1粒ずつまきます。1つ小さなスケッチを用意し,その位置(座標)を乱数で決定して「ペン」でその
位置に印を付けます。変数もたくさん使います。
- 23 -
(4)スクリプト
①図のようにつくりましょう。
②「総数」「内部」「pai」の3変数を「じっくり見張る」にする
(5)軌跡等をクリアするスクリプト
①軌跡を消去するスクリプトを作成。
②「●」のビューワから,「総数」「内部」の2つのタイルを貼り付ける。
③それぞれ値を0にする。
図のサイズに
合わせます
枠内に●を移動
「点に近い線」を描画
(1[ピクセル]だけ)
「距離」には枠の左下からの
距離の2乗が入る
円周率の計算
☆軌跡をクリアするスクリプトを作ります。ここでは,「総数」などの変数の値も初期値に戻します。
2つとも値を0に
- 24 -
2.ボタンで操作する
〔スタートボタンの作成〕
①ナビゲータの「部品」アイコンをクリック
②「ボタン」のアイコンをクリック&クリックで
画面に配置。
③ボタンのハロを出し,「メニュー」のアイコンを
クリック。
④メニューの「ラベルを変更」をクリック。
⑤ラベルを「スタート」に変更。
⑥「スタート」ボタンのハロを出し,ビューワを表示。
⑦「スクリプト」カテゴリの「ボタン空スクリプト」を
ドラッグして,スクリプタを作る。
⑧スクリプタの名前を「スタート」に変更。
⑨時計アイコンの右の「ポーズ」などが表示される部分
をクリックし,「マウスアップ」に変更する。
⑩「スケッチ」のビューワを出し,「スクリプティング」
カテゴリを出す。
⑪「スタート」のスクリプタに,「スケッチをスタート
する▲▼空スクリプト」を貼り付ける。
⑫「空スクリプト」をクリックして「スクリプト1」に変える。
*これで,「スタート」のボタンのクリックで「スクリプト1」が動き出します。(スクリプト1が
「チクタク」(繰り返し実行)の状態になります)。
〔他のボタンの作成〕
*「スタート」のボタンと同様にして,「ストップ」「クリア」のボタンも作ろう!
スクリプトの実行は,時計アイコンだけでなく,「部品」タブにある「ボタン」でもできます。
操作性の向上や画面の簡素化に役立ちます。
「マウスアップ」にすると,そのオブジェ
クトをクリックし終えた瞬間にスクリプ
トが動き出します。
- 25 -
(1)いろんな運動
物体の運動にはいろんなものがあります。
①等速直線運動
②円運動
③物体の落下運動,物体を投げたときの運動
④振り子の運動
⑤惑星のような楕円運動 等々
①②はこれまでにすでに扱いましたが,その他の運動も計算式(数式モデル)などがわかればシミュ
レーションすることが可能です。また,計算式(数式モデル)を予測して,それを用いてシミュレーシ
ョンを行い,実際のものとの差異を調べることもあります。
(2)シミュレーションの手法
物体の動きをみるときには,その視点により考え方が変わってきます。たとえば円運動でも,次の視
点があります。
①物体から見ると ……常に一方に曲がりながら進んでいる
②物体から離れて見ると……ある点から一定の距離のところを動いている
①の方は,Squeakの得意とするところですね。②の方では座標を使うことが多いのですが,円運動の
場合,原点を中心に半径 r の円上を動く物体の t 秒後の位置は ktrx cos , ktry sin (ただし,k は
定数)のようにして表されます。こうして,x座標,y座標を出せれば,運動シミュレーションが可能
です。
(3)シミュレーションの手順
概ね次のような流れになります。
現象(現実の動き)
↓
モデル化(簡略化・数式化など)
↓
コンピュータ上で再現
↓
条件をいろいろ変えて考察
〔6〕実習 運動シミュレーション
- 26 -
1.落体の運動
(1)絵(スケッチ)の作成
①ナビゲータの描画ボタン( )をクリック
②ペイントツールを使って描画
(ここでは,「●」だけで十分です)
③完成したら,「OK」ボタンをクリック
(2)スクリプトの作成①
①ハロを出し, をクリックしてビューワを出す
②最上段の をクリック
③変数名を半角で「 t 」と入力
④「基本」カテゴリから,「スケッチのx座標」の
右の をドラッグしてスクリプタを作成
⑤スクリプタのタイトルを「初期化」に変える
⑥「基本」カテゴリから,「スケッチのy座標」を
スクリプタに貼り付ける
⑦「変数」カテゴリから,「スケッチの t」をスクリプタに貼り付ける。
⑧x座標,y座標,tの値をそれぞれ,100,600,0にする。(y座標の「600」は画面解像度に応じて調整)
*一度 をクリックして実行してみてください。
☆物が落下するとき,時間を t ,落下距離を y とすると,2
21 gty という関係式で表すことがで
きます。 g は重力加速度で,およそ 9.8が標準の値です。ここでは, 521 ≒g としています。
物体の位置(座標)の計算をするときには,
物体は質量を持つ「点」として扱います。
ここでは,点にすると見えにくいので,すこ
し面積のあるものにしています。
物体の最初の位置を決めましょう。また,時間の変数 t をつくり,最初の値として, 0t として
おきましょう。
これが動く
(落体)
- 27 -
(3)スクリプトの作成②
①「変数」カテゴリから,「スケッチの t」の右の をドラッグし,新しいスクリプタを作る。
②スクリプタの名前を「運動」に変更。
③「 t 」の前の▲▼をクリックして「 t に以下を足す」に変更。
④数値をクリックし,0.2を入力。
⑥「スケッチのy座標」を貼り付け,下の図のようにする。
*時間の刻みや加速度をいろいろ変えてみて動かしてみましょう。
2.物を投げ上げる
(1)初期位置の変更
上方のスペースを確保するために,はじめの
位置を少し下げます。
①「初期化」「運動」それぞれのスクリプタの
2箇所の「600」を「400」に変更
(右図,下図の★印部分
もっと小さい数字でもかまいません)
(2)初速の追加
②「運動」スクリプタの2行目に初速 t50 に相当するスクリプトを追加します。
600の位置から落ちるとすると,y座標は25600 t となります。また,時間を小刻みにすると細
かく座標を求められ,動きが滑らかになるので,ここでは 0.2秒単位にしています。
物を投げ上げる場合,初速をたとえば毎秒 50とすると,y座標に t50 を加えるだけで OKです。
★
★ 追加部分
- 28 -
3.横方向の動きも入れる
(1)x軸方向の動きを追加
①「運動」のスクリプトに1行追加します。
(2)発射角度を考えよう
☆横方向は x 軸方向ですね。ものを投げるとき,横方向は等速運動になると考えると, tx 10 というような式
で表せます。
この1行です
○たとえば,初速を毎秒50,発射角度を とするなら,x軸方向は
速度 cos50 の等速運動に,y軸方向は初速 sin50 の運動になり
ますから,この部分だけを書き換えればいいだけです。
○Squeakには三角比計算の機能がありませんので,三角関数表などを使って,手計算で sin50
などの値を出して,スクリプトに書き込むという手法が近道です。これなら,もう手を加える
必要はありません。
○なお,Smalltalk には三角比の計算の機能が備わっていますし,また,Smalltalk を使わなく
ても,画面上で一定の角度で図を動かして,そのときに座標の変化から三角比を計算する方法
もあります。
cos50
sin50 50
Smalltalk と Squeak
Squeakは Smalltalkのプログラムを初心者でもつくりやすいようにしたものですが,Smalltalk
のすべての機能をカバーしているものではありません。ですから,Smalltalk でならできるが,
Squeakのタイルプログラムではできない機能もあります。
スクリプタのメニューから Smalltalk の画面にしたとき,そこでは三角関数などの Smalltalk
の豊富な関数が使えます。しかし,いったん Squeak にはない関数を用いてプログラムを書いた場
合,そのスクリプタはタイルプログラムには戻れなくなります。
- 29 -
4.手を加える
(1)三角比の計算をできるようにする
○前頁で紹介したように,作図から求める工夫を研究してみましょう。
○三角比の計算ができたら,初期値のスクリプトに入れます。
(2)飛距離が出せるように
「物体は,何度の角度で投げ上げるのが一番遠くまで投げられるのか」をシミュレーションで求める
ためには,飛距離の測定が必要です。やり方には次のようなものがあります。
○変数を一つ用意し,物体のy座標の値がはじめのy座標(初期値)よりも大きい間だけ,その変数
にx座標の値を代入する。
・「条件分岐」の利用です。
○目盛りを用意し,飛距離を目で読み取る。
・目盛りは「ペイント」で作るのがいいでしょう。
・目盛りの画像は,「初期化」のスクリプトの中で,位置を決めてやればいいですね。
・モンテカルロ法で用いた「ペンをおろす」を利用すると,軌跡が残るので,読み取りやすくな
りますね。
*現実には「空気抵抗」というがありますから,たとえばx軸方向の速度が徐々に落ちるようにする
という工夫もアリです。また違った結果になります。
(3)壁に当たって跳ね返るように
これを座標の考えで押し通すとどうなるでしょう。
最初に作った物体の落下を地面で跳ね返るようにしてもいいですね。そのときは,100%跳ね返る
のではなく,90%程度にしたらどうなるかなどを試みてみるのもいいでしょう。
- 30 -
以下は授業では扱いませんが,この他にも様々なことが Squeak上でプログラミングできます。Web上
の資料や書籍(図書館にもあります)などを用いて理解を深め,プログラミングの幅を拡げてください。
1.Squeakのアニメーション
(1)オブジェクトの画像に他のオブジェクトの画像をあてはめる
「画像」カテゴリのタイルを使って図のように
すれば,「スケッチ」に「スケッチ1」の画像をあ
てはめることができます。(図の場合,●が★にな
ります。
「スケッチ元画像にもどす」を実行すれば,元に
戻すこともできます。
(2)画像をたくさん用意する
画像を次々入れ替えればアニメーションができ
ますが,順序など指定するのが大変です。
「部品」の中にある「入れ物」はドラッグでオ
ブジェクトを格納できます,
オブジェクトを格納すると,図のように「カーソル」
と呼ばれる枠が表示されます。この枠で,オブジェクト
を指定します。
具体的には,次のようなスクリプトにすれば,別に用
意したオブジェクト「スケッチ」に,「入れ物」内のオ
ブジェクトの画像が次々表示されます。
*「入れ物」にたくさんのオブジェクトを格納すると大きくなってしまいますが,サムネイル表示も可
能です。探してみよう。
*右図のような絵を用意して,「入れ物」のカーソル位置を1~6
の乱数で決定すれば,さいころの出来上がりです。
〔7〕参考
(入れ物)
ドラッグ
カーソル
「入れ物のカーソル位置…」
のタイルは「集合」カテゴリ
にあります。
(スケッチ) (スケッチ1)
- 31 -
2.オブジェクトに別のオブジェクトをくっつける
(1)オブジェクトをくっつける
①ペイントツールを使って右のような2つのオブジェクト
をつくり,名前をそれぞれ「丸」「星」にしておく。
②「丸」のハロを出し, のアイコンをクリック。
③メニューの中の「ドロップを受け入れるか」をクリック。
前の□の中を黒くする。
④★をクリック,「丸」の上(なるべく端)におく。
(2)オブジェクトを回転させながら横移動する
①スクリプタを右のように作成する
*x座標を増やしていけば,オブジェクトの
向きにかかわらず,横移動します。
*あと,以下のようにして星の軌跡を描くようにすれば,このページの冒頭の螺旋模様が描けます。
①星のビューワを出す
②「ペンの使い方」カテゴリを出す
③「星のペンが下りているか」を「はい」にする
☆オブジェクトに別のオブジェクトをくっつける
と右のような図形も描くことができます。図は,
★の軌跡です。
〔くっつけた★のハロを出すには〕
○★を指して,[Alt]+クリック(または右クリック)を2度行います。
- 32 -
- 33 -
第 2章 Excel VBA編
- 34 -
1.Excelの基礎事項
(1)計算式の入力
○最初に「=」を入力し,次に計算式を続け,最後に
Enterキーを押します。
(例)1+2 ⇒ =1+2 と入力
3-1 ⇒ =3-1
2×3 ⇒ =2*3 (*……アスタリスク)
6÷2 ⇒ =6/2 (/……スラッシュ)
32 ⇒ =3^2 (^……アッパーアロー,ハット,キャレット等)
○数値の代わりにセル番地を入力して,そのセルの値を使って計算させることもできます。
(例)=a1+b1-3 ←a1のセルの値と b1のセルの値の和から3を引く
この場合,a1や b1のセルの値を変更すると,この式の計算結果も自動的に変わります。〔自動再計算〕
○「乗除優先」といった計算規則も通常のものと同じ。カッコ()も使えます。
ただし,中カッコ{},大カッコ[]の記号は使わず,()を重ねて使います。
(例)1-2×{3-(4+5)} ⇒ =1-2*(3-(4+5))
(2)セル番地を用いた計算式のコピー
○セル番地を用いた計算式をコピーすると,コピー先の計算式のセル番地は自動的に変わります。
(例)①右のように入力。
②c1のセルの式を c2にコピー。
③c2のセルの式は「=a2+b2」になる。
○コピーでセル番地が変わらないようにもできます。
(例)①セル番地を$a$1 のようにする。
②これでコピーしても変わらない。
*「$a1」「a$1」とすると,それぞれ,Aだ
けが固定,1だけが固定になります。
*「$」の入力が面倒ならば,「a1」のとこ
ろにカーソルを合わせ,F4キーを押すと,
「$a$1」になります。
さらに F4キーを押していくと,「a$1」→「$a1」→「a1」と変化していきます。
〔1〕Excelの基礎
数式バーに
式が表示さ
れる
セルには計算結果が
表示される
- 35 -
(3)関数の利用
○関数の使用法……計算式と同じく=から始めます。計算式の途中にも使えます。
(例)=sin(1) …… 正弦の値を返します。(引数は 1,戻り値は )841471.0(1sin の値)
*角度は,一周を360°とする「度数法」ではなく,一周を2πとする「弧度法」です。
(360°=2π[ラジアン])
*次のようにすれば sin30°の値を求めることができます。
=sin(radians(30))
(radiansは度数を弧度に直す関数)
○関数の一例……()の中が引数
abs(数値) ……数値の絶対値を返す
mod(数値,除数) ……数値を除数で割った余りを返す
sqrt(数値) ……数値の正の平方根を返す
log(数値,底) ……数値の対数を返す(例:log(8,2)とすると 3を返します。)
sum(数値 1,数値 2,...) ……数値の合計を返す
average(数値 1,数値 2,...) ……数値の平均を返す
min(数値 1,数値 2,...) ……数値の中の最小値を返す
max(数値 1,数値 2,...) ……数値の中の最大値を返す
rank(数値,範囲) ……範囲内における数値の順位(何番目に大きいか)を返す
*小さいほうからの順位にもできます
countif(範囲,検索条件) ……指定された範囲に含まれるセルのうち,検索条件に一致するセ
ルの個数のカウント値を返す
left(文字列,文字数) ……文字列の左から指定された文字数分を抜き出して返す
mid(文字列,開始位置,文字数)……文字列から任意の部分を抜き出して返す
search(検索文字列,対象文字列,開始位置)……対象文字列に含まれる検索文字列を検索し,
その文字列の左端からの位置を返す
Excelでは,計算式に「関数」と呼ばれるものを利用することができます。関数は,数値やセルの範囲(複
数の数値)を指定する(関数の「引数」という)と,値を返す(「戻り値」という)もので,様々な種類がありま
す。この関数を使いこなすことで,Excelの活用の幅が大きく広がります。
セルを範囲で指定
○a1:c2のように記述すると,a1と c2のセルを
両端とする長方形の領域を指定することができます。
(a1:a20のように 1行で指定することもできます。)
○=sum(a1:c2) とすると,この領域のセルの値の合計を計算することができます。
数値の代わりにセル番地を指定できます
○計算式と同じように,関数に数値を入れる代わりにセル番地を入れることができます。
○=abs(a1) とすると,a1のセルの値の絶対値を求めることができます。
- 36 -
(4)if関数
○条件を満たすか満たさないかで,セルの値(戻り値)を変えることができます。
if(〔条件式〕,〔条件が真の時の戻り値〕,〔偽のときの戻り値〕)
(例)=if(b2>5,1,2)
もし,セル b2の値が5より大きければ
このセルの値は1,そうでないときは2
○セルの値を文字列にしたいときはダブルクォーテーション""
ではさみます。
(例)=if(b2>5,"優","良")
○if関数を重ねて使うと3つ以上の場合分けもできます。
(例)=if(b2>5,"優",if(b2>3,"良","可"))
セル b2の値が5より大きければこのセルの値は「優」,3より大きく5以下なら「良」,
3以下なら「可」となる。
数値と文字列
○Excelでは数値だけでなく,言葉もデータとして扱います。この言葉を「文字列」といいます。
○同じように数字で表示されたデータでも,数値データなのか文字列データなのかで扱いが異なりま
す。例えば,数値データを入れるべき関数に文字列データを入れてしまうとエラーになることがあ
ります。
○セルに「01」という文字列を入れたい場合,普通に入力するとExcelが自動的に数値の1とみ
なしてしまいます。こんなときは先頭にシングルクォーテーションを入れて「'01」と入力すると,
Excelは文字列の「01」として扱います。
先頭の「'」はそのセルが文字列であることを示します。
- 37 -
2.Excelでサイコロを作ろう(乱数)
〔作り方〕
適当なセルに以下のように入力します。
=int(rand()*6)+1
〔使い方〕
[F9]キーを押すたびに値が更新されます。
〔解説〕
○rand()は0から1の間のランダムな値を取る関数(引数はなし)。
○int(数値)は数値の小数点以下を切り捨てる関数。
○次のような仕組みでサイコロの働きをします。
・rand() ……0~1の値
・rand()*6 ……0~6の値
・int(rand()*6) ……0,1,2,3,4,5 のいずれかの値
・int(rand()*6)+1 ……1,2,3,4,5,6 のいずれかの値
◎「6」を別の数字に変えれば,5までしかないサイコロや17まであるサイコロ等いろいろなサイ
コロが作れます。
同じ目が続いたとき,画面が変わらないのがちょっとという人は……
F9キーを押すことで変化する要素を加えると「新しく出た目だな」という感じがするでしょうか。
①適当なセルに「=now()」と入力。
②そのセルを右クリック。
③「セルの書式設定」を選択。
④「表示形式」で「時刻」,「13:30:55」と選択。
*これでも,1秒以内にF9キーを連打してしまうと画面は変わりませんが……。
Excelの「乱数」の機能を使えば,サイコロ(と同じ機能のもの)が簡単に作れます。
F9キーは「再計算」
○F9キーを押すとシートのすべての計算式が改めて計算されます。
○RAND関数の場合は,新しい乱数値をとります。
- 38 -
3.サイコロの目を集計する実験のシミュレーション
(1)COUNTIFについて
COUNTIF(範囲,検索条件) ……指定された範囲に含まれるセルのうち,検索条件に一致するセ
ルの個数をカウント
(例)=COUNTIF(A1:A10,50) ……A1~A10のセルの中で値が 50であるセルの個数
=COUNTIF(A1:A10,"ABC") ……A1~A10のセルの中で値が「ABC」であるセルの個数
=COUNTIF(A1:A10,">50") ……A1~A10のセルの中で値が 50より大きいセルの個数
=COUNTIF(A1:A10,"<=50") ……A1~A10のセルの中で値が 50以下であるセルの個数
(2)COUNTIFを使ってみよう
○L4のセルに COUNTIF関数を1つ入れるだけです。
*度数分布表なども作れますね。
ちょっぴり工夫が必要です。
度数分布用には FREQUENCY という関数もあります。
下の図のように100個の数値データがある。この中で,50より大きい数値の個数を求めてみよう。
COUNTIFを使えば,「サイコロの目を集計する」という確率の実験のシミュレーションができます。
- 39 -
(2)サイコロの目の集計
〔作り方〕
①A1のセルに以下のように入力します。
=int(rand()*6)+1
②これを A100までコピー。
③右のように入力。
・「目」「回数」はセンタリングしておきましょう。
④罫線を引いておきましょう。
ア)ドラッグで範囲指定
イ)範囲内を指して右クリック
ウ)「セルの書式設定」を選択
エ)「罫線」タブをクリック
オ)線種を選び,「外枠」「内側」をクリック
カ)「OK」をクリック
サイコロの目
A100まで
- 40 -
⑤F3に次のように入力。
=countif($a$1:$a$100,1)
* ボタンや F4キーの使い方に慣れておきましょう。
⑥ ⑤で入力したものを F4~F8にコピー。
⑦F4のセルにセルポインタを合わせて F2キーを押すと
セルの再編集ができるので,末尾付近の1を2に修正。
⑧F5~F8のセルにも⑦と同様のことを行う。
〔使い方〕
[F9]キーを押すたびに値が更新され,実験を繰り返すことができます。
*サイコロを1万回投げる実験も容易にできますね。
*⑤の式に少し工夫すると⑦⑧の作業が不要,つまり,コピーするだけで出来上がりになります。
どうすればよいでしょう。
〔課題〕
○サイコロを2個投げ,目の和の値をカウントする試行を100回繰り返す実験のシミュレーショ
ンのシートを作成せよ。
○グラフをつけてみよ。
*ここまでのところがしっかり理解できておれば,「10個のサイコロを振り,その目の和をカウント
する試行を10000回行う実験のシミュレーション」というシートもすぐにできます。
目 目 和
100行作る
- 41 -
1.マクロの基礎
(0)マクロの編集がしやすいように Excelの設定を変更する
①「Officeボタン」をクリック。
②「Excelのオプション」ボタンをクリック。
〔「Excelのオプションの窓が開く〕
③左側の領域で「基本設定」をクリック。
④「[開発]タブをリボンに表示する」をクリック
してチェックを入れる。
⑤「OK」ボタンをクリック。
「マクロ」とは一口で言うと「処理の自動化」です。通常,セルに入力したり,メニューから選択したりして
操作をしますが,その手順を記録あるいはあらかじめプログラムしておいて,これを呼び出すことでこの手順を
まとめて実行できるようにしたものです。
Excel は,関数やメニューの使い方を覚えるだけでなく,マクロを使いこなすことで,処理の効率を飛躍的に
向上させることができます。
Excelのマクロで使われる言語を VBA(Visual Basic for Application)といいます。
〔2〕Excelのマクロ
Excel2007 の初期状態では,リボンにマクロ関係の項目がほとんど表示されません。そこで,リボンにマクロ
編集に関わる「開発」というタブが表示されるようにします。
①
② ③
④
- 42 -
(1)選択した範囲の周りに罫線を引くマクロ-「マクロの記録」の使い方
①リボンの「開発」-「マクロの記録」を選択。
②次のような窓で,「ショートカットキー」欄を
クリックし,[Shift]キーを押しながら[A]を押す。
③「OK」をクリックすると窓が消える。
(ここから作業がすべて記録されるので慎重に!
罫線を引く作業のみを行う)
④セルポインタのあるセルを右クリック。
⑤「セルの書式設定」を選択。
⑥「罫線」タブをクリック。
⑦線種を選択し,「外枠」をクリック。
⑧「OK」をクリック。
(これで罫線が引けた 記録はここまで(上の□))
⑨下のように,「マクロの記録」ボタンが
「記録の終了」ボタンに変わっているので
それをクリック。
*これで,次から範囲を選択して [Ctrl]+[Shift]+[A] キーを押すと範囲の周りに罫線が引かれます。
(上の□で囲まれた④~⑧を記録したマクロを呼び出したことになります。)
セルを複数選択すると,その周りに罫線が引かれます。
*やり直すときは,一旦マクロを消して,再度試みればよいです。
マクロの作成方法の一つに「マクロの記録」があります。「今から行う作業を記録せよ」という状態にして作
業を行うと,その間の作業手順がすべてマクロの形で記録されます。次からは簡単な操作でこの記録した作業を
呼び出すことができ,まったく同じ作業を繰り返すことができます。
マクロ名は自由につけ
ることができます
- 43 -
(2)マクロについて
1.ショートカットキー
○記録したマクロを起動させるキー操作です。
○[Ctrl]+[アルファベット] か [Ctrl]+[Shift]+[アルファベット] が使えますが,[Ctrl]+[アル
ファベット]は,Excelでも使うことが多いので,[Ctrl]+[Shift]+[アルファベット] を利用するの
がよいようです。([Ctrl]+[Q]もよく使われます)
○リボンから「開発」-「マクロ」→「実行」でもマクロを起動することができます。
2.起動時のチェック
○マクロを含む Excel ファイルを開くと起
動時に右のようなメッセージが表示され
ます。
○これは,マクロが非常に多様な機能を持
ったプログラム言語であり,コンピュー
タウイルスさえ作成可能であるため,警
戒を促すものです。
○表示の右端の「オプション」ボタンをクリックします。
〔マクロを使用する場合〕
・「このコンテンツを有効にする」
をクリック
〔マクロを使用しない場合〕
・「不明なコンテンツから保護する」
をクリック
3.マクロを見る・編集する
○リボンから「開発」-「マクロ」→「編集」を選択
○編集の窓を終了するときは,この窓の×ボタンをクリック
4.マクロを保存する・呼び出す
〔マクロを保存する・呼び出す〕……シートのデータとして,シートといっしょに保存されます。
〔別ファイルとしてマクロを保存する〕
マクロの編集画面でメニューの「ファイル」-「ファイルのエクスポート」を選択
〔保存してあるマクロを呼び出す〕――あるシートで作ったマクロを別のシートで使うことができます
マクロの編集画面でメニューの「ファイル」-「ファイルのインポート」を選択
- 44 -
2.たくさんのセルに対して操作を行う
(1)1つのセルに色を着けることをマクロにする
①セルポインタを(数字のない)適当な位置に合わせる。
②リボンから「開発」-「マクロの記録」を選択。
③「マクロの記録」の窓で「ショートカットキー」欄をクリックし,[Shift]キーを押しながら[A]
を押す。
④「OK」をクリックすると窓が消え,これでマクロの記録の状態になる。
⑤ アイコンの「▼」をクリック。
⑥好みの色をクリック。
⑦「記録の終了」ボタンをクリック。
○下のようなマクロができています。
○これで,Ctrl+Shift+Aでセルポインタのあるセルに色がつきます。
マクロでは,処理を自動化するだけでなく,連続して繰り返し行うこともできます。下の図のように100個の数
値データの中で,50より大きい数値のセルすべてに色を着けてみよう。
’で始まる行は機能しない
メモ(「コメント」という)として使われる
ここの数字が色を表す
この数字をいろいろ変えてみよう!
この辺りは「マクロの記録」
の準備です
- 45 -
〔解説〕
○「Color」の数値は,青(B),緑(G),赤(R)の強さを表す 0~255の数値から決まります。
Color=B×2562+G×256+R
(例)赤……255 (B=0,G=0,R=255)
黄……65535 (B=0,G=255,R=255)
(2)指定したセル(A1)の色を変える
①右のように1行追加する。
〔解説〕
○Range("範囲").Selectは範囲指定の命令。
・範囲は1つのセルでも,A1:C3のような形式
でもどちらでも可
(3)値が50を超えるならセルの色を
変える(If文による条件分岐)
①右のように書き加える。
〔解説〕
○ActiveCell.Value はカーソル位置のセルの値を
指す
・ActiveCell.Value=30のようにしてセルの値を
設定することも可能
・Range("A1").Valueとしても結果は同じ
○Ifは条件による分岐
If (条件式) Then
(条件式が成り立つときの処理)
Else
(条件式が成り立たないときの処理)
End If
(4)左端(A列)のセルすべてを操作する
(For~Next文による繰り返し(ループ))
①右のように2行書き加え,Rangeの行は少し修正
する。
今回は Else の部分は処理
がないので省略しています
Squeakのテストタイルとそっくりです
- 46 -
〔解説〕
○For~Nextはその間の処理を繰り返す「ループ」
For 変数=初期値 To 終値
(処理)
Next
・繰り返し回数をカウントする変数の値が,処理を1回行うごとに増え,終値に達するとループは終
了します。
○CStr(数値)は数値を文字データに変換します
・「数値」の部分は変数でもよく,ここでは I の値が1~10まで変わっていくので,「1」~「10」
という文字データになります。そして前の"A"と結びついて A1~A10というデータになります。
(5)すべてのセルを操作する
①右のように For~Nextループを2重にする。
②「Range」の行も少し修正。
〔解説〕
○For~Nextは多重にできる!
・今回の場合
変数 Jは1~10の値をとる
変数 Jが1,2,……のとき,それぞれ
変数 Iは1~10の値をとる
(中のループを10回実行)
○Chr(数値)は文字を文字コード(Asciiコード)を用いて表す。
・ここでは Jの値1~10に A~Jの文字を対応させなければならないので,これを使います。
・Aの文字コードは65,Bの文字コードは66,…… です。
★ここで扱った条件分岐とループはプログラムの大きな要素です。
★分岐やループの構文は他にもあります。
(「〔4〕Excel ワンポイント」の「4.動画を実現する」の項に「While ~ Wend」によるループの例があり
ます)
- 47 -
3.サイコロの目の数を集計する実験のシミュレーション
(1)1回ずつサイコロを振る
①まずはシートに次のように入力しましょう。
②G3のセルに以下のように入力。
=IF($B$2=E3,1,0)
③これを G8までコピー。
*あとは G列のデータを F列に加算するマクロを組みます。
④マクロの記録を開始。
・ショートカットキーはいつものように Ctrl + Shift + A
⑤G3~G8をドラッグで範囲指定。
⑥範囲を指して右クリック。
⑦「コピー」をクリック。
⑧F3のセルを指して右クリック。
⑨「形式を選択して貼り付け」をクリック。
⑩「値」と「加算」を選択して「OK」を
クリック。
⑪マクロの記録を終了。
普通に表を使っても「サイコロの目の数を集計する」という確率の実験のシミュレーションができましたが,
「とても大きな表になる」という短所がありました。マクロを使うとその短所を補えます。
いつものや
つです
SUM を使いまし
ょう
- 48 -
*次のようなマクロができています。
(2)B1セルで指定した回数だけサイコロを振る
①下のように書き加えます。
〔解説〕
○繰り返しは For~Nextでできるので,回数を B1のセルから読んでいます。
○Kaisuは変数で,B1のセルの値を格納します。
・直接,For I=1 To Range("B1") として Kaisuのような変数を使わなくてもかまいません。
〔課題〕
○サイコロを2個投げて,目の和の値をカウントする実験のシミュレーションのシートを作成せよ。
○グラフをつけてみよ。
「形式を選択して
貼り付け」の部分
ですね
- 49 -
1.シートでモンテカルロ法(マクロを用いない方法)
(1)作成例
○次のようなシートを作ります。
右のような図形上に乱数で座標を定めた点をとっていったとして,
全体の点の数と円の内部の点の数とを比較して,円周率の近似値を
求めます。
(2)作成の実際
○1行分の式を入れてコピーするだけです。
○C2のセルの「^2」は 2乗の意味です。
○D2のセルには,いろいろな式が考えられます。一例は次のようなものです。
=AVERAGE($C$2:C2)*4
*「$」の使い方は以前に説明した通りです。
〔3〕Excelによるシミュレーション
円周率を求めるモンテカルロ法は,Excelでももちろん可能です。そしてサイコロのシミュレーションと同
じく,マクロを使わないものとマクロを使うもののどちらも考えられます。いろいろやって特性を比較し,理解を
深めよう。
1
座標は乱
数です
点が円の内側なら「1」,そう
でないなら「0」になります
それぞれの行までの段階の点
の総数と内側の点の数から円
周率を計算します
行をコピーするだけで試行回数を増
やせるようにします。
=RAND() =RAND() =IF(A2^2+B2^2<1,1,0)
ここが工夫のしどころ!
他にもいろいろな式を考えよう!
- 50 -
2.マクロでモンテカルロ法
(1)表部分
○右のような表です。
式を入れるのは3ヵ所。
○「試行回数」欄の数は,試行の際に適宜入力します。
○「内側」「全回数」欄には,マクロで数値を入れて
いきます。
○「円周率」欄に if関数が入っていますが,どのよ
うな処理をしているのか考えよう!
(2)マクロの作成
①リボンから「開発」-「マクロ」 を選択。
②「マクロ名」欄にマクロの名前(任意につけるこ
とができる。ここでは一応「Main」)を入力。
③「作成」ボタンをクリック。
④下のように入力。
*ショートカットキーの設定ができていないのでしておきましょう。
⑤入力ができたら,シート画面に戻り,リボンから「開発」-「マクロ」 を選択。
⑥「オプション」をクリックし,ショートカットキーを「Ctrl+Shift+A」に設定して「OK」。
⑦「マクロ」の窓を閉じる。
マクロと表の機能を組み合わせて,指定回数の試行を行えるものをつくりましょう。
=RAND()
=RAND()
=IF(B5=0,"---",B4*4/B5)
今回は「マクロの記録」は使わず,すべて打ち込みましょう。
- 51 -
〔解説〕
○Ifのところで点が円の内部にあるかどうかを判定しています。
○代入式「a=a+1」
・これは数学では成り立たない式ですが,プログラムではよく使われる形です。
・この場合「=」は「右辺の計算結果を新たに左辺に代入
する」という意味になります。
Range("B4").Value = Range("B4").Value + 1
新たに B4に代入 ← 古い B4の値で計算
(3)数値をクリアするマクロ
①リボンから「開発」-「マクロ」を選択。
②「マクロ名」欄にマクロの名前(今度は「Clear」)を入力。
③「作成」ボタンをクリック。
④右のように入力。(Cellsを使ってもいい)
⑤ショートカットキーを「Ctrl+Shift+C」に設定。
3.ユーザーインターフェースを考えよう!
○次のようなことを考えよう。
・画面に機能や操作の説明を入れる。(→)
・操作(入力)部分と表示(出力)部分を明確に分けるなど配置に工夫する。
・操作部分をコンパクトにまとめるなど無駄な動作を減らす。
・見せる必要のないものは見せない。
・ボタンなどのグラフィカルユーザーインターフェース(GUI)を効果的
に利用する。
「Range」の代わりに「Cells」も使える
○「Range」は範囲(複数のセル)を,「Cells」は1つのセルを指定します。
○「Range」と「Cells」では,指定の仕方が異なります。
Range("B4") ⇔ Cells(4,2) ……列を数で表し,行・列の順序も逆
試行を繰り返すときは,「内側」「全回数」の数値を「0」にリセットしないといけませんね。
作ったプログラム等を他人に使ってもらうときには,「使いやすさ」「わかりやすさ」に配慮する必要がありま
す。「ユーザーインターフェース」の良し悪しは作品の値打ちを大きく左右することもありますし,場合によって
は一番の悩みどころにもなることもあります。
Squeakの「~に以下を足す」と同じ
- 52 -
4.ボタンの利用
(1)ボタンの配置
①リボンから,「開発」-「挿入」を選択。
②「ActiveXコントロール」の「コマンドボタン」の
アイコンをクリック。
③ドラッグで長方形を描く要領でボタンを描く。
④ ①②③をもう一度繰り返して,2個目のコマンド
ボタンを描く。
*ボタンは,配置後も位置やサイズを変更することが
できます。
(2)表示の変更
①1個目のコマンドボタンを右クリックして,「プロパティ」
を選択。
②「Caption」欄の「CommandButton1」を消して「実行」に
書き換える。
③「Font」欄をクリック。
④右に出てくる をクリック。
⑤フォント設定の窓が表示されるので,「MSゴシック」と
「11ポイント」に設定して,「OK」。
(⑤の設定は一例。使いやすさを考えて自由に設定してよい)
⑥2個目のコマンドボタンをクリックし,②~⑤を繰り返して「クリア」の表示に変える。
ショートカットキーを使う代わりに,ボタンのクリック
でマクロが作動するようにします。マクロは既に作ってあ
るものを呼び出します。
「プロパティ」の欄は,部品の様々な設定が一覧にして表示されますし,ここで設定を変更することもできま
す。今回設定した以外にも,「背景色」,「文字色」,「マウスを重ねたときのポインタの形状」,「影をつけるかど
うか」などの設定ができます。
設定事項の表示や変更を行うという点では,Squeakの「ビューワ」に似ていますね。
- 53 -
(3)クリック時の動作の記述
①「実行」のボタンをダブルクリック。
(または右クリックして「コードの表示」を選択)
②マクロの編集画面が表示されるので,右のように
「Main」と入力。
③「クリア」のボタンにも同様にして,「Clear」を
入力。
(4)ボタンが動作するようにする
①リボンから「開発」-「デザインモード」を選択。
○マクロの中に,他のマクロの名前を記述するだけでそのマクロを呼び出すことができます。これを利用すると
一定のまとまりごとにマクロを作成して,あとでまとめるという作業も容易になります。
○このコマンドボタンのマクロの部分には,他のマクロの呼び出しだけでなく,普通のマクロと同じく,プログ
ラムを記述することもできます。
デザインモード
デザインモードとは,コマンドボタンなどを編集できるモードのことで,この状態のときには
クリックしてもコマンドボタン等は動作しません。デザインモードを終了することで,コマンド
ボタン等が動作可能になります。
○切替は「デザインモード」ボタンで行います。
○新たにボタン等の配置を行った際にも,自動的にデザインモードになります。
○マクロ編集画面の「実行」メニューにも「デザインモード(の終了)」の項目があります。
- 54 -
5.フォームを使おう!
(1)フォームのデザイン
①リボンから,「開発」-「マクロ」を選択。
(マクロ編集画面になります)
②マクロ編集画面のメニューで,「挿入」-「ユーザーフォーム」を選択。
③同じくメニューで,「表示」-「プロパティウィンドウ」を選択。(プロパティウィンドウを出す)
④「Caption」欄を「モンテカルロ法による円周率の計算」に書き換える。
⑤ツールボックスの「ラベル」のアイコンをクリッ
クし,フォーム上に長方形を描く要領でラベルを
配置。
⑥⑤の動作をあと2回繰り返し,計3個のラベルを
縦に配置。
⑦テキストボックスも同様に3個配置。
*同じ大きさのラベルやテキストボックスを複数
配置するには,1つ作成したものをコピーする
とよいです。
⑧コマンドボタンも1個配置。
⑨ラベル1~3,コマンドボタンのプロパティの
「Caption」をそれぞれ「試行回数」,「内部の点」,
「円周率」,「実行」に書き換える。
⑩ラベル,テキストボックス,コマンドボタンのフォント,フォントサイズを調整。
「フォーム」を使うと,Windows 標準の GUI が利用でき,かな
り本格的な装いになります。また,ここでは,シートを使わず,
マクロだけですべてを行ってみます。
この部分にいろんな部品
(ツール)を配置する。
ラベル テキストボックス
コマンドボタン
- 55 -
〔解説〕
○「ラベル」は文字の表示に使われます。色などの表示がいろいろ工夫できるほか,ボタンのようにク
リック等で動作をさせることも可能です。
○「テキストボックス」は,文字の表示ができるだけでなく,実行中にユーザーの入力を受け付けるこ
とができます。ここでは,実行回数の入力を受け付けます。
また,「なんらかの変更が加えられたら動作する」というような設定もできます。
(2)マクロの記述
①コマンドボタンをダブルクリック。
②右のように記述する。
〔解説〕
○「TextBox1」は最初に配置したテキストボックスです。
・配置順に「TextBox1」,「TextBox2」,「TextBox3」,……と自動的に名前が付けられます。
・ラベルなら「Label1」,「Label2」,……
・「TextBox1.Value」は,「テキストボックスの値」ということになりますね。
○「Kaisu = Val(TextBox1.Value)」は「Kaisu =TextBox1.Value」でも構いませんが
・「Val」がないと,試行回数を入力しなかったり,数字以外を入力してしまったときにエラーになり
ます。
・「Val」は,「文字扱いの数字」を「数値」に直す関数です。数字以外の文字が入力されると「0」
を返します。
○「Naibu」は,円の内部の点をカウントするための変数です。シートを使っていないので,値の格納
に変数が必要になるわけです。
○「Rnd」は乱数を返す関数です(引数はなし)。シート上の関数 Rand()とつづりが異なりますが,機能
は同じです。
- 56 -
(3)フォームを呼び出すマクロ
①リボンから「ツール」-「マクロ」を選択し,「StartUp」という名のマクロを作成。
②右のように記述。
③ショーカットキーを「Ctrl+Shift+A」に設定。
〔解説〕
○「UserFormX」は作ったフォームのこと。「Show」はフォーム等を使用可能にして表示することを意味
します。フォームの呼び出しに関係して,以下のようなものがあります。
Load UserFormX ……使える状態にしますが,フォームの表示はしません。
プログラムでは操作でますが,ユーザーが操作することはできません。
UserFormX.Show ……フォームを使える状態にし,表示します。ユーザーが操作できるように
なります。
UserFormX.Hide ……フォームを隠します。Load したときと同じ状態になります。
Unload UserFormX……使用を終了します。
これを使った後で Loadや Showで再度呼び出しても,以前の操作の結果
は保持されません。
- 57 -
1.大量の変数を扱う(配列変数)
(1)セルに値を格納する
○Excelの便利なところは,セルを変数代わりに値を格納できるところ
です。
○たとえば,どこかの列を格納用にして,1行目には1人目のデータ,
2行目には2人目のデータ…と入れていけば,多くのデータを
格納できますし,
Cells(I,1).Value
のようにすれば,番号(I)で値を参照することができます。
○この方法は手軽ですが,変数を使う場合と比べると,
・表が大きくなる
・処理速度がやや遅くなる
という点に留意しておかなければなりません。
(2)配列変数を使う
○配列変数を使うときには,マクロのはじめに以下のように記述し,
配列変数の番号を何番まで使うかを明確に宣言しておきます。
Dim Hito(50)
これで,0~50の数が( )の中で使えます。つまり,51個の
変数を管理できるわけです。(0から始まることに注意!)
Hito(0) Hito(1) … Hito(50)
○( )の中には変数や計算式を入れることができます。例えば,Hito(I)では,変数 I の値が5なら
Hito(5)を指しますし,変数 Iの値が21なら Hito(21)を指します。計算式を入れたときにも同様に,
計算式の結果を配列変数の番号として使えます。
○変数としての機能は,配列変数に番号がついている以外は,通常の変数と変わりません。
〔4〕Excelワンポイント
Excel マクロでは,Hito(10)のように,変数名に( )付きで番号を続けることで,たくさんの変数を「1つの変数
名+番号」で管理することができます。この形の変数を「配列変数」といいます。
「50人の集団の中でのかぜの感染シミュレーション」のようなものを作ろうとした場合,50人個々のデータ
を記録していく方法が考えられます。この場合,値の格納場所が50個必要になり,それらの値を番号等で順序良
く参照することも必要です。これには,セルを用いる方法と配列変数を用いる方法の2つがあります。
- 58 -
○Hito(3,2),Hito(4,5,6)のようにして2次元,3次元の配列変数を利用することもできます。
この場合,最初の Dimによる宣言も次のように2次元,3次元で行います。
Dim Hito(3,2) , Dim Hito(4,5,6)
・例えば,Hito(3,2)は,次のような表に値を
格納していくイメージを持つと分かりやすい
でしょう。
2.マクロの強制終了
○マクロで繰り返し回数を多くし過ぎたり,何らかのプログラムミスがあったときなど,いつまでたっ
ても終了せず困るときがあります。
○こんなときは,強制終了させることができます。
です。
*これでも止まらなければ,Ctrl+Alt+Delete でメニューを出して,そこから Excel を強制終了します。このときは,
未保存の部分は諦めねばなりません。また,このメニューは危険なものなので,扱いには注意してください。
*さらにこれでも止まらない場合は,電源ボタンを押し続けて,コンピュータを強制終了します。
(このときはトホホ……ですね。)
Hito(0,0) Hito(1,0) Hito(2,0) Hito(3,0)
Hito(0,1) Hito(1,1) Hito(2,1) Hito(3,1)
Hito(0,2) Hito(1,2) Hito(2,2) Hito(3,2)
Dimと変数の「型」
○Dimはもともと次のようにして,変数の名前と「型」を宣言するものです。
Dim Hensuu As Integer
○Excelマクロでは,普通の変数は宣言なしで利用できますし,「型」も気にする必要はほとんどありません。
しかし,計算量のとても多いシミュレーションなどの場合には,「型」が影響してきます。
○「型」は変数に入る値の形式のことで,「文字型」「整数型」「浮動小数点型」等々たくさんあります。それぞれ,
格納に必要なメモリの量も違いますし,処理速度も異なります。宣言のない場合には「なんでもアリ」の
Value型が自動的に適用されますが,これは便利な半面処理速度に難があります。処理速度をほんの少しでも上
げたい場合には,適切な「型」の利用が必要になってくるわけです。
Ctrl + Pause
- 59 -
以下は,授業では扱いませんが,この他にも様々なことが Excel VBA を用いて実現できます。Web 上
の資料や書籍は Squeak以上に豊富です。各自で学習し,プログラミングの幅をさらに拡げてください。
3.フォームに画像を貼り付ける
(1)フォームの背景に画像を貼り付ける
*画像はファイルに保存して用意しておくこと。
①フォームの背景部分を右クリックして「プロパティ」を選択。
②「Picture」欄をクリック。
③右に出てくる をクリック。
④ファイル選択の窓が表示されるので,目的のファイルを選択。
⑤次のプロパティを適当に設定。
・PictiureAlignment ……画像の配置関係
・PictureSizeMode ……画像のサイズ関係
・PictureTiling ……画像をタイル状に並べて表示するか
(2)「イメージ」コントロールを使う
○ツールボックスのイメージのアイコンをクリックし,
フォーム上にイメージのオブジェクトを配置する。
○後は,フォームの背景のときと同じ要領。
フォームのツールボックスには,ラベル,テキストボックス,コマンドボタンの他に,画像を扱う「イメージ」が
あります。また,フォームの背景に画像を貼り付けることもできます。
フォームの背景に写真を貼り付けた様子
フォームの背景,「イメージ」以外にも,プロパティに「Picture」欄のあるものなら,どれにでも画像を貼り付け
ることができます。
- 60 -
4.動画を実現する
(1)シート上で文字を移動させる
例)右のようにコードを記述してみよう。
〔解説〕
○2つの Cellsがそれぞれ「描く」「消す」です。
○※の3行は「1秒待ち」をしています。
・Timeは現在時刻を秒単位でとる関数。
T=Time で変数 Tに現在時刻を代入。
・While〔条件式〕~ Wend は「条件式が成り立って
いる間は,この間を繰り返し」という意味です。
ここでは,時刻が Tと異なるまで,すなわち,秒の単位が変わるまで,空で繰り返します。
*工夫次第でいろんな動きが表現できます。動かしながら色を変えることも可能です。
(2)グラフを利用する
例)折れ線グラフで,オシロスコープのような動きも表現可能です。
○マクロで,E1の値を E2以下に「値」「加算」でコピーしていきます。
*グラフで動画を試みる場合,普通に数値を変更していってもなかなかうまく動きません。上のように
値のコピーを入れるのが1つのコツです。
動きを表現する基本は「描く」→「消す」→「描く」の繰り返しです。Excel VBA には Squeak のような動画機能
はありませんが,上の基本に沿ってプログラミングすれば動きが表現できます。
Sub Main()
For I = 1 To 20
Cells(I, 1) = "●"
T = Time
While Time = T
Wend
Cells(I, 1) = ""
Next
End Sub
※
グラフは,数値を位置(座標)に変換して表現しているものなので,マクロで数値を変化させていけば,グラフの
様子も変わっていきます。
=SIN(E2)
- 61 -
- 62 -
高校生のためのプログラミング入門
~Squeak と Excel VBA でコンピュータシミュレーション~
2010年 10月 14日 第3版発行
Copyright ©2010 Information Science Seminar, Kyoto Municipal Horikawa Senior High School
編著 妹尾敬・藤岡健史(京都市立堀川高等学校 情報科学ゼミ)
表紙デザイン Kei
製本 (株)大気堂