[マクロ]  変数とデータ型、Forループ

〖 [マクロ] はじめてのプログラミング 〗で紹介したとおり、プログラムは、
   Sub プログラム名()
     :
   End Sub
の間に書くが、前回紹介した処理のように、同じ処理を繰り返すときには、「変数」を使って、ループを組む方が良い。

前回と同じ例で、各行で発明者数が3人以上かどうかを判定するプログラムを書いてみよう。

「行」を指定する変数を使って、2行目から11行目に同じ処理を繰り返す。

〔 Dim(変数宣言)文 〕

「変数」は「この変数を使いますよ」という意味で、予め「宣言」しておく。このときに、その変数のデータ型も合わせて宣言する。

Dim 変数名 As データ型

 

主なデータ型と使い方

データ型 説明 使い方
Integer 整数(-32,768~32,767) 行や列の指定
Long 整数(-2,147,483,648~2,147,483,648) 大きな数の場合
String 文字列 出願人名など
Date 日付 出願日など

ここで紹介したのは、特許情報分析でよく使うものだけ。他にもたくさんのデータ型がある。
詳しくはこちら(Microsoftのサポート)

〔Forループ〕

同じ処理を繰り返すには、「ループ」という命令を使うが、代表的なものが「Forループ」

For 変数=初期値 To 最終値 Step 増分
    繰り返したい処理の内容
Next 変数

この他、Do While,Do Untilなどいろいろなループがある。

〔Cellsプロパティ〕

前回は「Range(“G2”)」のようにセル名を文字列「”G2″」で指定したが、2行目、3行目、・・・のように、行と列を数値で指定したいので、「Cellsプロパティ」を使う。

Worksheet(“Sheet1”).Cells(,).value

上のように、前側にシートを指定する(Worksheet()やActiveSheet)をドット”.”を使って連結し、後方にはそのセルの属性をドット”.”を使って連結する。

後方に連結する属性には、値(value)の他、フォント(Font.Name, Font.Size)などがある。内容をクリアする”ClearContents”などようなメソッドを連結することもできる。
詳しくはこちら(Microsoftのサポート)

〔プログラム〕

いよいよプログラムを書いてみよう。

Sub step_2()
    Dim row As Integer
    Cells(1, 7) = “発明者数判定
    For row = 2 To 11
        If Cells(row, 6) >= 3 Then
            Cells(row, 7) = “多”
        Else
            Cells(row, 7) = “少”
        End If
    Next row
End Sub

プログラム名は、前回の”step_1″に続いて”step_2″としてみた。”step_1″の”End Sub”の後ろに改行して続けて書いていけば良い。

Dim row As Integer
行を指定する変数「row」を整数(Integer)として宣言している。まれに”Integer”の数値範囲を超える行数になる場合がある。そのときは”Long”を使う。

Cells(1, 7) = “発明者数判定”
“G1″セルは、1行目、7列目なので、Cells(1, 7)と指定して、書き込みたい文字列を入力している。上の〔Cellsプロパティ〕では前側にシート指定、後方に属性を指定するように説明したが、省略可能な場合があるので、とりあえず指定しないで試してみると良い。元に戻れる工夫(コピーを作っておくとか)をして、うまくいかなかったら、Googleなどで調べて対策すればよい。
“G”列を「7行目」と読み替えるのが少々面倒だが、”A列”から順に1, 2, 3, ・・・の連続値を入力した行を作っておくなど、工夫すれば良い。

For row = 2 To 11
  :
Next row
行の変数”row”を2から11まで増やしていくForループ。増分が1なら”Step”は省略して良い。

If Cells(row, 6) >= 3 Then
        Cells(row, 7) = “多”
Else
        Cells(row, 7) = “少”
End If
セルを指定する方法を”Range”から”Cell”に変えただけで、前回のプログラムと同じ処理。

[マクロ] はじめてのプログラミング

[準備]が終わったら、マクロプログラム本体を書き始めてみよう。
Visual Basicのウィンドウ(図1)の
「Sub utility()」と、
「End Sub」の間に書き込んでいく。

