Monthly Archives: 7月 2015

VBAによるプログラミング超入門講座(第3回)

このページでは、以下の内容について説明しています。

文字列について

プログラムで「言葉」の情報を扱うときは、データ型として「整数型」で無く、「文字列型」を使用します。文字列型の場合も、整数型のように定数と変数が使えます。

  文字列型の定数:  "abc" のように複数の文字を並べてダブルクォーテーション(")で囲んで表します。
  文字列型の変数:  「Dim 変数名 As String」として宣言し、以後、整数型の変数のように扱います。

文字列を扱うプログラム例

文字列を扱うプログラム例を以下に示します。If文で文字列の比較を2回行い、その結果を整数型の変数cmp1とcmp2にそれぞれ1(等しい)と0(異なる)で記憶し、最後に文字列型変数の代入を実行しています。このプログラムを実行した後、変数str1、str2、cmp1、cmp2にどんな値が記憶されるか、考えながら読んでいきましょう。

Dim str1 As String

Dim str2 As String

Dim cmp1 As Integer

Dim cmp2 As Integer

str1 = "abc"

str2 = "efg"

cmp1 = 0

cmp2 = 0

If str1 = str2 Then

cmp1 = 1

End If

If str1 = "abc" Then

cmp2 = 1

End If

str1 = str2

上記のプログラムでは、変数str1に “abc” という文字列を記憶させ、変数str2に “efg” という文字列を記憶させています。その後、If文で変数str1とstr2が等しいか比較しています。この場合、変数str1には”abc”、変数str2には”efg”という異なる文字列が記憶されているので、等しくなく、次の行の「cmp1 = 1」は実行されません。

続いて、変数str1と文字列定数”abc”を比較しています。この場合、変数str1には”abc”が記憶されているので、等しいと判定され、次の行の「cmp2 = 1」が実行されます。

続いて、変数str2で記憶していた文字列を変数str1に上書きしています。このプログラムの実行後、整数型の変数cmp1には0、cmp2には1が記憶され、文字列型の変数str1、str2には共に”efg”が記憶されます。

文字列型の最大文字数は

String型の変数には、何万文字も記憶できます。

文字列型の最小文字数は

String型の最小文字数はゼロです。文字数ゼロの文字列は””として表現します。Excelでは、空のセルを探すとき、空の文字列””を使用しますので、ここで文字数ゼロの文字列の使い方を覚えておいてください。

  str1 = ""
  If str1 = "" Then

文字列型の変数の中身は

コンピューターは、画像、音声、言葉等、全ての情報を「数」に変換して記憶しますので、「str1 = “abc”」と書けば、変数str1には文字a,b,cに対応する何らかの「数」が記憶されるはずです。また記憶した文字数もどこかに数で記憶されるはずです。

ですが、こういう細かい処理はVBAが勝手に処理してくれますので、我々は意識しなくて済みます。変数str1には任意の文字列が記憶でき、後でその情報が取り出せ、比較できれば充分…と割り切って、この疑問は先送りにしましょう。

関数について

プログラミング言語の翻訳ソフトには、役立つプログラム集が付属しており、我々が作るプログラムから利用できます。その個々のプログラムは「関数」と呼ばれます。VBAで利用できる関数には、たとえば画面にメッセージを表示する関数(MsgBox)、文字列を大文字に変換する関数(UCase)、文字列の中から別の文字列を検索する関数(InStr)等があります。

関数は単独で使える「作業指示書」

関数を利用するときは、コンピューターに対して「次の作業指示は、xxxxという名前の関数の指示に従ってくれ。その作業が終わったら再び私が書いた作業指示書のここに戻ってきて、次の行以降の作業指示に従ってくれ」というように、一時的に別の作業指示書で作業を指示する事になります。

関数は、「入力」を受け取り「処理」した結果を「出力」するような小さなプログラムです。我々のプログラムから関数を利用する場合は、以下のように書きます。

str1 = "abc"

str1 = UCase(str1)

If UCase("efg") = "ABC" Then

上記の例は、VBAが用意してくれている「文字列を大文字に変換する関数」である「UCase」を利用した例です。関数UCaseは、カッコ()の中に書いた文字列を受け取って、大文字に変換した結果を返します。関数が返した情報は、’=’を使って変数に記憶させるか、記憶する必要が無い場合、たとえばIf文の中で比較するだけで良い場合は、記憶させずにその場で参照するだけにします。

「UCase(str1)」や「UCase(“efg”)」の記述は、これまで式の中に変数や定数を書いてきた書き方に似ています。この記述は、カッコ内に書いた文字列が大文字に変換された文字列を指す事になりますが、コンピューターの動きとしては、一旦、ここに書かれているプログラムから離れて、別のところに書かれている関数UCaseのプログラムを実行し、その後、再びここのプログラムに戻ってくる…という動きになります。その際、関数UCaseを実行した結果として大文字に変換した文字列を持って帰ってくる事になります。

関数は「探して」使おう

VBAがサポートする関数の数は、膨大な数に及びますので、全部覚える事は難しいと思います。ですので、最初は「何がしたいか?」という我々の要求をはっきりさせてから、インターネットやVBAの入門書の目次/索引で検索する事をお勧めします。実は私も、VBAの関数はあまり覚えておらず、上記の関数UCaseもGoogleで「VBA 文字列 大文字 変換」というキーワードで検索して見つけました。

関数の仕様、たとえば

  • その関数はどういう仕事をするための関数か
  • カッコの中にどんな情報を幾つ書けば良いか
  • 渡す情報のデータ型は何型か?(整数型か文字列型か他の型か)
  • 関数が返す情報はどんな情報か、またその型は何型か

などの仕様は、関数によって異なりますので、これらについてもインターネットや書籍で調べてください。

オブジェクトについて

ここでは引き続き、プログラミング言語の翻訳ソフトに付属している役立つプログラム集について話をします。前項では「関数」の話をしましたが、プログラミング言語はその他にも「オブジェクト」と呼ばれる仕組みを使って、役立つプログラムを提供してくれます。

オブジェクトとは

オブジェクトは、複数の変数と、それに係る関数が一体化したものです。

オブジェクトの特徴

オブジェクトの特徴を以下に示します。

  • (変数のように)情報が記憶できます。
    オブジェクトは、自身に係る情報を記憶するための変数を「所有」します。
  • (関数のように)処理や仕事が実行できます。
  • (変数のように)名前を持ちます。

Excel表のセルを扱うオブジェクト「Range」

以下ではExcel VBAが提供するオブジェクト「Range」を例に挙げて、オブジェクトの特徴について更に説明していきます。RangeはExcelの「セル」を扱うオブジェクトです。セルの特徴を記憶する変数としてValue(値)、Row(行番号)、Column(列番号)、Width(セルの幅)、Height(セルの高さ)などの変数を所有しています。これらの変数に整数や文字列等を記憶させるときは、通常の変数と同じく‘=’演算子を使います。左辺にはオブジェクト名と変数名をカンマ(.)で繋げた名前を記述し、右辺には整数、文字列等を記述します。

オブジェクトRangeを使ったプログラム例

以下に、オブジェクトRangeを使ったソースプログラム例を示します。

Dim abc As Range

Set abc = Workbooks("成績表.xlsx").Worksheets("Sheet1").Cells(3,1)

abc.Value = 12345

abc.Font.ColorIndex = 5

MsgBox(abc.Value)

MsgBox(abc.Font.ColorIndex)

オブジェクト変数の宣言

オブジェクトを宣言するときは、変数のように「Dim オブジェクト変数名 As オブジェクト型名」と書きます。上記ではRange型のオブジェクト変数abcを宣言しています。

次の「Set abc = Workbooks(“成績表.xlsx”).Worksheets(“Sheet1”).Cells(3,1)」は、宣言したオブジェクト変数abcを使って、現在開いている”成績表.xlsx”のシート”Sheet1”の「3行目の1列目」のセルを扱うための記述です。この記述については後程、説明しますので、ここでは以後、オブジェクト変数abcを使って、”成績表.xlsx”のシート”Sheet1”の「3行目の1列目」のセルが扱えるようになる…とだけ理解しておいてください。

セルの中身を表す変数

「abc.Value = 12345」は、セルの値を保持する変数Valueに整数を記憶させる記述です。記憶した情報は後で取り出せます。たとえば「MsgBox(abc.Value)」と書けば関数MsgBoxに先ほど記憶した整数12345が渡せますし、整数型の変数iに取り出すときは「i = abc.Value」と書けます。

ここで重要な事は、整数型の変数なら単に情報を記憶するだけですが、オブジェクトの場合は記憶すると同時に、記憶した情報に関連する何らかの処理も併せて実行できる事です。Range型オブジェクトが所有する変数Valueに値を記憶させた場合は、セルの中身が記憶した値に変わり、Excelの表に反映されます。Excelの画面でもその変化が確認できます。

フォント色を表す変数

「abc.Font.ColorIndex = 5」は、フォントの情報を持つ変数Fontに色情報を記憶させています。ここで注目して頂きたいのは、変数Fontもオブジェクト変数であり、フォントの色情報を保持する変数ColorIndexを持っているという点です。この場合は前記のように、オブジェクト変数名をピリオド(.)で区切って並べて書きます。値5は、青を示す番号なので「abc.Font.ColorIndex = 5」を実行した後は、「3行目の1列目」のセルのフォントは青に変わります。

ブック、シート、セルを表すオブジェクトについて

Excel VBAでは、そのときに既に開いているExcelのファイル(Excelではファイルの事をブックと呼びます)や、その中のシート、更にその中のセルに相当するオブジェクトは、プログラム開始の時点で既に存在しています。これらのオブジェクトの間には「所有」の関係があり、ブックはシートを所有し、シートはセルを所有しています。ですので、たとえば現在開いているブック” 成績表.xlsx”のシート”Sheet1”の中に存在する「3行目の1列目」のセルに整数1234を入れる場合は、以下のように書きます。

 Workbooks("成績表.xlsx").Worksheets("Sheet1").Cells(3, 1).Value = 1234

上記のオブジェクト変数「Workbooks」、「Worksheets」、「Cells」は、それぞれブック、シート、セルの情報を扱うオブジェクトですが、いずれも複数のオブジェクトから成るオブジェクトです。したがって複数のオブジェクトの中から所望のオブジェクトを特定するために、カッコを付けてブック名、シート名、行列番号を指定する必要があります。

上記の例では、カッコの中は全て文字列および整数の「定数」で指定しましたが、変数で指定する事も可能です。

Dim fname As String

Dim sname As String

Dim i As Integer

Dim j As Integer

fname = "成績表.xlsx"

sname = "Sheet1"

i = 3

j = 1

Workbooks(fname).Worksheets(sname).Cells(i, j).Value = 1234

プログラムの中でこれらの変数の値を書き換えれば、同じ式で異なるファイル、シート、セルが扱えるようになります。

オブジェクトの「参照」について

前項では、Excelのセルを扱う際、以下のような長い文を書きました。

  Workbooks("成績表.xlsx").Worksheets("Sheet1").Cells(3, 1).Value = 1234

しかしセルを操作する度に、毎度このような長い文を書くのは大変です。よってVBAや他のプログラミング言語では、オブジェクト変数を使って別のオブジェクトを「参照」できるようになっています。「オブジェクトRangeを使ったプログラム例」で説明した下記プログラムは、Range型のオブジェクト変数を使って別のセルを参照している例です。

  Dim abc As Range
  Set abc = Workbooks("成績表.xlsx").Worksheets("Sheet1").Cells(3,1)

以下では、シートを扱うWorksheet型オブジェクトを使って、ブック”成績表.xlsx”の中のシート”Sheet1″を参照するプログラム例を紹介します。

  Dim table As Worksheet
  Set table = Workbooks("成績表.xlsx").Worksheets("Sheet1")
  table.Cells(3,3).Value = “xyz”

上記の例では、Worksheet型のオブジェクト変数tableに対して「Set オブジェクト変数名 = オブジェクト変数名」という文を使って、ブック”成績表.xlsx”の中のシート”Sheet1″の「参照」を記憶させています。以後、このオブジェクト変数tableを使えば、ブック名”成績表.xlsx”とシート名”Sheet1″は書かずに、同じシートが参照できるようになります。

「値」の記憶と「参照」の記憶の違いについて

前項で説明したオブジェクト変数の「参照」を記憶する…という意味について、もう少し説明します。これまで整数型や文字列型の変数に対して、’=’ の演算子を使って「変数名=別の変数名」と書いた場合は、右辺の変数が記憶していた「値」がコピーされるだけでした。この事を改めてプログラム例で見てみましょう。

Dim i1 As Integer

Dim i2 As Integer

i1 = 10

i2 = i1

i1 = 20

MsgBox i2    '10が表示される

前記のプログラムでは、最初に整数型の変数i1に10を記憶させた後、「i2 = i1」という文を使って、変数i1が記憶していた値を変数i2に記憶させています。その後、変数i1を「i1 = 20」という文で書き換えていますが、この記述は変数i2が記憶している値には影響しません。故に次の「MsgBox i2」を実行した場合、10が表示されます。

これに対して、オブジェクト変数に対して「Set」と’=’ の演算子を使って「Set オブジェクト変数名 = オブジェクト変数名」と書いた場合は、先程の動きとは違ってきます。

Dim t1 As Worksheet

Set t1 = Workbooks("成績表.xlsx").Worksheets("Sheet1")

t1.Cells(3,3).Value = “xyz”

Workbooks("成績表.xlsx").Worksheets("Sheet1").Cells(3,3).Value = “abc”

MsgBox t1.Cells(3,3).Value   ' abc が表示される

「Set t1 = Workbooks(“成績表.xlsx”).Worksheets(“Sheet1”)」の文によって、オブジェクト変数t1に対して、「ブック”成績表.xlsx”の中のシート”Sheet1″」の「参照」が記憶されます。これは右辺の記憶していた「値」がコピーされるのでは無く、右辺の存在自体が記憶される…という意味になります。よって以後、左辺のオブジェクト変数と右辺のオブジェクト変数は、同じ実体「ブック”成績表.xlsx”の中のシート”Sheet1″」を指すようになります。

演習問題(その2)

では、オブジェクトを使った演習問題をやってみましょう。Excelで作成した以下のような”成績表.xlsx”が既に開かれているとします。

成績表

この既に開かれている”成績表.xlsx”のシート”Sheet1”を操作して、60点以上の生徒の「名前」と「点数」を青色に変えるプログラムを作成してください。

ヒント

  • セルのフォントの色を青色に変える方法は「フォント色を表す変数」のソースプログラム例を参考にしてください。
  • シート”Sheet1″の2列(B列)目に着目して、2行目から最後の行まで、60点以上かどうか繰り返し確認してください。
  • 表の終わりは、セルが空かどうかで判定してください。
    空のセルでは、セルが所有する変数Valueが空の文字列(ダブルクォーテーション2つ “”で表す)になります。
  • If~Else~End If の中で「Else~End If」間の文が不要なときは、省略して「If~End If」だけで書けます。

解答例

以下、解答例です。

Dim table As Worksheet  ' シートの参照を記憶するオブジェクト変数

Dim row As Integer    ' シートの行番号を記憶する変数

Set table = Workbooks("成績表.xlsx").Worksheets("Sheet1")

row = 2                   ' 2行目から調べる

Do

If table.Cells(row, 2).Value = "" Then  ' 最後まで調べ終わったら終了

Exit Do

End If

If table.Cells(row, 2).Value >= 60 Then

table.Cells(row, 1).Font.ColorIndex = 5

table.Cells(row, 2).Font.ColorIndex = 5

End If

row = row + 1

Loop

VBAによるプログラミング超入門講座(第2回)

このページでは、以下の内容について説明しています。

プログラム例の解説

では、第一回の「プログラミングの基本作法(マナー)は」を思い出しながら、「(ある処理) を3回、繰り返す」という超簡単なプログラム例を再び見て行きましょう。

Dim i As Integer

i = 1

Do

If i > 3 Then

Exit Do

Else

(ある処理)

i = i + 1

End If

Loop

Dim i As Integer

先頭の「Dim i As Integer」は『今から「i」という名前の「変数」を使います。その「型」は「整数型」です』…という事を「宣言」する文です。「Dim」と「As」の部分は、VBAでは「こう書いて下さい!」と厳密に決められている部分です。「語源は何だろう?」とか考えずに、この通りに書いてください。

「i」の部分は変数名です。ここで、使用する変数の名前を宣言します。変数名には、好きな名前を使う事ができます。変数の名前に使用できる文字の種類は、プログラミング言語によって異なりますが、先頭に「英字」、2文字目以降に「英字」か「数字」を使っておけば、殆どのプログラミング言語で変数として認識されるはずです。

「Integer」は「整数」という意味です。ここで変数の「型」を宣言します。変数の「型」とは、記憶する情報の「種類」の事です。「Integer(=整数)」と宣言する事で、以後、この変数iを使って整数が記憶できます。整数は、1で割り切れる正または負(マイナス)の数で、…,-3, -2, -1, 0, 1, 2, 3,…などの事です。VBAでは、整数型の変数を使って -32768 ~ +32767 の間の「いずれかの整数値」が記憶できます。変数の「型」には他にも幾つか種類がありますが、この講座では最初は整数型だけを使って行きます。

「=」は、変数に値を記憶させるときに使う記号(演算子と言います)です。小学校で習った算数では「=」はたとえば「1+2=3」と書いて、左の式と右の式は「等しい」事を表しますが、プログラミング言語では「=」は、「左の変数に右の式を記憶させる」事を表します。算数に慣れ親しんだ我々にとっては解り辛いですが、そういうルールなのだと、ここで覚えておきましょう。

ちなみに変数に情報を記憶させた後、後の文で再び「=」を使うことで、別の情報を記憶させる (上書きする)事ができます。

Do~Loop

次の「Do」と、その7行先にある「Loop」はペアになっています。「Do」文と「Loop」文を書くと、間で挟んだ文を繰り返し実行してもらえます。

Do

(処理1)

Loop

たとえば、上記のように書けば、(処理1)を実行した後、再びDo文に戻って(処理1)を実行し、これを無限に繰り返してもらえます。ただし「ある条件になったら繰り返しを止めて欲しい」場合は「Exit Do」を実行してもらえれば、そこで繰り返しのループから抜けて、Loop文の次の行から実行してもらえます。

If~Else~End If

If i > 3 Then

Exit Do

Else

(ある処理)

i = i + 1

End If

状況/条件に応じて「もし~なら~を実行し、そうで無いなら~を実行する」というように、条件に応じて実行する処理を変えて欲しいときは「If~Else~End If文」を使います。

「If i > 3 Then」は「もし変数iが3より大きいなら」という意味です。これが正いなら、コンピューターはIfとElseで囲んだ文を実行し、違うならElseとEnd Ifで囲んだ文を実行します。これにより「Exit Do」文は変数iが4になったときに実行されます。

If の後には以下のような「条件式」を記述します。

左辺 = 右辺
左辺と右辺が等しいとき
左辺 <> 右辺
左辺と右辺が等しくない(異なる)とき
左辺 > 右辺
左辺が右辺より大きいとき
左辺 < 右辺
左辺が右辺より小さいとき
左辺 >= 右辺
左辺が右辺以上(等しいか、より大きい)のとき)
左辺 <= 右辺
左辺が右辺以下(等しいか、より小さい)のとき

