Microsoft ExcelにはVBA(Visual Basic for Applications)というインタプリタがくっついている.これはデータ処理にきわめて強力な威力を発揮する.
Excelを起動し,ALTとF11を同時に押すと,こんな画面がでる.これをVisual Basic Editorという.
「イミディエイト」という文字が見えるところがイミディエイトペイン.ここをクリックして,次のように入力してみよう.
print "Hello, World!"<リターン>Hello,World!と次の行に表示されるはずである.
表示の仕方はあと二つある.ひとつはWindowsらしく,ダイアログに出すことである.次のように入力してみる.
msgbox( "Hello, World!")
いきなり画面中央にこんなダイアログが開くはずだ.
続いて紹介するのは,せっかくExcelなのだからワークシートのセルに表示する(というか結果を格納する)方法.次のように入力する
activesheet.cells(1,1).value="Hello, World!"
一見何も起こらない.しかし,Excelのシート画面に戻ってみよう.一番左上のセルにHello,World!という文字列が入っていることに気づくはずだ.
上記の入力をもう少し丁寧に見てみる.FortranでもCでもあまり出てこないがVBAではよく参照される考え方にオブジェクト指向というものがある.オブジェクト指向プログラミング(object oriented programming, OOP)では,オブジェクトという何らかの「もの」に対して何らかの「アクション」を行なうという記法が基本となる.
「もの」の指定の方法は,なんとも日本語的なもので,
○○の○○の○○
といった記法になる.上記の例で言うと「ActiveSheet(現在アクティブになっているシート)の座標[1,1]のセル」.つまり日本語の「の」がピリオドであらわされていると思っていい.
セル座標の指定方法は,
さらに,最後の「.value」は指定した「もの」(オブジェクト)の属性(attribute)をあらわす.この場合は「もの」はセルであり,その属性としてセルの値を示すことになる.最終的に,上記の文は,「ActiveSheetのCells(1,1)のValue属性をこういう文字列にせよ」という意味になる.
上記の文で,右辺にはいろいろなものが書ける.文字列でなくて数値でも可能.
長い行にご注意(Fortranのみ):Fortran90では,一行の長さに制限があります(たしか132文字). これより長い文字列をどうしてもプリントしたい場合には,一応方法はある:
[1]つぎのようにする
print *, 'part.1_start==============================part.1_end' // & 'part.2_start==============================part.2_end' // & 'part.3_start==============================part.3_end'「//」は二つの文字列を連結する演算子で,「&」は二つの行を継続させる記号(連結後の行が132文字以上になっても関係なし.一つ一つの行の長さだけに制限がある).
[2]つぎのようにする手もある.
print *, 'part.1_start==============================part.1_end& &part.2_start==============================part.2_end& &part.3_start==============================part.3_end'
一行目の文字列はシングルクォートで終わっていないので本来ここで行を変えて はいけないように見えるが,行の最後の「&」はこの行が次の行に続くという意味を表 すのでこういう書き方ができる. 次の行の最初の「&」は,前の行の続きが この「&」の次から始まるということを明示的に表すためについている.
(最初の例では,2,3行目には冒頭に「&」は不要.ただしつけてもよい).文字列中に引用符を入れるには(Fortran):「"」や「'」を文字列に入れるには,次のようにする.
[1]「"Let's Go" のように,外側を囲む引用符と中にある引用符が全く違えばOK
[2]'Let''s Go!'
または
"You surely said to me ""I love you"", didn't you?"
のように,外側を囲む引用符と同じ記号を入れる場合には二つ続ける.
文字列中に引用符を入れるには(C): printf("Let's Go\n"); のように,シングルクォートは問題なく入る.
ダブルクォートは, printf("No I didn't told you \"I love you\"!\n"); のように「\"」と書く.「\」は魔法のおまじない.これを「エスケープする」 と言う.
FortranではHello,World!という文字列をプリントするのに
print *, 'Hello, World!'
としたはずである.では,数値をプリントする場合,あるいは文字列と数値を混ぜてプリントする場合はどうするのだろうか.これは次のようにする.ex2.f90をこう作る:
このように,ひたすらコンマでつないでやればいい.
コンパイル・実行のやり方についてはもういちいち書かない.前回の分参照.実行は
実行結果:
% ./a.out
「3.14」がすこしずれているのが面白いところで,コンピュータ内での実数(浮動小数点)の扱いが意外といい加減であることがわかると思う.何も指定しないとせいぜい有効数字は7桁くらい.ただし,さらに精度を上げた実数型も扱える(というか,ふつうそうする).やり方は後述.
小数点以下の桁数を指定したい場合,整数の表示桁数を指定する場合など,プリントフォーマットを指定したい場合はいくらでもある.そこで書式指定文字列の登場である.ex2b.f90を作ろう.
print
文の次に「*」がなく,代わりに何か妙な文字列が入っている.これが書式指定文字である.
実行結果:
% ./a.out
1〜3行目と4,5行目,これらはそれぞれプリントしているのは同じ文字列と同じ数値なのに,プリントされたものはまったく異なっていること,また,最後の二行は書式指定もプリントもまったく違うのに結果が同じになることに注意.
さて,書式指定文字列について説明しよう.
ルール1:書式指定文字列はカッコで囲む.
ルール2:カッコの中にはいくつのパーツを並べる.パーツ間は,コンマやスペースで区切ってもいいし区切らなくてもいい(でもみにくくならないように・・・).
ルール3:パーツには次のものがある.ただしwとdはそれぞれ整数(書いても書かなくてもいい):
ルール4:上記のA,Iなどは小文字で書いてもいい.慣習的には大文字
例題2f:自己紹介をきれいに表示させてみよう.
Cの場合には,数値のプリントはかならず書式指定文字列が必要.つまりFortranのprint *, 3.14
のようなおまかせプリントはできない.
さっそくex2b.cを作ろう.
print
文の次に「*」がなく,代わりに何か妙な文字列が入っている.これが書式指定文字である.
実行結果:
% ./a.out
書式指定文字列について説明.
ルール1:printf()
のカッコの中の最初の文字列が,書式指定文字列となる.
ルール2:書式指定文字列の後ろに,プリントする値をずらずらと並べる.個数は制限なし
ルール3:書式指定文字列の中に,「%」で始まる部分があればそれは書式指定のパーツである.パーツには次のものがある.ただしnとmはそれぞれ整数(書いても書かなくてもいい):
ルール4:上記のe,fなどは小文字に限定
ルール5:上記の「%」パーツ以外の文字はそのままプリントされる.ただし「\n
」などのエスケープシークエンスは例外
例題2c:自己紹介をきれいに表示させてみよう.