図1 Visual Basicウィンドウ

マクロプログラムを書いたら、[実行]や[デバッグ]を行うことになる。
ショートカットで表示されている。
緑色の「▷」は実行、二本の縦棒「|| 」は中断、四角「□」はリセット。
試しに、この状態で実行「▷」をクリックしてみよう。
何も起こらない…..
マクロ本体に何も書いてないからあたりまえ!

《STEP 1》

EXCELに下の図2のようなデータがあったとしよう。(出願番号は実際にあるデータだが、「発明者数」の欄はまったくの創作である。)
「発明者数」の欄の右に、発明者が3人以上かそれより少ないかを判定して、多ければ「多」、少なければ「少」を出力する「発明者数判定」欄を追加するプログラムを作ってみよう。


図2 処理対象のEXCELデータ

プログラムは、データを入力して、何らかの処理をして、その結果を出力するのであるから、最も基本的な機能である。

G1セルに「発明者数判定」と書き込んでみる。
① まずプログラム名を「step_1」に変更しよう。(いきなり「utility」では名前負けする気がする。因みに、ハイフン「-」ではなくアンダーバー「_」を使うのは、引き算のマイナス「-」との混同を避けるため。プログラミングではおなじみなので、慣れていただきたい。)
② 「G1セル」に「発明者数判定」と書きこむ

Sub step_1()
    Range(“G1”) = “発明者数判定”
End Sub

早速、実行「▷」してみよう。 意外と簡単に成功!


図3 G1セルへの出力に成功!

③ 「F2セル」の値を読み込んで3以上かどうかを判定して、その結果を「G2セル」に出力する。
  「判定」には「if文」を使おう。文法は、

  If 条件 Then
    条件が「真」だったときの処理
  Else
    条件が「偽」だったときの処理
  End If
  
  である。書いてみよう。

Sub step_1()
    Range(“G1”) = “発明者数判定”
    If Range(“F2”) >= 3 Then
        Range(“G2”) = “多”
    Else
        Range(“G2”) = “少”
    End If
End Sub

早速、実行「▷」してみよう。 またまた意外と簡単に成功!


図3 発明者数を読み込んで判定し、結果を出力した

ここまでできれば後は簡単!他の行にも同じ処理を繰り返せば良いのだから。プログラムはこんな風になる。

Sub step_1()
    Range(“G1”) = “発明者数判定”
    If Range(“F2”) >= 3 Then
        Range(“G2”) = “多”
    Else
        Range(“G2”) = “少”
    End If
    If Range(“F3”) >= 3 Then
        Range(“G3”) = “多”
    Else
        Range(“G3”) = “少”
    End If
             :
             :
    If Range(“F11”) >= 3 Then
        Range(“G11”) = “多”
    Else
        Range(“G11”) = “少”
    End If
End Sub

正しく動作するとは思うけれど、さすがに芸がなさすぎる。それに、行数が膨大になるとやってられない。
そこでプログラミングの世界では、同じ動作を繰り返すときには、「ループ」を使う。
次回「[マクロ] STEP 1 “For Loop”」に続く。

《コラム》 用語「マクロ」「VBA」「プログラム」「マクロプログラム」について
上の4語をなんとなく使い分けているような、同じ意味で使っているような。
マクロ:コンピュータ(アプリケーション)を自動的に操作するための仕組みを一般的に「マクロ」と呼ぶ
マクロプログラム:マクロの内容を、プログラミング言語を使って記述したもの、つまり、「マクロのためのプログラム」のこと
プログラム:プログラミング言語で記述された、コンピュータにさせたい動作の内容
ここで、「プログラミング言語」を説明なしで使ってしまっている。
プログラミング言語:プログラムを解釈してユーザーが期待する通りにコンピュータに動作させるために、どのような命令を与えれば良いか、プログラムを書くときの一定の決め事、約束。その決め事、約束は、「文法」とも呼ばれ、「言語」にみたてられて名付けられている。
VBA:Visual Basic for Applicaton.  古くから使われている「BASIC」というプログラミング言語がある。これを改善されて「Visual」になったのが「Visual Basic」。アプリケーション向けにカスタマイズしたのが「VBA」。
まとめると、「マイクロソフト社が、Excelを含むOfficeアプリケーションのマクロを実現するためにVBAを提供していて、ユーザーがそこに書くプログラム(マクロプログラム)を「マクロ」と呼ぶことも多い」ということになる。