ここでまた’=’が出てきました。VBAではIf文で「If i = 3 Then」と書いた場合は、変数iで整数3を記憶するのでは無く「もし変数iが 3と等しいなら」という意味に変わります。同じ’=’という演算子でも、書く場所によって意味が変わるのです。ややこしいですが、VBAで決まっているルールですので、ここで覚えておきましょう。

左辺や右辺には、式を記述します。式には、変数、定数(決まった数のことです)、演算子が記述できます。演算子については、後で説明します。

Else~End If

Else

(ある処理)

i = i + 1

End If

「Else~End If」の間には、(ある処理) と 「i = i + 1」という2つの文が書かれています。(ある処理) は、ここでは仮に日本語で(ある処理) と曖昧に記述していますが、実際にはここで実行して欲しい計算式を記述する事になります。繰り返し実行して欲しい処理をここに記述するのです。

その次の「i = i + 1」は、現在のループ回数を記憶するための文です。iに1を足した値が再度、iに記憶されます。

演算子について

ここで「式」に使用する演算子について説明します。演算子にはいろんな種類がありますが、この講座では四則演算(足し算‘+’、引き算‘-’、掛け算‘*’、割り算‘¥’)に加えて、割り算の余りを求める Modを紹介します。たとえば、整数型の変数iとjがあり、jに13が記憶されていたとします。

このとき「i = j ¥ 3」は、変数jを3で割った結果(商)を記憶するときの指示です。結果は整数型で、余りは切り捨てられます。この例では変数iに商の4が記憶されます。

また「i = j Mod 3」は、変数jを3で割った余り(剰余)を記憶するときの指示です。結果は1になり、iには1が記憶されます。

ちなみに割り算には演算子‘/’ も使えますが、割り切れない場合は商が偶数になるよう、小数点以下の切り上げ、または切り捨てが発生してしまいます。

プログラム例の動き

以上の説明を踏まえ、このプログラムがどういう動きをするか、もう一度、見て行きましょう。説明し易いように、各行頭に行番号を記載しました

1:       Dim i As Integer

2:

3:       i = 1

4:       Do

5:           If i > 3 Then

6:              Exit Do

7:           Else

8:              (ある処理)

9:              i = i + 1

10:          End If

11:      Loop

12:

  • コンピューターはまず1行目を実行します。ここでは整数を記憶するための変数i を宣言しています。これにより以後、変数i が使用できます。
  • 2行目を実行します。空行なので何もしません。
  • 3行目を実行します。変数i を使って、最初の値(初期値といいます)として1を記憶します。
  • 4行目を実行します。「Do」文ですので、Loop文までの文を繰り返し実行せよ…という指示になります。
  • 5行目を実行します。If文ですので、ここに記載された条件式により、その次に実行する行が変わります。
    このときの変数iには1が記憶されているので、3より大きいという条件は満たしません。よって次に実行する行はElse文の次の8行目になります。
  • 8行目を実行します。ここでは仮に日本語で(ある処理)とだけ記載していますが、ここに実際の計算式を書けば、その式が実行されます。
  • 9行目を実行します。ここでは変数iに 1を足した値が変数iに記憶されます。結果、変数iの値は 1から2に変わります。
  • 10行目を実行します。End Ifですので、ここでIf~Else~End Ifの条件判定が終わり、次は11行目を実行することになります。
  • 11行目を実行します。Loop文ですので、次に実行する行は対応するDo文が書かれている4行目になります。「Do」文ですので、Loop文までの文を繰り返し実行せよ…という指示になります。