[マクロ] 準備

EXCELマクロを使うための準備。
① [名前を付けて保存]→「EXCELマクロ有効ブック (*.xlsm) 」で保存(図1)
② [ファイル]ー[オプション]ー[リボンのユーザー設定]で、「開発」タブを有効化(図2)

図1 「EXCELマクロ有効ブック (*.xlsm) 」として保存
図2 [開発]タブの有効化

次に、[開発]タブを使って、Visual Basicを起動(図3)して、マクロプログラムを入力(編集)し、実行できるウィンドウ(図4)を立ち上げる。

図3 マクロプログラムの新規作成

新規作成のときは、マクロ名(プログラム名)を入力して[作成]する。
作成したマクロプログラムがいくつかたまってくると、[編集]や[実行]が可能になる。

図4 [マクロ]プログラムを編集・実行するためのウィンドウ

図3で入力されたマクロ名(プログラム名)「utility」で、マクロプログラムが作成されるが、最初なので中身は空。

Sub utility()
    この部分にプログラムを書いていく。
End Sub

マクロ名(プログラム名)「utility」の後ろの「()」は、引数を指定するための領域。
「引数」というのは、このプログラムに引き渡したり実行結果を返してもらうデータのことだが、当面は使わないので忘れて良い。

《コラム》「EXCELマクロ有効ブック (*.xlsm)」はコンピュータウィルス!?

「EXCELマクロ有効ブック (*.xlsm)」で保存したEXCELファイルをメールに添付して他の人に送るのは、うまくいかないことがあることを覚えておいてほしい。
メールサーバーや受信側PCで働いてくれているセキュリティソフトが、コンピュータウィルスだと判断して削除してまうことがあるからだ。「添付ファイルが削除されました」のようなメッセージが表示されるならよいが、だまってメール自体を削除してしまうこともある。
他の人にメールで送る場合は、「届かないこともある」と思って、届いたかどうかの確認を怠らないこと。
届かないときの代替策は、例えば以下。
(1)Dropboxなどクラウドサーバーを介して、送りたい人にダウンロードしてもらう。(下の(2)よりも簡単だが、ダウンロードの際にセキュリティソフトにブロックされてしまう恐れもある。)
(2)マクロなしの普通のEXCELブックと、プログラムを記載したテキストファイル(テキスト情報なら何でもよいので、送るEXCELブックのシートの一つにテキストで貼り付けても良い)とを送って、受信側で「EXCELマクロ有効ブック (*.xlsm)」を再構成してもらう。

《コラム》 データとマクロは必ず同じファイルか?

マクロプログラムで処理したいデータは、同じファイル内になくてもよい。
便利マクロを作って、いろいろなデータに使い回すなら、マクロを保存しているEXCELファイルとは別のファイルのデータを使えるように、マクロプログラムを書いておくのがよい。
ただし、あるデータではうまく動作したマクロが、別のデータではうまく動かないことがよくあるため、初心者のうちは、データとマクロはセットにして扱うこととして、同じファイルに保存した方がよい。

《コラム》 WordやPowerPointにもマクロはある!

EXCELマクロと較べると知名度は低いが、WordやPowerPointでもマクロを使うことができる。この「準備」で紹介したマクロを使うための準備は、WordやPowerPointのファイルでも同じなので、興味のある方はチャレンジしてみてはいかがだろうか?
マクロ本体のプログラミング言語はVisual Basicで、EXCELマクロと同じ。データの参照方法、使えるメソッドなどを調べれば、何とか使える。