・・・というように、一連の処理を繰り返し実行する事になります。このDo~Loopの繰り返しの中で、変数i に記憶した値がどう変化するか見て行きましょう。If文のある5行目の位置で見てみます。
   1回目:1
   2回目:2
   3回目:3
   4回目:4で「If i > 3 Then」が正しくなり、次の「Exit Do」文が実行されます。

結果、Do~Loopの繰り返しから抜けて、次は12行目を実行する事になります。
このプログラム例では、変数i を使って値1から3まで数える事で、同じ処理を3回繰り返しましたが、1から10まで数えて10より大きい11でExit Doを実行しても構いません。

演習問題(その1)

では早速、実際にソースプログラムを書いてみましょう。ここで書くのは、以下のようなプログラムです。

  • 1+2+3+4+5+…+9+10 というように、1から始めて1大きい値を10まで数えて、全部を足し算していくプログラムです。
  • 計算結果は、整数型の変数ans を宣言して、そこに記憶して下さい。

※変数は「Dim 変数名 As Integer」という文を使って、何個でも宣言できます。

ポイント

  • このプログラムでも「繰り返し」「条件判定」を使って下さい。
    本ページの冒頭でご紹介したプログラム例の中で仮に日本語で(ある処理)と書いたところは、変数と定数を使った「実際の式」に書き換えてください。
  • どういう計算を何回、繰り返さないといけないか、考えてください。
    実際に自分で計算してみて、どんな計算を繰り返す必要があるか、計算の規則を発見してください。
  • 人間と同様、コンピューターも前回の計算結果を「記憶」しておかないと、次回の計算ができません。この点に注意してください。
  • 解答例

    Dim i As Integer

    Dim ans As Integer

    i = 1

    ans = 0

    Do

    If i > 10 Then

    Exit Do

    Else

    ans = ans + i

    i = i + 1

    End If

    Loop

VBAによるプログラミング超入門講座(第1回)

このページでは、以下の内容について説明しています。

コンピューターとプログラムの関係について

パソコンやスマホは我々にとって身近なコンピューターですが、パソコンやスマホの製造メーカは、BIOS、OS、アプリなどのプログラム(ソフトウェアとも言います)をパソコンやスマホに組み込んだ状態で販売しています。もしこれらのプログラムが無かった場合、コンピューターはどうなるでしょうか?…画面には何も表示されず、キーボードやマウスからの入力にも反応しない「ただの箱」になってしまいます。

コンピューターは、プログラムがあって初めて動作する機器なのです。

プログラムとは

プログラムは、コンピューターに対する「作業指示書」の役目を果たします。

コンピューターを人間にたとえると…(性格診断)

コンピューターは、人間にたとえると「実直」で「真面目」ですが、「自主性」に欠けています。作業指示書で指示された事は確実に実行してくれますが、作業指示書が無いと何もしてくれません。じっと動かず止まったままです。また融通が利きません。人間の得意技である「適当に」「思い付き」で判断する事もできません。

よってコンピューターへの作業指示書であるプログラムは、起こり得る全ての状況/条件を想定して、厳密にコンピューターに作業を指示する「文書」でなければなりません。

プログラムは「0」と「1」で出来ている

実は、コンピューターは「数」しか理解できません。よってプログラムは数で書かれています。0か1が大量に並びます。0か1が何個か集まると大きな数が表現できます(2進数表記といいます)ので、その個々の数に意味を持たせて、数によって仕事を指示するようにしています。

コンピューターにこの数が書かれたプログラムを読んでもらうには、コンピューター内の「メモリ」に転送して、プログラムをメモリから読み込んでもらう必要があります。

プログラミングとは

プログラミングとは、プログラムを書く作業/行為のことです。

前節では、プログラムは「0」と「1」で出来ている…と説明しましたが、人間にとって、数だけで作業指示書を書く事は大変難しい作業になります。よって「数」より解り易い「専用の言葉(=言語)」を使って「作業指示書」を書くのが一般的になっています。この特別な言葉の事を「プログラミング言語」といいます。

この考え方は、たとえば日本人がアメリカ人に作業を依頼する際、「日本語」で作業指示書を書いて、翻訳ソフトで「日本語」から「英語」に翻訳して、アメリカ人には「英語」で仕事を依頼する…という考え方と同じです。

プログラミングでは、人間が理解できる「プログラミング言語」からコンピューターが理解できる「機械語」に翻訳するための「翻訳ソフト」(コンパイラやインタープリタといいます)を使う事になります。

Microsoft社のVBA(Visual Basic for Applications)とは

VBAは、Microsoft社のOffice製品(Excel、Access、Word等)がサポートするプログラミング言語です。

人間が使う言語にも種類があるように(例:日本語、英語、フランス語等)、プログラミング言語にも幾つか種類があります(例:C, C++, C#, Java, JavaScript, Ruby, VBA等)。VBAはOffice製品の文書編集を「自動化」するのに適したプログラミング言語です。Office製品には、VBAで書いた作業指示書を数字で書いたプログラムに翻訳するソフトが内蔵されています。

本講座ではVBAを使ってプログラミングを勉強します。

コンピューターの基本動作

普段、我々がゲーム、ワープロ等を使用するとき、コンピューターは非常に複雑な仕事をしてくれていますが、このような複雑な仕事は、実は単純な基本動作の繰り返しで実現されています。

コンピューターの基本動作は「情報を入力して、計算/比較して、結果を出力する」動作です。

たとえばWindowsに付属する「電卓アプリ」では、キーボードから計算式の情報を入力して、計算して、結果を画面に出力しています。これがコンピューターの典型的な基本動作なのです。

プログラミングでは、このように「情報を入力して、計算/比較して、結果を出力する」…というような基本動作を繰り返し作業指示書に書き、コンピューターに作業を依頼します。複雑な仕事を一気に実行してもらうのでは無く、簡単な仕事を繰り返し依頼する事で、結果として複雑な仕事を実行してもらうのです。

プログラムの例

百聞は一見に如かず、ここでは超簡単なプログラムの例を見てもらいます。VBAというプログラミング言語を使って「(ある処理) を3回、繰り返す」だけの作業指示を書いた例です。繰り返したい処理は、今の段階では決まっていないので、ここでは仮に日本語で(ある処理)と書いておきます。

なおプログラミング言語で書いた作業指示書のことを「ソースプログラム」といいます。

Dim i As Integer

i = 1

Do

If i > 3 Then

Exit Do

Else

(ある処理)

i = i + 1

End If

Loop

プログラミングの基本作法(マナー)は

1行で1つの仕事を依頼する

同時に沢山の仕事を依頼せずに、できるだけ1つずつ仕事を依頼するようにします。コンピューターは、プログラムの一番上から順に1行ずつ読み込んで、1行ずつ実行してくれます。この基本ルールを考えて、ソースプログラムを書いてください。

繰り返しを活用する

幾つかの行を繰り返して実行して欲しいときは「Do~Loop」文を使います。コンピューターは「Do」文と「Loop」文で挟んだ間の文を繰り返し実行してくれます。その繰り返しの中で「Exit Do」文が実行されると、繰り返しを終えてLoop文の次の行から実行してくれます。

この「繰り返し」の書き方は、プログラミング言語によって異なりますが、概ね似ています。

条件判定を活用する

その時の状況/条件に応じて「もし~なら~を実行し、そうで無いなら~を実行する」というように、実行して欲しい処理を変えたいときは「If~Else~End If文」を使います。

「そうで無いなら~を実行する」が不要な場合は「Else~」以降は省略できます。

また~の部分に更に階層的に入れ子で「If~Else~End If文」を書く事もできます。

この「条件判定」の書き方も、プログラミング言語によって異なりますが、概ね似ています。

変数を活用する

外部から入力した情報、計算の途中結果などの情報は「変数」を使って小まめに保存(記憶)します。

変数を利用する目的

「コンピューターの基本動作」で説明したとおり、コンピューターの基本動作は「情報を入力して、計算/比較して、結果を出力する」ですが、このときの「入力した情報」、「計算した結果」、「出力したい情報」など、全ての情報は「変数」を使って小まめに記憶させる必要があります。そうしないと、情報が消えてしまって、再び参照できなくなるのです。

よって後で再び参照したい情報は、変数を使って小まめに記憶させましょう。

変数を使って情報を記憶する作法は、たとえば家の中で書類整理をするときに、適当な「箱」に好きな名前を書いて、その中に書類を入れる事で、再び書類を取り出しやすくする…という整理作法に似ています。

変数には、好きな名前を付ける事ができます。