179
1 2. Excel VBA による言語テクスト分析 全体の流れ このセクションでは、 LETRAS.xls というファイルにある VBA の参 考プログラム集を使用します 1 。プログラム集の全体は左の大きな矢印 が示すように、「説明」というユニットからはじまって、「分析」と いうユニットに至るまでの流れになります。それぞれのユニットの間 にも小さな矢印が示すような関係があります。 全体は言語資料を作成・準備するさまざまなプロセスと、それを分 析する最後のプロセスに分かれます。大きな流れは 1 つの方向を目指 しますが、実際の作業をしているときは、何度も試行錯誤をしながら、 流れに逆行したり、別の流れを辿ったりすることもあります。このプ リントに設定された課題を仕上げながら、一緒にさまざまな道筋を歩 いてみましょう。 1 Letras はスペイン語で「文字」(複数)という意味です。 説明 読込 入力 準備 行列 離合 整列・置換 鍵語、共起、代表

2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

1

2. Excel VBA による言語テクスト分析

全体の流れ

このセクションでは、LETRAS.xls というファイルにある VBA の参

考プログラム集を使用します 1。プログラム集の全体は左の大きな矢印

が示すように、「説明」というユニットからはじまって、「分析」と

いうユニットに至るまでの流れになります。それぞれのユニットの間

にも小さな矢印が示すような関係があります。

全体は言語資料を作成・準備するさまざまなプロセスと、それを分

析する最後のプロセスに分かれます。大きな流れは 1 つの方向を目指

しますが、実際の作業をしているときは、何度も試行錯誤をしながら、

流れに逆行したり、別の流れを辿ったりすることもあります。このプ

リントに設定された課題を仕上げながら、一緒にさまざまな道筋を歩

いてみましょう。

1 Letras はスペイン語で「文字」(複数)という意味です。

説明

読込

入力

準備 行列 離合

整列・置換

鍵語、共起、代表

Page 2: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

2

セキュリティレベルの設定

Excel VBA を使うためには、セキュリティーレベルを設定しなけれ

ばなりません。

*設定:「ファイル」→「オプション」 2→「セキュリティーセンタ

ー」→「セキュリティーセンターの設定」→「マクロの設定」→「警

告を表示してすべてのマクロを無効にする」を選択してください。ま

た、「開発者向けのマクロ設定」の「VBA プロジャクトオブジェクト

モデルへのアクセスを信頼する」をチェックしてください。

図:セキュリティーセンター

次に LETRAS を立ち上げたときに、次のメッセージが出たら、「コ

ンテンツの有効化」ボタンを押します。

アドイン

LETRAS を Excel アドインとして保存すると、すべての Book で

LETRAS を使用することができます。

*(1) アドインとして保存:「ファイル」→「オプション」→「名前

をつけて保存」→「その他の形式」→「ファイルの種類」で「Excel97-2003

アドイン」を選択すると、LETRAS.xla というファイルが AddIns とい

うアドイン専用のフォルダに保存されます。

2 以下の操作で「ファイル」→「オプション」を Word 2007 では「Office

ボタン」→「エクセルのオプション」と読み代えてください。

Page 3: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

3

*(2) アドインを有効にする:「ファイル」→「オプション」→アド

イン→「管理」から「Excel アドイン」を選択→設定→「 LETRAS」を

チェックして「OK」

Page 4: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

4

最初の画面

*ショートカット [Ctrl]+[Shift]+L で LETRAS のマクロを起動してく

ださい。次は「説明」のタブを開いたところです。「クリック:参照

WEB」ボタンを押すと、ブラウザーが立ち上がり参照サイトを見るこ

とができます。この画面では「実行」、「削除」のボタンは無効にな

っています。

LETRAS.xls を立ち上げると他の Book 内のデータも分析できます 3。

3 *注意:他のタブで「実行」ボタンを押して次のメッセージが現れ

たときは、「最大出力行数」を調整してください。または入力列数を

調整してください。

図:メモリーが不足

Page 5: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

5

「説明」タブ

このフォームのタイトルバー(最上部の青くなっている部分)に、

プログラム名 (LETRAS. v.******)、最小化ボタン(―)、最大化ボタ

ン(□)、終了ボタン(×)があります。分析中にこのフォームが邪

魔になったときは最小化ボタンを押してください。そして最大化ボタ

ンを押すと元の大きさに戻ります。終了ボタンを押すと、フォームが

消えます。再度立ち上げるときはショートカット [Ctrl]+[Shift]+L で起

動してください。

この画面の上部に「クリック:参照 WEB」のボタンがあります。こ

れを押すと自動的にブラウザーが立ち上がり、LETRAS の最新バージ

ョンと情報を掲載したウェブページに繋がります。

次の段には作者のメールアドレスが載せられています。プログラム

の不具合や改善点などのご意見をお寄せください。なるべく多くの人

Page 6: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

6

に回答を差し上げられるようにいたします。

「最大列幅」は出力データの列の最大幅を設定します。デフォルト

は 60 ですが、これを大きくしたり、小さくしたりすることができます。

論文やレポートなどに出力の画像をそのまま載せるときに、都合のよ

い大きさに設定してください。

「出力フォント」と「サイズ」のコンボボックスは、出力シートで

選択されるフォント名とフォントサイズを示します。適当な項目を選

択してください。

《各国語の文字》で、LETRAS 拡張正規表現にない文字を¥a、それ

以外の文字を ¥A で定義できます。たとえば、英語のハイフン (-)やカ

タルーニャ語の重子音 l·l (col·lecció)の中黒点 (·)などを追加しておけ

ば、これをカタルーニャ語の文字の集合を示す新たな正規表現¥a と、

その補集合¥A として定義することができます。

「説明」のタブでは「◎実行」が可動になっていません。

左下に現在のシートの「行数」が示されます。

右下に「タイム」があり、LETRAS を実行すると処理時間がここに

表示されます。

次は、LETRAS のエクセルシートに載せたサンプルデータです。

下に、たとえば「E.sep」のようなシート名があります。プログラム

の説明をするとき、このシート名でデータ例を示します。旧約聖書『創

世記』各国語版の最初の 3 節、および 5 世紀にヒエロニムスがラテン

語に訳し、 16 世紀にスペインで出版された版をデジタル化した

Vulgata50 章です (Gen)。

ウィンドウ

「◎実行」ボタンの上に「ウィンドウ縦 |横 |なし」のボタンがありま

す。これは、入力シートと出力シートを同時に見たり、リンクして参

Page 7: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

7

照したりするときに使います。具体的なことはこれからの練習で説明

します。

図:ウィンドウ

2.1. 読込

エクセルのシートには、さまざまなデータの入力が可能です。また、

コピー・アンド・ペーストによって、言語資料をシートに直接貼り付

けることもできます。一方、エクセルの外にあるテキストファイル、

ワードファイル、そしてインターネット上のウェブファイルをエクセ

ルシートに読み込むことによって、さまざまな言語処理が可能になり

ます。ここでは、クリップボード、Word ファイル、テキストファイル

をエクセルに読み込む作業をします。

Page 8: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

8

図:読込

2.1.1. クリップボード

これから行う「資料の整理」のために、はじめに言語資料(テキ

スト)が必要です。自分が持っているデータや自分が作成したデータ

をエクセルシート上にコピーして言語資料を作成しましょう。

それでは、LETRAS を立ち上げて「読込」のタブを開いてください。

図:クリップボード

Page 9: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

9

はじめに次の手順で「コピー」をしましょう。コピー・アンド・ペ

ーストという作業をするときは、コピーする対象を選択し 4、リボンの

「ホーム」→「コピー」をクリックします。この瞬間に選択された内

容が「クリップボード」に入ります 5。パソコンではペーストするまで

は何も見えません。しかし、コピーした内容はちゃんとクリップボー

ドに入っています。次に「実行ボタン」を押すと次のような結果にな

ります 6。

出力:

【実習 2.1.1】さまざまなデータをコピーしてエクセルシートに読み込

む練習をしなさい。「書き出す形式」の「段落」と「文」を選択し、

それぞれの結果を比較しなさい。

4 対象のファイル名をマウスでドラッグしたり、 [Shift]キーを押しな

がら→や↓などのカーソル移動キーを押すと選択状態になります。全部

選択するときは [Ctrl]+a を押します。 5 ふつうクリップボードは見えませんが、それを「貼り付け」(ペー

スト)することによって内容がわかります。「コピー」のショートカ

ットキーは [Ctrl]+c, 「ペースト」は [Ctrl]+v です。このように頻繁に

行う動作はなるべくショートカットキーを使うことを勧めます。 6 ここでは、データ例として今執筆中のこの原稿をコピーしました。

Page 10: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

10

2.1.2. ワードファイル

ワードファイルを読み込ます。

図:ワード

「ワードファイル」を選択すると、次のように、入力ファイルを選

択するためのダイアログボックスが現れます。

図:ダイアログボックス

ここで対象のワードファイルを選択し「開く」ボタンを押すと、エ

クセルシートにその内容が読み込まれます。複数のファイルを連続し

て選択するときは、最初のファイルをクリックし、次に [Shift]キーを

押しながら最後のファイルをクリックしてください。複数のファイル

を個別に選択するときは、[Ctrl]キーを押しながら該当するファイルを

クリックしてください。すべてのファイルを選択するときは、 [Ctrl]

キーを押しながら A のキーを押します。

【実習 2.1.2】さまざまなワードファイルをエクセルシートに読み込む

Page 11: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

11

練習をしなさい。

2.1.3. テキストファイル

LETRAS を使って、テキストファイル(→コラム)をエクセルシー

トに読み込みます。

実行ボタンを押すと、次の入力のダイアログボックスが現れます。

図:ダイアログボックス

ここでファイルを選択し「開く」を押すと、ファイルの内容がエク

セルシートに読み込まれます。ワードファイルと同じように、複数の

テキストファイルを選択することもできます。

【実習 2.1.3】さまざまなテキストファイルを作成し、それをエクセル

シートに読み込む練習をして、そのとき気づいたことを書きなさい。

Page 12: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

12

2.1.4. 書き出す形式

外部のファイル(クリップボード、Word ファイル、テキストファイ

ル)をエクセルシートに書き出す形式には、段落または文を選択でき

ます。

出力例(1) 段落

出力例(2) 文

【実習 2.1.4】まざまなテキストファイルを読み込み、「段落」、「文」

で書き出す実験をしなさい。

2.1.5. カラムを指定

「カラムを指定」をチェックすると、たとえば次のような形式のフ

Page 13: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

13

ァイルをエクセルに読み込むことができます。

#1:CODEA

#2:Año

#3:Lugar

#4:Escribano

#5:$

Texto

#1:0001

#2:1251

#3:Sevilla

#4:Juan Pérez de Berlanga

#5:$

(1) Coñocida cosa sea a todos los que esta carta vieren cómo yo don

Ferrando, por la gracia de Dios rey de Castiella, de Toledo, de León, de

Gallizia, de Sevilla, de Córdova, de Murcia e de Jaén, embié (2) mis cartas a

vós el concejo de Guadalfajara que embiássedes vuestros omnes buenos de

vuestro concejo a mí, por cosas que avía de veer e de fablar convusco por

buen paramiento de vuestra villa. E vós embiastes vuestros (3) omnes

buenos ante mí, e yo fablé con ellos aquellas cosas que entendí que eran

buen paramiento de la tierra. (…)

#1:0002

#2:1260

#3: Córdova

#4:X

#5:$

(1) Sepan todos los ombres que esta carta vieren e oyeren cómo nós don

Alfonso, por la gracia de Dios rey de Castiella, de Toledo, de León, de

Gallicia, de Sevilla, de Córdova, de Murcia, (2) de Jaén e del Algarve, en

uno con la reína doña Yolant mi mugier, e con nuestro fijo el infante don

Fernando primero heredero, e con nuestros fijos el infante don Sancho e el

infan(3)te don Pedro, por sabor que avemos de fazer bien e merced a todos

los vezinos e moradores de la villa de Guadalfajara por muchos servicios

que fizieron a nós e a nuestro linage, dámosles e (…)

otorgámosles que fagan dos ferias en la villa sobredicha de Guadalfajara por

Page 14: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

14

siempre jamás, e que las fagan dos vezes en el año, la una feria por

Cinquaesma e que dure depués de la Cinquaesma quinze días, e (5) la otra

feria que sea por sant Lucas, e comience ocho días ante de sant Lucas e dure

ocho días después.

(…)

#1 は第 1 カラムに、コロン (:)以下にあるデータが入ることを示しま

す。#2 以下も同様です。#5:$は第 5 カラムに以下の段落のテキストが

入ることを示します。

結果:段落+カラムを指定

結果:文+カラムを指定

他に「タグ (<...>)を除く」というチェックボタンもあります。これ

Page 15: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

15

はウェブのコード (HTML)内で使われているさまざまな指定を削除す

るためのものです。ホームページをそのままコピーしたときのクリッ

プボードには含まれていないので、このタグを除く必要はありません。

【実習 2.1.5】「カラムを指定」するオプションを使う実験をしなさい。

このオプションの利点と欠点を考察しなさい。

コラム:ファイルの種類と拡張子

パソコンで扱うことができるファイルには、ここで扱っているエ

クセルファイル、ワードファイル、テキストファイルのほかに多く

の種類があります。私たちはファイルの種類を意識しておくべきで

す。そうすれば、それぞれの扱い方にも慣れていきます。そのため

には、ファイルの種類を単にアイコン(ファイルの名前の前にある

小さな図)に任せきりにしないで、ファイル名も表示しておくとよ

いでしょう。

*エクスプローラ 7の「ツール」→「フォルダオプション (O)」 8

*「表示」タブの「登録されている拡張子は表示しない」のチェッ

クを外します。

7 *エクスプローラを起動するショートカットは Winsdows キー ([Ctrl]キ

ーの右 )+E。 8 WINDOWS7 ではエクスプローラの「整理」のタブの中にあります。

Page 16: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.1 読込

16

この設定により、ファイル名だけでなく、 test1.txt のように「フ

ァイル名+拡張子」が表示されるようになります。この拡張子によ

ってファイルの種類がわかり、ファイルの種類によってそれに適用

されるプログラムがわかるようになります。

ウェブなどからのコピー・アンド・ペーストは簡単

にできます。これを言語の性質を知るための資料とし

て利用できますが、テキストをそのまま発表すると著

作権を侵害することになります。資料として利用し分

析の結果を発表するときは、かならずサイト名、URL、

検索日を記載して引用しなければなりません。

また、テキストそのものを例文として引用するとき

には、あまり多くならないように適切な量を考えまし

ょう。

長いテキストを引用するときは許可を求めなければ

Page 17: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.2 マウス入力

17

なりません。そのときは著作者に理解していただける

ように自分の研究の目的と引用の仕方、発表の場など

を説明します。発表したときは感謝の気持ちと言葉を

忘れずに。

2.2. マウス入力

図:マウス入力

言語資料を扱うとき、多くの場所に同じ文字や数字を打ち込むこと

がよくあります。たとえば、アンケート調査の結果をエクセルシート

に打ち込むとき、同じ記号をさまざまな位置に書き込んだり、テキス

トデータのさまざまなセルに同じ色を塗ったりすることがあります。

このようなときエクセルでは、入力するセルを選択し、文字(または

Page 18: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.2 マウス入力

18

数字)を書き込み、Enter キーで確定します。このように 3 つのステッ

プがあり、しかも 2 番目のステップでは入力するキーを探さなければ

なりません。キーインが複数の文字だったり、文字の色を変えなけれ

ばならなかったりするとさらにやっかいです 9。

LETRAS の「入力」は、あらかじめ用意した文字や文字種を、まる

で印鑑を押すようにマウスのクリックだけで自由に入力できるように

するプログラムです 10。

2.2.1. 文字のマウス入力

初期設定のままで、「→実行」のボタンを押すと、次の画面に変わ

り、マウス入力が可能になります 11。

9 このようなときはコピー・アンド・ペーストをします。

10 LETRAS を使わないでエクセルシートで同様のことをするには、は

じめに [Ctrl]を押しながらセルを選択し、最後に文字を入力してから、

[Ctrl]と [Enter]キーを押します。 11

このように交互に変化するボタンを「トグルボタン」と呼びます。

Page 19: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.2 マウス入力

19

ここで、「停止ボタン」を押すと一時的にマウス入力を停止します。

再度実行するときは「実行」ボタンを押してください。

実行中は、シートのセルをクリックすると V の文字が入力されます12。また、複数のセルをドラッグして選択しても、その範囲が全部入

力されます。

「元に戻す」ボタンは元の文字・数字情報を黒字に戻し、すべての

装飾(文字種、文字色、背景色、枠線)をなくします。ただし、戻せ

る回数は 1 回です。あらかじめ「新シートに出力」をチェックしてお

くと、それを「▲削除」することで、初めの状態に戻すことができま

す。

12

クリック入力はセルの選択範囲が変化したときに起こす動作を利

用しているので、現在のセルをクリックしても入力されません。

Page 20: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.2 マウス入力

20

図:文字のマウス入力

【実習 2.2.1】「文字」の右にあるテキストボックスを変えて、さまざ

まなクリック入力を実験し、他にどのようなことに使えるか考えてみ

ましょう。

2.2.2. 文字の装飾

「文字色」、「文字種」、「背景色」、「枠線」を選択して、文字

を装飾して入力することができます。また、「文字」の選択を外せば、

すでに入力されたセルの文字に、文字装飾をほどこすことができます。

【実習 2.2.2】さまざまな文字の装飾の実験し、他にどのようなことに

使えるか考えてみましょう。

Page 21: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

21

2.3. 準備

「準備」のタブに移動してください。タブ「資料」の中で言語資料

整理の準備をします。

図:準備

下に見える「入力シート」に、現在アクティブになっているシート

名が表示され、「列」には選択されている列記号とタイトル行 13のセ

ルが表示されます。これがこれからの処理の対象になります。

「◎実行」ボタンによって処理を開始します。出力したシートが不

要であるときは「▲削除」ボタンで削除できます 14。右下のプログレ

13

シートの第 1 行がタイトル行です。 14

エクセルのシートのタブを右クリックして削除することもできま

Page 22: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

22

スバーで実行の進行状況が示され、実行が終了したときに実行時間が

表示されます。

2.3.1. 文字と連続番号

文字を付与

入力シートを選択し、タイトルなどの文字を入れる列またはセルを

選択します。この列の左に文字が出力されます。次に、「次の文字を

付与」を選択し、テキストボックスに文字列などを書き込みます。初

期設定ではシート名が表示されますが、このテキストボックスに直接

書き込むことで変更できます。

設定:入力シート E

出力:

連続番号を付与

入力シートを選択し、連続番号を入れる列を選択します。この列の

左に連続番号が出力されます。次に「連続番号を付与」を選択し、テ

キストボックスに開始番号を書き込みます。デフォルトでは 1 が表示

されます。

すが、これには確認のメッセージが現れます。一方 LETRAS の「削除」

ボタンは確認をせずそのままシートを削除し、フォームの内容が更新

されます。立ち上げたときに使われていたシートは LETRAS からは削

除できません。

Page 23: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

23

設定:

出力:

「選択」のコンボボックスによって、出力の位置を次の中から選択

できます。

出力:

「選択」のコンボボックス内の「振り出し」は次のように、選択列の

内容が同じという条件で、連続番号を、選択列の右に挿入した列に振

ります。

Page 24: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

24

入力:EGJ

出力:

【実習 2.3.1】適当な資料を使って「タイトルを付与」と「連続番号を

付与」の機能を実験しなさい。それぞれの用途について考察しなさい。

Page 25: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

25

2.3.2. 分離 ID と統合 ID

言語資料は文 ID15とテキストによって作ります。「分離 ID」は、段

落の ID に使う章や節などのテキストの階層を複数の列に分離した ID

です。たとえば次の入力シートを見てください。「統合 ID」は複数の

列からなる分離 ID を 1 列にまとめたものです。次の出力シートを見

てください。どちらもそれぞれの用途があります。

(1) ID を統合

最初に分離 ID を統合 ID に変換する実験をします。A 列(分離 ID

の開始列)を選択して実行してください。「階層数」はここでは 2 列

の構成なので 2 とします 16。

入力:E.sep

設定:

出力:

15

「文 ID」は段落、文、句などの単位になることがあります。ここで

は『創世記』の各節を単位にしています。 16

このような形式はテキストデータさえあれば先に扱った「タイトル

を付与」と「連続番号を付与」で簡単にできます。

Page 26: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

26

(2) ID を分離

逆に、統合 ID から分離 ID に変換します。統合 ID のある列(ここ

では A 列)を選択して実行してください。

設定:

出力:

【実習 2.3.2】適当な資料を使って「分離・統合 ID」の機能を実験し

なさい。それぞれの用途について考察しなさい。

2.3.3. 配置

縦に並んだデータをその A 列と B 列の内容にしたがって横に並べか

えます。ちょうど 2 次元の座標のように A 列で行を決め、B 列で列を

決めます。これは日本語と英語などを比較しながら分析するために有

用です。このような形式の言語資料をパラレルコーパスと呼びます

(→コラム)。

逆に、横に並んだ資料を縦に並び替えるプログラムも有用です。縦

に並べ替えることによって、各行のデータによって並べ替えができる

ようになります。

Page 27: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

27

(1)並列配置

入力:EGJ

設定:

出力:

(2) 直列配置

入力:EGJ.p

設定:

出力:

【実習 2.3.3】適当な資料を使って「配置」の機能を実験しなさい。そ

れぞれの用途について考察しなさい。

Page 28: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

28

2.3.4. シートの結合と分離

(1)シートを結合

複数のシートを1つのシートに連続して結合させます。リストボッ

クスで複数のシートを選択してください。初期設定では「1行目はタ

イトル」にチェックをいれてあります。これによってそれぞれのシー

トで繰り返されるタイトル行が出力シートでは最初のシートの最初の

1行だけとなります。タイトル行がなく、データが1行目からあるシ

ートを結合するときは、このチェックを外してください。

設定:

Page 29: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

29

出力:

(2)シートを分離

A 列にあるデータを基準にして異なるシートに分離します。A 列の

データの種類が多いと、その数だけシートが作成されてしまうので、

最大シート数の初期値を 10 としてあります。

入力:EGJ

設定:

出力:

このシートの名前は次のように、入力シートの A 列の名前の前に「識

Page 30: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

30

別記号」をつけたものになります 17。

【実習 2.3.4】適当な資料を使って「シートの結合」と「シートの分離」

の機能を実験しなさい。それぞれの用途について考察しなさい。

2.3.5. シートコピー

現シートをそのまま新シートにコピーします。エクセルのフィルタ

ー機能を使って、選択した状態でコピーするときに便利です。

2.3.6. フォント・行幅・高を調整

「説明」タブで選択した「最大列幅」に従って、列の幅を自動調節

し、選択された「フォント名」と「サイズ」で文字の書体を統一しま

す。

「最大列幅」の初期値は 60, 「フォント名」と「サイズ」の初期値

は、それぞれ Times New Roman と 11 です。変更するときは、「説明」

タブの該当する部分を調整してください。

17

識別記号を使うのは、それがないとすでに存在するシートと同じ名

前になってしまうからです。

Page 31: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.3 準備

31

【実習 2.3.6】適当な資料を使って「最大列幅」、「フォント名」、「サ

イズ」を変更して「1.3.5. フォント・行幅・高を調整」の機能を実験

しなさい。

コラム:パラレルコーパス

さまざまなテキストの比較をすることで、1つのテキストだけを見

ていては気づかなかった特徴が見つかることがあります。この比較と

いう方法はとても有効です。19 世紀に科学的な言語研究はラテン語、

ギリシャ語、サンスクリット語などの古典語を比較して、そこに規則

的な対応関係を発見したことから始まりました。

1 つの言語の発展段階を比較することもあります。次は旧約聖書『士

師記』の「サムソンとデリラの物語」について中世スペイン語による

9 つの翻訳を比較したものの一部です。下の図の RV は現代スペイン語、

1 ~ 9 は 13~15 世紀の中世スペイン語の翻訳です。同じ意味を示す語

がテキストによって様々に対応しています。これを見ると古いスペイ

ン語形が新しい語形に変化していく様子がわかります。

図:中世スペイン語語彙の比較

比較法は言語学習教育研究でも有用です。たとえば日本語と英語の

対応表を使って、一定の日本語表現に対応する英語を見つけたり、逆

Page 32: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.4 行列

32

のことをしたりして表現の幅を拡げることができます。次は中学英語

で「サッカー」を検索した結果です 18。

図:日本語と英語の対応表

2.4. 行列

1つ、または複数の列(または行)を抽出、削除、挿入、移動しま

す。これらはエクセルシート上でも可能ですが、遠く離れた複数の列

や行を対象に1回の操作で行うことができて便利です。

18

東京学芸大学付属世田谷中学校の日臺滋之さんからパラレルコー

パスの活用報告をいただきました。

http://lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/easykwic/index.html

Page 33: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.4 行列

33

図:行列

シートで列(または行)を選択すると、「対象列」(または「対象

行」)に反映されます。ここに直接書き込むこともできます。「移動」

を選択すると、「移動先」のラベルとテキストボックスがアクティブ

になります。このテキストボックスに直接書き込んでください。「対

象列」を E A-B のように昇順以外で指定すると、その順番で出力しま

す 19。

19

同じ列または行を 2 回選択すると繰り返して書き込まれます。たと

えば、「ABA」のように 2 回選択すると A 列は 2 つ繰り返して書き込

まれます。

Page 34: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.4 行列

34

2.4.1. 抽出

抽出する列または行を選択します。ここではシート Voc を使います。

入力:Voc

設定:

複数の列を連続して選択するときは、 [Shift]キーを押しながら最初

と最後の列をクリックしてください。複数の列を個別に選択するとき

は、 [Ctrl]キーを押しながら、それぞれの列をクリックしてください。

列を選択するときは、上にある A, B, C, ...という列の表示部をクリッ

クします。行を選択するときは、左にある 1, 2, 3, ...という列の表示部

をクリックします。

このように列や行をシート上で選択することもできますが、直接ユ

ーザーフォームの「対象列(行)」に書き込むこともできます。その

ときは、列の場合はアルファベットで、行の場合は数字で書き込んで

ください。連続するときは、B-D F-、-3 5-8 のように書いてください。

Page 35: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.4 行列

35

出力:

【実習 2.4.1a】適当な資料を使って「抽出」の機能(列、行)を実験

しなさい。

2.4.2. 削除

同様にして列または行を選択して「削除」を実行すると選択した列

または行を削除します。

設定:

出力:

【実習 2.4.2】適当な資料を使って「削除」の機能(列、行)を実験し

なさい。

2.4.3. 挿入

同様にして列または行を選択し、列数または行数を入力して「挿入」

Page 36: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.4 行列

36

を実行すると選択した列または行を挿入します。

設定:

出力:

【実習 2.4.3】適当な資料を使って「挿入」の機能(列、行)を実験し

なさい。

2.4.4. 移動

最初に移動する列または行を選択しておきます。次に「移動」のオ

プションをクリックすると、「移動先列(または行)」がアクティブ

になりますから、そこに移動先の列(または行)を書き込みます。

Page 37: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.4 行列

37

設定:

出力:

【実習 2.4.4】適当な資料を使って「移動」の機能(列、行)を実験し

なさい。

行と列

一連の言語テキストの中の特定の要素(キーワード)に注目したと

き、次の二つの視点からその要素を分析します。1つはそれと共起す

る要素との関係です。これは「連辞的な関係」 (syntagmatic relation)と

呼ばれ、エクセルでは行を横に見ていくことになります。たとえば、

動詞とその目的語の位置関係などは行内で観察されます。この方法は

第Ⅱ部の「内置」や「共起」の「語形」オプションで扱います。

Page 38: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.5 離合

38

一方、注目したキーワードと同じ環境に現れる他の要素との関係も

重要です。これは「範列的な関係」(paradigmatic relation)と呼ばれ、エ

クセルでは列を縦に見ていくことになります。この方法は第Ⅱ部の「共

起」の「語形」以外のオプションで扱います。

このように行と列を縦横に見渡すことは、言語テキストに限らず一

定のルールで分類したエクセルシートの全体を観察するときにも有用

です。縦に見ていくことで観察されることと横に見ていくことで観察

されることから、いろいろなことに気づくはずです。そして全体を眺

めることも必要です。そのとき、一定の行や列を抽出・削除したり、

移動したりすることによって、以前に気づかなかった規則性や傾向が

はっきりと現れてくることがあります。また、次に扱う「離合」や「整

列」も同じように役に立つはずです。

2.5. 離合

複数の列のデータを特定のマークを間に介して結合します。また、

逆に1列の中にある文字列を、特定のマークによって複数の列や行に

Page 39: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.5 離合

39

分離します 20。

離合

エクセルでは行と列で示されるセルに分かれたデータを扱うので、

構造化されたデータを分析するのに適しています。一方、別々の列に

分かれたデータをまとめたり、1つの列に入ったデータを複数の列に

分けたりことが必要になることがあります。たとえば異なる列に配置

された動詞の変化形と代表形をアンダーバーでつないで別の列に出力

させておくと、後で分析がしやすくなります。

20

このマークは、一般に区切り記号(セパレーター)と呼ばれます。

Page 40: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.5 離合

40

2.5.1. 列の結合

1つのシートの複数の列を選択し、それらをマークをつけて結合し

ます。列の選択は連続している必要はなく自由です。初期設定では出

力で結合する対象列を削除します。結合する対象列を保持するときは、

「元列を保持」をチェックしてください。結合された列は入力シート

の選択列の左の位置に出力されます。

設定:

出力:

【実習 2.5.1】適当な資料を使って「列を横に結合」の実験しなさい。

2.5.2. 横に分離

1列の中にあるデータをマークによって要素の数だけ複数の列に分

離します。

Page 41: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.5 離合

41

入力:1.5.1 の出力シート

設定:

図:横に分離

出力:

(...)

【実習 2.5.2】適当な資料を使って「列を横に分離」の実験しなさい。

2.5.3. 縦に分離

マークによって1列を複数の列に分離し、要素の数だけ縦に並べて

出力します。次は分離するマークとしてコンマ (,)を指定しました。

入力:1.5.1 の出力シート

設定:

図:縦に分離

出力:

Page 42: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.6 整列

42

【実習 2.5.3】適当な資料を使って「列を縦に分離」の実験しなさい。

要素・単位

エクセルでは基本的に1つのセルに1つの要素を配置します。そ

のとき何を要素とするか、その単位を明らかにしておかなければな

りません。そうでないと列の中に異質な要素が混じってしまい、後

の分析が困難になるからです。

動詞の変化形と代表形のように、異なる要素を1つにまとめて結

合要素とすることもあります。これは、第Ⅱ部で扱う「分析」の対

象がいつも1列に限られ、分析の単位がいつも1つになるからで

す。

言語資料を分析するとき、合成語や成句などを1つの単位とする

か、または複数の単位の結合とするかで、分析の結果が異なります。

記述言語学 (Descriptive Linguistics)の方法では、この「単位」という

ことについて非常に熱心に論じられ、その理論的な定義について論

争が繰り返されました。要素の単位が決まらないと言語の記述がで

きないからです。これは理論が優先される演繹的方法です。

一方、コンピュータで言語を処理するときには、多くの場合、書

かれたテキストをそのまま使い、要素がつながるときの傾向を数量

的に計算することで、単位としての結合要素を見いだしていく、と

いう帰納的な方法が採られています。こちらのほうが実際的です。

両者の立場の違いは学習・研究用コンピュータの出現以前・以後の

時代差が反映されていると思います。

2.6. 整列

データの並べ替えはエクセルで頻繁に行う作業ですが、ここで扱っ

ている「統合 ID」はエクセルによる並べ替えではできません。「整列」

のタブで、それを可能にしました。また、言語研究でよく使う逆引き

配列による並べ替えもあると便利です。初期値は昇順ですが、「降順」を

選択することができます。

Page 43: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.6 整列

43

整列

2.6.1. 一般的な整列

はじめに一般的な並べ替えによる整列をしてみましょう。昇順の場

合は「第 1 キー」だけを選択します 21。

21

数字は文字の順番ではなく、数の大小を基準にします。たとえば、

2, 1, 11 の昇順は 1, 2, 11 であり、1, 11, 2 という(文字の)順番になり

ません。

Page 44: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.6 整列

44

設定:

出力:

【実習 2.6.1】適当な資料を使って「一般的な整列」の実験しなさい。

「昇順」と「降順」の選択と、「大小文字区別」と「1行目はタイト

ル」のチェックの有無を確認して実験しなさい。

2.6.2. 統合 ID の整列

統合 ID による並べ替えをします。統合 ID の各要素は 5 桁までの大

きさまで並べ替えられます。ここではシート Gen を使い、対象となる

A 列を選択します。

設定:

Page 45: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.6 整列

45

出力:

【実習 2.6.2】適当な資料を使って「統合 ID の整列」(昇順・降順)

の実験しなさい。「分離 ID」の整列法についても考えなさい。

2.6.3. 逆引き配列による整列

対象の文字列の逆引き配列による整列をします。語尾による語形変

化などの分析に役立ちます。

設定:

出力:

(...)

【実習 2.6.3】適当な資料を使って「逆引きの整列」(昇順・降順)の

機能を実験しなさい。この出力の用途について考察しなさい。

Page 46: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.6 整列

46

並べ替え・逆引き

エクセルの並べ替えの機能は強力で、かなり大きなデータでも短

時間で出力します。LETRAS でもコードの中でその機能を利用して

います。

現在のようにコンピュータが手軽に使えなかった時代には、言語

資料はカードに書き写していました。エクセルの1行にあたる部分

が1枚のカードになります。カードの束をいろいろな基準で並べ替

えたり、広い空間に配置したりしてカードごとの関係を調べまし

た。カードの数が尐なければそれほど時間もかからないのですが、

言語資料は膨大な量になることがよくあります。

そこでエクセルの登場です。しかし、セルにデータを1つずつ書

き込んでいく作業はカードを作るのとほとんど変わりがありませ

ん。できるならば、一連のテキストデータから自動的な作業をして、

分析用のシートにしておきたいものです。

分析用シートができてしまえば、それからの作業はアイデア次第

でさまざまな出力が得られます。並べ替えもその一つです。並べ替

えの出力は単純なので、言語資料の分析にはあまり役に立たないと

思われるかもしれません。でも、データが昇順・降順に並んでいる、

ということには次のような大きな利点があります。

・検索がしやすい

・同じデータが集まっている

・類似したデータが近くにある

・同一または類似したデータの量が視覚的にとらえられる

・不規則・不良なデータが判明する

そして、キーを増やせば下位分類ができます。第 1 キーが大分類、

第 2 キーが大分類中の中分類、第 3 キーが中分類中の小分類になり

ます。

文字列を昇順に並べたときも、これと同じ原則になっていること

がわかります。たとえば次のリストでは、

Page 47: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.6 整列

47

a という文字の大分類の次に、ゼロ、b, c, d という 2 文字目が基

準となる中分類があり、さらに d という中分類には 3 文字目の a, d

という小分類があります。さらに a という小分類の中では e (=Adae)

と m(=Adam)に分かれています。私たちが辞書を使うときは基本的

にこのような順で検索をしています。

次は逆引き・昇順の出力です。

ここでの第 1 キーは語尾の a となります。第 2 キーは語尾から 2

番目の文字でゼロ、d, e, i が並んでいます。第 3 キーは語尾から 3

番目の文字です。第 2 キーまでが同じ ia の中で dia と lia が並んで

います。volatilia と reptilia を比較すると tilia が同じなので第 6 キー

(語尾から数えて 6 番目の文字 )の a と p が比較され volatilia が昇順

では先になります 22。このように逆引きではキーを語尾から数えて

いくので、右揃えのほうがわかりやすいのです。

この逆引き配列は語尾について、先に挙げた 5 つの利点があては

まりますから、たとえば活用形、接尾辞、英語の ‟s などの付加など

22

実際のマクロによるプログラミングでは正引きでも逆引きでも文

字列全体を比較し、ここでしたような個別の文字の比較をしません。

Page 48: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.7 置換

48

を調べるときに便利です。

2.7. 置換

置換

エクセルの置換の機能は限られています。LATRAS では、正規表現

と単語リストの連立式を使って、言語テクストを分析に適した形に変

換することができます。

Page 49: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.7 置換

49

2.7.1. 正規表現

中央のテキストボックスに、たとえば次のような正規表現の置換式

を書き込むと、 a で始まる語にマッチして、両側を<*...*>で囲む出力

が得られます。

設定:(#a%)=><*$1*>

データ:

結果:

大小文字区別

「大小文字区別」をチェックして次の置換式を使うと、小文字では

じまる語だけにマッチします。

設定:(#t%)=><*$1*>

結果:

Page 50: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.7 置換

50

シート・列

特定のシートの列にある置換式をテキストボックスに移入すること

ができます。

設定:

結果:

【実習 2.7.1】さまざまな正規表現による置換の実験をしなさい。

2.7.2. 単語リスト

次のように「単語リスト」を選択すると、単語を単位にして置換し

ます。次の例では、 (1:1)の In は P に置換されますが、 (1:2)の inanis

Page 51: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.7 置換

51

の in は置換されません。

設定:

結果:

(1) シート・列

特定のシートの列にある置換式をテキストボックスに移入すること

ができます。

Page 52: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.7 置換

52

設定:

結果:

(2) 付加

「付加」をチェックすると、検索語に置換語が付加されて、「検索

語_置換語」という連続となります。

設定:

Page 53: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.7 置換

53

結果:

【実習 2.7.2a】さまざまな単語リストによる置換の実験をしなさい。

【実習 2.7.2b】次のように出現形_代表形というペアを出力する方法を

考えなさい 23。

2.7.3. 単純部分一致と単純完全一致

「単純一致」は正規表現や単語リストを使わずに、単純で一般的な

置換をするときに使用します。たとえば、正規表現ではピリオド (.)や

クエスチョンマーク (?)は一定の意味を持ちますが、単純一致ではそれ

らは普通の文字として扱われます。

「部分一致」はセル内の文字列に一部でも一致すれば、それが置換

されます。一方、「完全一致」ではセルの全体が完全に一致したとき

き、置換されます。

23

あらかじめ「離合」を使って出現形 _代表形の列を作っておくとよ

いでしょう。

Page 54: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.7 置換

54

2.7.4. 一回一致

「一回一致」をチェックすると、セル内の文字列に一度一致したと

きは、連立式のそれ以後の置換をしないで、次のセルの置換に移りま

す。「一回一致」のチェックを外すと、1つのセルに連立式すべての

置換が行われます。

2.7.5. ID 参照

一定の ID のあるデータだけを置換するときに使用します。

書式は、イコール記号 (=)を連続 2 回 (==)で ID と検索文字列を区切り

ます。さらに「=>」で検索文字列と置換文字列を区切ります。たとえ

ば、(1:3)==Deus=>DDD は ID 列に (1:3)があるデータだけを選んで、Deus

を DDD に置換します。

Page 55: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.7 置換

55

疑似文節

日本語では単語 (word)の分かち書きをしませんが、それでも「文

節」という単位は直感的に把握できると思います。中学校では、途

中に「ネ」が入れば、そこが文節の区切りである、と教わりました。

たとえば、次のような感じです。

それでもネ、「文節」というネ、単位はネ、直感的にネ、

把握できるとネ、思いますネ。

コンピュータには日本語の直感がなく、適当な位置に「ネ」を入

れてもらうこともできないので、何らかの形式的な特徴を教えてあ

げなくてはなりません。そこで、次のようなルールを考えてみまし

ょう。

ルール (1):同一文字種(ひらがな、カタカナ、漢字、

ローマ字、数字)のつながりを仮の文節とする

ルール (2):2つの単位の連続で、後半が「ひらが

な」の連続であるときは、2つの単位を繋げて1

つの文節とする

それぞれのルールを LETRAS の正規表現で書くと次のように

なります。

(¥h+|¥k+|¥z+|¥l+|¥d+)=>$1/

(¥k+|¥z+|¥l+|¥d+)/(¥h+)=>$1$2

早速このコラムの第1段落にルール (1)を適応してみましょう。

次にルール (1)と (2)を連立して適応します。

Page 56: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.7 置換

56

まだ、ひらがなの連続や、数字とピリオド、括弧(「…」)の処

理などの課題が残っていますが、それでもかなり文節の単位に近く

なっていることがわかります。

私たちは1文字ごとに読んでいるのではなくて、漢字、カタカナ、

ローマ字、数字、ひらがなのかたまりをピョンピョン飛ぶようにし

て読んでいるのだと思います。それがちょうど意味の単位にもなっ

ているので、日本語のシステムはある程度合理的です。文字を習い

始めた小学生低学年の頃は、一文字ずつ追いかけていたので、なか

なか読み進むことができませんでした。また、読んでも意味の単位

が取りにくくて、よくわからなかったこともあったと思います。

なお、数字とピリオド、 (...)や「…」の問題は次のようにルール

で処理できるでしょう。

置換式 (1‟): (¥h+|¥k+|¥z+|¥l+|[¥d.]+)=>$1/

置換式 (2‟): (¥k+|¥z+|¥l+|[¥d.]+)/([)」 ]*)(¥h+)=>$1$2$3

LETRAS はこのように正規表現の連立式が立てられます。日本語

の規則を考えながら、さらに上の置換式を精密化することができま

す。

音韻変化規則の順序

『創世記』のラテン語訳とスペイン語訳のテキストを比べると、

それぞれの対応する単語の形が似ていること、そしてスペイン語に

は歴史的な音韻変化の結果が見られることがわかります。

Page 57: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.7 置換

57

ラテン語:

スペイン語:

ここでは次の 2 対の語に注目しましょう。

意味 ラテン語 スペイン語

天 caelum cielo

地 terram tierra

スペイン語の歴史音声学の本には多くの音韻規則が挙げられて

いますが、このデータでは次の規則が関係します。

・二重母音の単母音化 (ae>e)

・強勢のある e の二重母音化 (e>ie)

・語末の m の脱落 (-m>ゼロ )

・語末音節の u の変化 (-u->-o-)

これらの変化を LETRAS の正規表現に直すと次のようになります。

ae=>e

„e=>i‟e

m#=>

u(¥c|)#=>o$1

結果(1):

たしかに正規表現は cielo と tierra という現代スペイン語形を出力

しました。

ところが、最初の 2 つの規則の順番を次のように変更すると、正

しい結果が得られません。

Page 58: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

58

e=>ie

ae=>e

m#=>

u(¥c|)#=>o$1

結果(2):

terra > tierra は正しく出力されましたが、caelum > caielu となって

います。 e=>ie という規則が最初に caelum に適用されて caielum と

なるので、 ae=>e はもう適用されません。

このように音韻変化の規則のなかには適用の順番が決まってい

るものがあります。それぞれの規則が適用されていた時期を歴史的

に正確に決定することは不可能ですが、このような考察によってそ

れぞれの規則が働いていた時期の相対的な順番がわかります。

一方、後の 2 つの規則の順番を変えても結果に影響しません。

ae=>e

e=>ie

u(¥c|)#=>o$1

m#=>

語末の m の脱落と二重母音の単母音化 (ae>e)の間には、それぞれ

の変化の条件が相互に関係しないからです。コンピュータは連続的

に処理をしますから、どうしてもどちらかの順番を選ばなければな

りません。でも、私たち人間が行う分析では解決法を絶対的に1つ

に決めないで、別解があるかどうかも考えて解答を相対化すべきで

す。

2.8. 鍵語

次の「鍵語」のタブの中にある、検索、集計、外置、内置、索引、

連続と別のタブにある「共起」というテクスト分析法を扱います。

Page 59: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

59

「鍵語」タブのオプション

検索では、テキストの中のキーワードをマーク

します。

集計では、キーワードの出現頻度を計算します。

外置では、キーワードを独立した列に取り出して、元の文と一

緒に表示します。

内置では、キーワードを中心に置き、その前後の文脈を左右に

配置します。

索引では、キーワードを文の標識(テキスト名や文番号などを

示したmので、以下では文 ID と呼びます)の集合と共に表示し

ます。

連続では、キーワードと一緒に現れる語をその位置にそって集

計したり、集めたり、連続して扱ったりして、その共起関係を

Page 60: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

60

探ります。

共起では、2 つのキーワードの共起関係を、さまざまな係数を使

って比較します。

図:テキストのさまざまな分析法

2.8.1. 集計

「集計」のタブではキーワードの出現頻度を計算します。

集計のイメージ

集計

索引

検索

外置

内置

連続 テキスト

Page 61: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

61

図:【鍵語】:「集計」

「整列」で「文字順」と「出現順」が選択できます。「文字順」で

はキーワードを ABC 順に並べ替えます。「出現順」ではテキストの中

で出現する順番に従います。

(1) 文字順の整列

「整列」タブで「文字順」を選択します。正規表現の検索式によって、

1つ以上のシートにあるデータの頻度を分析します。

検索式は正規表現で示します。たとえば、a で始まる語は「\ba\w*」

となります。拡張正規表現を使えば「#a%」となります。

入力シートは複数選択ができます。単数でも可能です。各シートの

選択列が分析対象になります。なお、複数選択の入力シートではリス

トボックスで選択されたシート名でエクセルのシートが変更されるこ

とはありません。結果は次のようにそれぞれのシート・列について該

当する文字列の度数が出力されます。

Page 62: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

62

結果:

【実習 2.8.1a】すべての単語を検索する式は「 ¥w+」(または拡張正

規表現では「&」)です。これを使ってシート c.1, c.2, c.3 を「集計」

し、出力列の数字を比較しなさい。

【実習 2.8.1b】単語リスト(シート Voc, A 列 c.1-2)を使ってシート

c.1, c.2, Gen を比較しなさい。

【実習 2.8.1c】適当なシートを選び、データ内の変化形を代表形に「置

換」し、集計しなさい。変化形と代表形の集計を比較し、気づいたこ

とを書きなさい。

【実習 2.8.1d】シート Gen を対象にして、「索引」の「度数」によっ

て整列をして出力させなさい。その B 列をエクセルのグラフ(折れ線)

で表現し、気づいたことを書きなさい。その結果を観察して気づいた

ことを書きなさい。

スペイン語の Dios

「神」はスペイン語で Dios といいます。これは一般の複数名詞の

ように s で終わっているので尐し不思議です 24。意味はもちろん単

24

1492 年にスペインから離散したユダヤ系スペイン語では Dios とい

う語形が複数のように解され、ここから Dio という単数形が生まれま

した。

Page 63: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

63

数です。実は、これはラテン語の主格形 Deus から派生した言葉で

す。一般にスペイン語の名詞はラテン語の対格形に由来するのです

が、この Dios は例外です。きっと、主格形の使用頻度が高かった

のだろうと思います。このことを『創世記』で確かめてください。

L 字形分布

ラテン語訳『創世記』の全出現語の度数を「集計」または「索引」

を使って計算し、そのグラフを描いてみると次のような形になりま

す。

一番頻度の高い et (=英 and)は 1922, 次が in(=英 in)が 713,

est(=英 is)が 402, ...と続きます。このように語の頻度を降順で

辿っていくとその減尐が急であることがわかります。そして et, in,

est などの高頻度語の数が非常に尐なく、逆に低頻度語は非常に数

多くあります。『創世記』で頻度が 1 の語は 3480 もありました。

その様子を示しているのが、上の図です。このような分布は「L 字

形分布」と呼ばれ、どのようなテキストでも比較的大きなものであ

れば、このような分布を示します。ここでは名詞や動詞などの変化

形などを代表形にまとめこんだ計算をしていませんが、代表形にま

とめてもその分布は同様の傾向を示します。

言語は、種類は尐ないけれど非常によく使われる接続詞、前置詞、

代名詞などの「機能語」(function word)と、種類はとても多いけ

Page 64: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

64

れ ど あま り 使わ れる こと が ない 名 詞や 動 詞な どの 「 内 容 語 」

(content word)から成り立っています。このように頻度が偏ってい

ることはバランスがとれていないように見えますが、むしろ言語の

あり方にとして合理的だと思われます。かりにすべての単語が同じ

頻度で使われるとしたら、機能語の数はまったく不足してしまい、

同じ内容語が何度も繰り返されることになります。これでは言語と

しての働きをなさなくなるでしょう。

ところで、『創世記』でもっとも頻度が高い内容語はやはり先の

コラムでもあつかった Deus (=英 God)でした。度数は 157 で、代名

詞などよりも頻度が高く、全体で 15 位の位置を占めています。こ

のような語はテキストの中で特徴語と呼ばれ、とくに注意が必要で

す。

(2) 出現順の整列

「整列」タブで「出現順」を選択します。

テキストの中で出現する順に従うので、次のような分布パタンを示

します。

Page 65: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

65

【実習 2.8.1e】シート Gen を用いて次の検索式で「集計」を「文字順」

と「出現順」で実験し 25、結果を比較しなさい。

&t# &m#

&t# &[aeo]s#

*検索式のくくり方

検索式は「現指定:テキスト」でも、「既指定:シート・列」でも

複数設定できます。また、複数の式は共通の部分を括弧 (...)でくくる

ことによって1つの式にまとめることも可能です。たとえば、

&t# &m#

&t# &s#

25

連立検索式をテキストボックス内で改行するときは、 [Shift]キーま

たは [Ctrl]キーを押しながら [Enter]キーを押してください。

Page 66: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

66

は次と同じ意味になります。

&t# &[ms]#

さらに上の【実習】で与えられた次の式も

&t# &m#

&t# &[aeo]s#

次のようにくくることができます。

&t# &(m|[aeo]s)#

この検索式による出力を確かめておいてください。これは数学で行

う「ax + bx = (a + b)x」というくくり方とよく似ています。はじめは連

立検索式を使って練習し、慣れてきたら式をまとめていくとよいでし

ょう。

*置換式と検索式を連立する

たとえば、語頭の「2 子音連続+母音」を検索するとき、検索式を

「#¥c¥c¥v]とすると子音と母音のすべてが展開されます。

(入力シート: c.1, c.2, c.3 出力は一部です)

子音連続だけを調べたいときには、置換式で、母音 (¥v)を一定の文字、

たとえば「母音」に変換してから、検索式で「 ¥c¥c 母音」を検索する

と、母音は「母音」という形で代表されて個々の母音に展開されませ

ん。

Page 67: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

67

(入力シート:Gen)

【実習 2.8.1f】「神」を示すラテン語主格 deus, 属格 dei, 与格・奪格

deo, 対格 deum の頻度を調べ、気づいたことを書きなさい。

【実習 2.8.1g】置換式と検索式を連立する実験をしなさい。

Page 68: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

68

コラム:対照頻度表

複数のシートを使った「集計」の結果は対照頻度表になり、各種の

統計分析にかけることができます。また、対照頻度表そのものの観察

も興味深いものがあります。

次の図は Letras の「集計」を使って中世スペイン語に翻訳された『創

世記』50 章の中にある i, j, y の文字の出現頻度を調べたものです 26。

実は、これらの 3 つの文字は同じ語の中でも、mi, mj, my; amigo,

amjgo のように交替して使われていました。このような分布を自由変

異 free variation と呼びます。当時これらは同じ文字(文字素 grapheme)

のバリアント (異文字: allograph)でした。

ところが、実際にその分布を調べてみるとグラフの実線が示すよう

に、j の文字が途中まで (14 章の途中まで )ほとんど使われていないので

す。自由変異のバリアントならばどこにでも出現するはずです。翻訳

本の製本の状態を見ると 14 章の途中で帖 (quire)が分かれています。書

体の違いからここで写字生が交替したことがわかります。これらのバ

リアントの使い方には個人差があったようです。

26

Schonfield, Jeremy (ed.). 1992. Companion volume to the facsimile

edition. La Biblia de Alba. An illustrated manuscript Bible in Castilian , by

Rabbi Moses Arragel. Madrid. Fundación Amigos de Sefarad.

Ueda, Hiroto. 2009. “Palatal graphemes in a medieval Spanish biblical text:

a corpus analysis of «i, j, y» in Genesis, Biblia de Alba”, Corpus analysis

and variation in linguistics , edited by Yuji Kawaguchi, Makoto Minegishi

and Jacques Durand, John Benjamins Publishig Company, pp. 239 -257.

Page 69: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

69

2.8.2. 索引

「索引」では、キーワードを文 ID27の集合と共に表示します。

図:「索引」のイメージ

図:【鍵語】:「索引」

27

文 ID については「1.3 準備」を参照してください。

Page 70: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

70

整列:文字列

はじめに上の設定のまま文字列による整列をして出力させてみまし

ょう。

結果:

このように A 列にキーワード、B 列に度数、そして C 列に文 ID が

出力されます。度数(頻度)も重要ですが、実際にどの文に出現する

のかを知ることも有用です 28。アスタリスク (*)は同じ文 ID に繰り返し

て出現することを示します。

シート名出力

これをチェックすると、C 列にシート名が加わります。

【実習 2.8.2a】シート Gen を使って、「大小文字区別」をチェックし

大文字語だけを出力しなさい。

28

度数をシートごとに計算するときは「集計」を使います。

Page 71: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

71

【実習 2.8.2b】次に「検索・置換」を使って、上の課題の出力からす

べての Gen を除去しなさい。

整列:出現順

次に、「整列」→「出現順」のオプションを使ってみましょう。

対象:シート c.1, c.2, c.3

結果:

【実習 2.8.2c】シート Gen を対象にして、「索引」の「出現順」によ

って#Abr%を出力させなさい。その結果を観察して気づいたことを書

きなさい。

Page 72: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

72

整列:度数

最後に、「整列」→「度数」のオプションを使ってみましょう。

結果:

*注意:セルが一度に表示できる大きさには制限があります。たとえ

ば、次の C2 のセルをダブルクリックすると下に展開されて全体を見る

ことができます。

Page 73: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

73

【実習 2.8.2d】上の出力の B 列を昇順で並べ替えなさい。降順と昇順

の整列の結果を比較しなさい。

【実習 2.8.2e】「集計」でシート c.1 と c.2 の出現形を比較し、「索引」

を使って、 c.1 と c.2 に共通する出現形のリストとその文 ID を出力し

なさい。

Page 74: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

74

類義語

ラテン語訳『創世記』には「(彼は)言った」という意味で主に ait,

dixit, inquit という 3 つの変化形が使われています。

Page 75: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

75

ちょっと数が多いのですが、それぞれのキーワードの出現形(以下

ではこれをインスタンスと呼びましょう)をラテン語訳の原典である

ヘブライ語テキストの中で探してみましょう。たとえば、ait の(1.11),

(1:26), ...のインスタンス、dixt の(1:6)のインスタンス…という具

合です。そうすると、これら全部は基本的に一つのヘブライ語動詞に

対応していることがわかります。

それでは、ラテン語の 3 つの動詞はまったくの同義語でバリアント

に過ぎなかったのでしょうか。翻訳したヒエロニムスは 3 つの動詞を

気ままに使っていたのでしょうか。

ここで、ふたたび「内置」で同じキーワードを検索してみると、文

末では ait だけが使われていて( ait は文末だけに限りませんが)、「~

と言った」というような付け足しのような感じです。

inquit は文中に挿入され、日本語にすれば「~―と彼は言った―~」

というような感じです。

この 2 つの動詞に対して、dixit は文頭で用いられ(逆に文頭だから

と言って dixit になる、ということではありませんが)、「(彼が)言

ったことは~」というようなしっかりとした意味合いが感じられます。

Page 76: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

76

スペイン語(だけではありませんが)はこれらの類義語(けっして

「同義語」ではありません)の中から dixit だけを継承しました。dixit

のはっきりとした意味と形が好まれたのだと思います。

2.8.3. 検索

言語資料を分析するとき、関心のあるキーワード(一定の語、語の

連続、語の一部)に注目して、テキストの中でそれらの出現を確認す

ることがよくあります。LETRAS では正規表現または単語リストを使

って、エクセルの列の中に見つかるキーワードを記号や色でマークす

ることができます。

検索のイメージ

また、一定の規則にしたがう置換式を用いて、テキスト全体の内容

Page 77: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

77

を変えることもできます。

次が、検索・置換のオプションボタンを押したときのフォームです。

図:【鍵語】:検索

「■検索式」には「正規表現」、「単語リスト」、「単純一致」が

選択できます。その下のテキストボックスに正規表現や単語リストを

書き込むことやコピーアンドペーストができます。これを消去すると

きはその左上にある「クリア」ボタンを押してください。

とくに「大小文字区別」するときには、このチェックボタンを押し

ます。

その下の「シート」と「列」のコンボボックスは、すでにシート・

列に用意してある検索式や単語リストを使うときに開きます。

以上は、鍵語タブのすべてのオプション(検索・置換、集計、外置、

内置、索引、共起)に共通です。

検索・置換のオプションでは、「マーク」から「記号」、「文字色」、

「(なし)」を選択できます。これらによって出力の形式が決まりま

す。

「入力シート」は「◎複数選択可」となります。

「列」で検索・置換の対象とする列を選択します。「新シートに出

力」のチェックがあれば、出力は新しい別のシートになります。この

チェックを外すと現在選択されているシートにそのまま出力されます。

元のデータを保持しておきたいときには、必ずこの「新シートに出力」

Page 78: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

78

のチェックを入れておいてください。

*注意:「鍵語」では「入力シート」が「◎複数選択可」となります。

このときエクセルの画面のアクティブシートは変更されませんが、「入

力シート」で選択された全部のシートが分析の対象になります。

(1) 検索式をテキストボックスに

はじめに、立ち上げたときの設定のままで「入力シート」で c.1 を

選択し、「実行」ボタンを押してみましょう。

図:入力シート:11_c.1:B_Text/新シートに出力: yes

次のようにテキストボックスを書き換えみましょう。

Page 79: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

79

【実習 2.8.3a】「大小文字区別」にチェックを入れて、結果を比較し

なさい。

【実習 2.8.3b】ピリオド (.)の特殊文字とリテラルの設定をして、結果

を比較しなさい。

【実習 2.8.3c】文字クラス、グループ、繰り返し、LETRAS 拡張正規

表現、後方参照の実験をして、気づいたことを書きなさい。

(2) 検索式をシート・列から

置換・検索式を別のシートの一定の列に用意しておき、それを参照

して検索・置換します。

Page 80: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

80

図:シート:9_RE

・列:A_RE-1

たとえば上の例では、次のシート (RE)の A 列 RE-1 を参照していま

す。参照した検索式はテキストボックスに再生されます。

シート:RE

【実習 2.8.3d】適当なテキストでシート RE のさまざまな列の正規表

現検索の実験をし、気づいたことを書きなさい。

【実習 2.8.3e】】連立検索式をテキストボックスに書き込んで検索の

実験をしなさい。その後、シート RE の空いた列の 2 行目以下にテキ

ストボックスの内容をコピーアンドペーストをし、1 行目に適当な名

前をつけなさい。再度、この検索式をシート・列から選択して実験し

なさい。

(3) 単語リスト

ここでは正規表現ではなく一定の単語を対象にして検索・置換しま

す。指定したシートの列を使用します 29。「シート」のコンボボック

29

単語リストはテキストボックスに直接書き込むこともできます。単

語リストの要素の数が多いときは、外部ファイルからこのテキストボ

ックスにコピー・アンド・ペーストすべきです。

Page 81: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

81

スからシートを選択し、「列」のコンボボックスから該当する列を選

択します。参照した単語リストはテキストボックスに再生されます。

・シート:10_Voc

・列:A_c.1-2

次はシート Voc です。A 列のタイトルは c.1-2 です。

*注意 (1):正規表現で* # $ % ¥ | という記号がよく使われます。逆

に言えば、これらの記号が使われていれば、ほとんどの場合は単語リ

ストではなくて、正規表現だということになります。そこで、これら

をテキストボックスで使ったときは、自動的に「正規表現」のオプシ

ョンが選択されます。逆にこれらが使われていなければ、「単語リス

ト」のオプションが選択されます 30。その選択が正しくなければ、改

めて正しいオプションボタンを選択してください。

図:検索式:%t#

30

caelum などのように文字列のときに正規表現を使うと実行が早く

なりますが、このときは単語の一部として検索されます。#を使って、

たとえば#caelum#のように単語の境界を設定すれば、単語全体が検索

されます。でも、実際は caelum という設定だけで十分です。 a や ab

という単語を検索するときは、単語の一部として使われる可能性が高

いので注意しましょう。

Page 82: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

82

*注意 (2):テキストボックスで大文字を使うと、自動的に「大小文

字区別」にチェックが入ります。そのチェックが正しくないときは、

改めて手動でチェックを外してください。

図:シート:10_Voc

・列:A_c.1-2

シート:Voc

【実習 2.8.3f】適当なテキストを使って、「単語リスト」による検索

の実験をし、気づいたことを書きなさい。正規表現による方法と比較

しなさい。

2.8.4. 外置

検索式に一致するキーワードを独立した列に取り出して、元の文と

一緒に表示します。

Page 83: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

83

「外置」のイメージ

図:【鍵語】:「外置」

リンク出力

出力シートの一部を選択して「リンク」ボタンを押すと、入力シー

トの該当行にジャンプします。縦または横のおウィンドウを立ち上げ

ておくと、出力シートのウィンドウから入力シートのウィンドウにジ

ャンプします。

Page 84: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

84

シート名出力

これをチェックすると、A 列にシート名が加わります。

【実習 2.8.4a】出力は「文字列」の ABC 順または「出現順」に整列さ

せることができます。それぞれを試し、気づいたことを書きなさい。

【実習 2.8.4b】シート Gen を使い m で終わるすべての語を外置させ、

その結果を「整列」タブで逆引き配列をしなさい。気づいたことを書

きなさい。

出力付加段落数

出力する段落数を増やして、検証する文脈の範囲を拡げることがで

きます。次のコンボボックスの数字を変えて試してください。

Page 85: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

85

【実習 2.8.4c】適当なテキストを使い、さまざまな「外置」の実験を

して気づいたことを書きなさい。この出力の用途について考察しなさ

い。

2.8.5. 内置

「内置」ではキーワードを中心に置き、その前後の文脈を左右に配

置します。キーワードを中心の 1 列に置くことで、キーワードの配列

が追跡しやすくなります。また、その前後の文脈の特徴も目立ちます。

図:内置のイメージ

Page 86: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

86

図:【鍵語】:内置

ここで新しく「前語数」と「後語数」がアクティブになりました。

以下ではその機能を説明します。

前語数・後語数をゼロとする

上のように「前後数」、「後語数」をどちらもゼロ (0)と設定すると、

その実行結果は次のようになります。「前文脈」と「後文脈」の長さ

は「説明」タブの「最大列幅」に従います。

結果:

【実習 2.8.5d】シート c.1 を使い、「内置」によってすべての単語 (&)

を検索しなさい。「文字順」と「出現順」の結果を比較しなさい。そ

れぞれの用途について考察しなさい。

Page 87: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

87

前語数・後語数を 1 以上に設定する

図:前語数 1 のイメージ

次に「前語数」を 1、「後語数」を 2 にして実行すると、キーワー

ドの前の列に 1 語 (w-1)、キーワードの後の 2 列に 1 語 (w+1, w+2)を取

り出して出力します。

結果:

【実習 2.8.5e】前語 -1 (w-1)を「整列」の「逆引き」でソートし、その

結果を観察して気づいたことを書きなさい。

【実習 2.8.5f】「後語数」を含めて、さまざまな語数を設定して「内

置」を実行しなさい。その結果を観察して気づいたことを書きなさい。

【実習 2.8.5g】「検索」、「外置」、「内置」の働きを比較し、それ

ぞれの利用法について考察しなさい。

KWAC, KWOC, KWIC, ...

コンピュータを使って言語資料を分析するには次のようなさまざま

な方法があります。

検索のキーワードに注目すると、LETRAS の「検索」では対象のテキ

Page 88: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

88

スト内においてキーワードをマークすることで分析者に気づきの支援

を行います。テキストの中にマークされた部分を辿っていくと、そこ

に何らかの傾向や規則性が見つかることがあります。この方法を KWAC

(Key Word Alongside Context)と呼びます。

次に「外置」ではキーワードを1つの列にまとめ、その横にキーワ

ードを含むテキストを載せています。キーワードをソートすることに

よって一定のキーワードを集中させたり、キーワードを逆引きなどの

基準によって並べ替えたりすることができます。このようにテキスト

から独立させたキーワードが次の分析の対象になります。この方法を

KWOC (Key Word Out of Context)と呼びます。

LETRAS の「内置」ではキーワードを中心におき、その前後の文脈を

左右に並べています。これによってキーワードと前後の文脈の関係が

わかりやすくなります。この方法は KWIC (Key Word In Context)と呼

ばれ、シンタックスやコロケーションの研究にかかせません。

さて、そうすると「集計」はどのように読んだらよいでしょうか。

集計ではコンテキストを考えずにキーワードの頻度だけを問題にして

います。言ってみれば KWWC (Key Word Without Context)ということ

になるでしょう。

Page 89: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

89

「とは思わない」

次は私たちが編集したスペイン語・日本語辞典の用例の日本語の部

分「思いません」を「内置」で検索した結果です。

キーワードの前の位置を見ると、ほとんどが「とは」で終わって

いて、なぜか「と思いません」の例が見つかりませんでした。

次は夏目漱石『坊っちゃん』の全文を調べた結果です。「思う」の

前は「と」に限られ、「思わない」の前ではほとんどが「とは」が現

れています。このような分布は統計的な有意差を調べるまでもなく、

見ただけで単に偶然で起きるはずがないことがわかります。

引用部 「思う」 「思わない」

「と」 183 例 なし

「とは」 1 例 11 例

「と思わない」と言ってもちゃんと日本語として成り立つのに、実

際にほとんど使われない理由は、「思わない」というのが単に「思う」

の否定形というのではなくて、ちょうど「…なんて信じられない」と

いうような話者の何らかのコメント・評価を示しているからではない

かと思います。コメント・評価の対象が「…とは」で表示されている

のではないでしょうか。

スペイン語の「(私は)思う」creo の目的節には que+直説法が使わ

Page 90: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

90

れ、「思わない」no creo では接続法が使われます。そして学生の答案

や日本の文法書を見ると、そのほとんどが「…とは思いません」と訳

しています。スペイン語文法では「否定」という意味要素が接続法の

条件になる、と論じられることが多いのですが、no creo を単に動詞の

否定形とするよりも、やはり「信じられない」というコメント・評価

が関わっているのでしょう。この点で日本語とスペイン語の文法の間

には偶然ではない、人間の普遍的な認知に関わる意味の平行関係があ

るように思われます。

私たちは理論的に導かれた文法の規則を実際の言語使用にあてはめ

ることが多いのですが、実際の言語使用の分析が逆に理論的な文法の

問題を再考するきっかけになることがあります。帰納法と演繹法を両

立させることができればよいと思います 31。

2.8.6. 連続

「連続」では、キーワードと一緒に現れる語をその位置にそって集

計したり、集めたり、連続して扱ったりして、その関係を探ります。

検索した文字列を中心に前後の文脈を探ります。

単語を単位として、その前後の数語との連続関係を分析します。出

力の形式には「語形」、「集計」、「合同」、「結合」がありますが、

この中で「語形」だけが文の横のつながりを保持します。一方、「集

計」、「合同」、「結合」では、横のつながりを切って分析します。

31

上田博人 (2002) 「日本語の『は』とスペイン語の接続法」『日本語学』(明

治書院)vol.21, pp.13-24.

Page 91: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

91

【鍵語】:「連続」

語形

単語を単位としていることを除いて、「内置」とほぼ同じ機能を持

ちます。たとえば、上の設定で実行すると次のように出力されます。

結果:

*「整列」を「出現順」にすることもできます。

【実習 2.8.6a】シート Gen を使って、「連続」→「語形」で「整列」

の「文字順」と「出現順」を出力し、二つを比較しなさい。

【実習 2.8.6b】シート Gen を使って、「連続」→「語形」で「前語数」

Page 92: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

92

と「後語数」を変更して出力しなさい。

集計

上の「語形」の前語、キーワード、後語のそれぞれの列の単語をま

とめて集計します。まとめて集計しているので、もう横の関係は切れ

ています。キーワードのそばにある語の頻度を縦の列だけを区別して

調べたいときに役に立ちます。出力は「文字順」、「出現順」、「頻

度順」が選択できます。

図:連続:集計のイメージ

設定(1):

出力(1):

*「整列」を出現順や頻度順にすることもできます。

【実習 2.8.6c】シート Gen を使って、「連続」→「集計」で「整列」

の「文字順」、「出現順」、「頻度順」を出力し、比較して気づいた

ことを書きなさい。

Page 93: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

93

合同

前の数列、後の数列、両者をまとめてそれぞれを合計列に出力し、

その中の単語を合同して、その頻度を集計します。キーワードのそば

で連続する語の集合を見るときに使います。

図:連続:合同のイメージ

設定:

結果:

*「整列」を出現順や頻度順にすることもできます。

【実習 2.8.6d】適当なテキストを使って、「連続」→「合同」で「整

列」の「文字順」、「出現順」、「頻度順」を出力させ、気づいたこ

とを書きなさい。

Page 94: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

94

結合

前の数語、または後の数語の連続を切らずに、その連続の頻度を集

計します。キーワードに隣接するまとまった語数の特徴を調べること

ができます。

連続:連続のイメージ

設定:

結果:

*「整列」を出現順や頻度順にすることもできます。

【実習 2.8.6e】適当なテキストを使って、「連続」→「連続」で「整

列」の「文字順」、「出現順」、「頻度順」を出力させ、気づいたこ

とを書きなさい。

【実習 2.8.6f】「語形」、「集計」、「合同」、「連続」の出力結果

を比較し、気づいたことを書きなさい。

Page 95: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

95

後期ラテン語から初期スペイン語を想像する

大学で習うラテン語はカエサルやキケロなどの紀元前後に書か

れた文章を対象とする古典ラテン語です。一方、ここでテキスト例

として見ている『創世記』のラテン語は紀元 5 世紀の「後期ラテン

語」Late Latin とよばれるものです。

ラテン語は名詞が格変化し、それによって主語や目的語の関係が

わかるので、とくに動詞の目的語の位置が定まっているわけではあ

りませんが、ふつうは動詞の前におきます。そして動詞の典型的な

位置は文末です。一方、現代スペイン語などラテン語から派生した

言語では目的語は動詞の後におくのがふつうです。

さて、次は名詞の対格の例として aquam, arcam, terram を選び、そ

の直前の語を頻度順に並べたときの出力です。

Page 96: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.8 鍵語

96

ここで興味深いのは、『創世記』ラテン語の対格(目的語)の位

置が、まるで現代スペイン語のように、ほとんど例外なく動詞の直

後になっていることです。このように当時の話し言葉が反映してい

ると思われる後期ラテン語の様子から文献によって記録されてい

ない原始スペイン語 Proto-Spanish のシンタックスを想像すること

Page 97: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.9 共起

97

ができます。

2.9. 共起

「共起」には、「連語頻度数」と「二要素分析」のオプションがあ

ります。

2.9.1. 連語頻度数

連続する語の頻度をすべて計算します。

たとえば次のデータで、

Page 98: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.9 共起

98

「語数」を 2 として実行すると、次のような 2 語連続のデータの頻度

が計算されます。

in principio, principio creavit, creavit deus, deus caelum, caelum et, et

terrm

シート Gen で実行してみましょう。

【実習 2.9.1】頻度数を示す B 列を降順でソートし、気づいたことを書

きなさい。

2.9.2. 二要素分析

正規表現で指定する 2 つの要素の結合度を探ります。語形変化が多い

ラテン語などでは正規表現を工夫することで、さまざまな語の組み合

わせを実現できます。語形変化が比較的尐ない英語でも、たとえば

#ha(ve|s|d|ving)#によって要素の 1 つに have を指定することができます。

結合度を示すさまざまな係数を同時に出力します。

Page 99: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.9 共起

99

隣接

データとして Gen を使います。deus と dominus のおおよその共起関

係を調べるときには、第 1 要素として#de(us|i |um)#を指定し、第 2 要

素として#domin(us|i |um)#を指定します 32。

結果は次のようになります。

結果:

32

deus dominus, dei domini のように、正確に格の一致を含めたコロケ

ーションを調べるときは、第 1 要素を deus, 第 2 要素を dominus のよ

うに個別に指定しなければなりません。

Page 100: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.9 共起

100

「度数 (1)」は第 1 要素の総頻度を示し、「度数 (2)」は第 2 要素の総

頻度を示します。「共起度数」は 2 語が連続して現れた語数です。こ

の場合、「順番区別」をチェックしていないので、第 2 要素+第 1 要

素という順番のデータも数えます。「全語数」はデータ内の総語数で

す。

以下に、2 つの要素の結合度を示すさまざまな係数を挙げます。

相互情報量:共起度数をデータ全体で理論的に期待できる共起度数

(期待値)で割った値の対数(底を 2 とする)です。

相互情報量 = log2

(2) (1)( ・度数度数

共起度数・全語数

ダイス係数:共起度数を度数 (1)と度数 (2)の平均で割った値です。

ダイス係数 = )/2 (2) (1)( 度数度数

共起度数

0.0 ≦ j. ≦1.0

以下では、次の 4 つの数値を使います。

X / Y 第 2 要素 (+) 第 2 要素 (-) 和

第 1 要素 (+) a (+, +) b (+, -) a + b

第 1 要素 (-) c (-, +) d (-, -) c + d

和 a + c b + d a + b + c + d

ファイ係数:積率相関係数を質的データにあてはめた係数です。

ファイ係数 = ad - bc

(a + b)(a + c)(b + d)(c + d) -1.0 ≦ phi ≦1.0

コサイン係数:データ系列 X, Y のそれぞれの値を、X = (x1, x2, ... xn),

Y = (y1, y2, ... yn)とすると 33

33 これは、ベクトルの内積 (xy)を使って表せば、次のように 2 つのベ

クトルの角のコサインとなります。

cosθ = xy

|x | |y |

それぞれのベクトルの成分を示すと、

Page 101: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.9 共起

101

コサイン係数 = Σx iyi

Σx i2 Σyi

2

これを (1-0)データにあてはめて a, b, c を使って表すと、次のよう

になります。

コサイン係数 (1-0)34

= a

(a + b)(a + c)

単純一致係数は、対象 X と対象 Y に共通して「+」がある回数 (a)と

それが共に存在しない回数 (d)の和を全体の数で割ります。とてもわか

りやすい計算です。 a = d = 0 のとき最小値 (0.0)になり、b = c = 0 のと

き最大値 (1.0)になります。

cosθ = x1y1+x2y2...+xnyn

x1+ x2...+xn y1+y2...+yn

= Σx iyi

Σx i Σ yi

ここから、この係数を「コサイン係数」と呼びます。数学 B で扱う

平面 (2 次元 )や空間 (3 次元 )ではなく、ここではさらに一般化して n 次

元のデータを扱います。

34 コサイン係数は (1-0)データ(質的データ)だけでなく、一般に量的

なデータにも適用できます。ここでは、一般のコサイン係数と区別す

るために、「コサイン係数 (1-0)」と呼ぶことにします。

コサイン係数 (1-0)はファイ係数の中の d を無限大だと仮定すると、

そこから導出できます。d を無限大にするのは、共起しないケースの

数は理論的に無限にある、と想定するためです。

phi '= lim d → ∞ ad - bc

(a + b)(c + d)(a + c)(b + d)

分母と分子を d で割ります。

= lim d → ∞ a - bc/d

(a + b)(a + c)(b/d + 1)(c/d + 1)

それぞれの分母になる d を無限大にすると、分子に何があってもゼ

ロとなりますから、

コサイン係数 (1-0) = a

(a + b)(a + c)

Page 102: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.9 共起

102

単純一致係数 (sm) = a + d

a + b + c + d 0.0 ≦ sm ≦1.0

Russel and Rao 係数は分子の d を考慮しません。対象 X, Y でともに

「+」である回数だけをカウントします。分母は単純一致係数と同じ

です。 a = 0 のとき最小値 (0.0)になり、b = c = d = 0 のとき最大値 (1.0)

になります。

Russel and Rao 係数 (rr) = a

a + b + c + d 0.0 ≦ rr ≦1.0

Jaccard 係数は分子にも分母にも d を使いません。 a = 0 のとき最小

値 (0.0)になり、b = c = 0 のとき最大値 (1.0)になります。

Jaccard 係数 (j) = a

a + b + c 0.0 ≦ j. ≦1.0

Yule 係数は ad と bc の差を問題にします。(1)の単純一致係数では a

と d を足していますが、ここでは掛けることになります。それから分

子は ad と bc の差なので、それがマイナスになることもあります。ad =

0 のとき最小値 (-1.0)になり、bc = 0 のとき最大値 (1.0)になります。ad =

bc のときは最小値と最大値の中間 (0.0)になります。

Yule 係数 (y) = ad - bc

ad + bc -1.0 ≦ y. ≦1.0

Hamann 係数では、 a + d と b + c の差を問題にします。Yule 係数で

は a と d, b と c の関係を積で示しますが、Hamann 係数ではそれを和

で示しています。 a = d = 0 のとき最小値 (-1.0)になり、b = c = 0 のとき

最大値 (1.0)になります。 a + d = b + c のときは最小値と最大値の中間

(0.0)になります。

Hamann 係数 (h) = (a + d) - (b + c)

(a + d) + (b + c) -1.0 ≦ h. ≦1.0

Simpson 係数は、分子に a、分母に (a+b)と (a+c)を比較して、小さい

方の値をとります。

Simpson 係数 (s) = a

min(a + b, a + c) 0 ≦ s ≦1.0

【実習 2.9.2a】それぞれの係数の特徴を比較し、上の出力を考察しな

Page 103: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.9 共起

103

さい。

文・段落・間隔語数

「共起」の「選択」には、「隣接」の他に、「文」、「段落」、「間

隔語数」があります。「文」を指定すると、文を単位にして、その中

で第 1 要素と第 2 要素の共起回数が計算されます。 2 つの要素は同じ

文中である、という条件を満たしているかぎり、どれだけ間隔が空い

てもかまいません。同様にして、「段落」では、段落を単位とした場

合の共起回数を計算します。

「文」と「段落」

上の 2 つの図を比較すると、「文」よりも「段落」の方が「共起語

数」が多いことがわかります。

「間隔語数」では、2 つの要素の間に他の語が介在する場合を考え

ます。たとえばそれを 5 と指定すると、0 語~5 語までの介在を許しま

す。次の図が示すように、間隔語数を増やすと、共起回数が増加する

可能性が高くなります。

Page 104: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.9 共起

104

「間隔語数」2 と 5

【実習 2.9.2b】「文」と「段落」、「間隔語数」5 と 15 の出力を比較

し、共起回数の変化がそれぞれの係数にどのように影響しているかを

考察しなさい。

順番を区別

ラテン語は語順が比較的自由な言語です。「順番区別」のチェック

の有無による出力を比較しましょう。

「順番区別」のチェック「なし」と「あり」 35

35

その他は初期設定。

Page 105: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.10 代表

105

【実習 2.9.2c】上の 2 つの出力を比較し、気づいたことを書きなさい。

2.10. 代表

「代表」では、テクスト中のさまざまな変化形態を1つの代表形に

まとめる方法を扱います。たとえば、動詞の活用形や名詞・形容詞の

変化形を辞書などに載っている代表形に統合します。このような代表

形は「レンマ」 lemma と呼ばれ、このようなプロセスを「レンマ化」

lemmatization と呼ばれます。

この作業は、変化形と代表形を組み合わせたリストを、「置換」(単

語リスト)に適用すれば可能です。しかし、実際には、このようなリ

ストは膨大になり、たとえばラテン語などのように変化形が多い言語

では、実用的ではありません。ここでは、語形の1対1対応のリスト

Page 106: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.10 代表

106

ではなく、品詞などのカテゴリーを考慮に入れた方法を考えます。

レンマ化の作業で問題になるのが、「同形異義語」homograph の取

り扱いです。たとえば、ラテン語の amor は動詞の形態(受動態直説

法現在 1Sg:「私は愛される」)でもあり、また名詞の形態(男性名

詞:「愛」)でもあります。そこで、参照シートの中でこれらを amor_Vt

と amor_Sm 品詞によって区別します 36。この区別によって、動詞 (Vt)

と名詞 (Sm)のさまざまな形態の中から一番に近いものを探索し、その

代表形を見つけます。次は参照シートの例です。

シート :D

「語形」の列に、代表形に対応する様々な形態を載せます。 abyss-

などの語尾のハイフン (-)は変化形の共通部分を示します。プログラム

LETRAS が名詞形だけの検出で終わらないように、動詞 amo には amor

という同形異義語を載せておきます 37。

2.10.1. 語形リスト

はじめに、次のテキストを使って、語形のリストを作りましょう 38。

36

ここでは Vt は他動詞を意味し、Sm は男性名詞を意味します。 37

これは、 amor は動詞かもしれない、という情報を示しています。

LETRAS は出現語の右端から検索を開始して最大一致点で検索をやめ

てしまいます。 amor は am-の中に含まれるのですが、 am-だけを指定

すると、 amor とマッチした時点で検索を終了し、さらに必要な amo

の受動態を検出しません。 38

「鍵語」の「集計」、検索式:&によって作成できます。

Page 107: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.10 代表

107

シート:T

このリストに品詞をつけるには、参照シートを選択し、「対象」を

「語形リスト」、「出力」を「品詞」とします。

結果:

ここでは参照シートは a の語形だけを載せてあるので、dei と erant

は空白で出力されます。空白以外の文字を出力させるには、「マッチ

しないときの表示記号」を指定してください。

【実習 2.10.1】英語の動詞の活用形を示す参照シートを作り、サンプ

ルテクストで「語形リスト」の実験をしなさい。

Page 108: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.10 代表

108

2.10.2. 語形_品詞リスト

「出現形に付加」をチェックすると、次のように品詞を付加した形

で出力されます。

結果:

次に B 列 (LEMA)を選択し、「対象」を「語形 _品詞リスト」、「出

力」を「代表形」とします。

結果:

【実習 2.10.2】英語のサンプルテクストで、「語形_品詞リスト」の実

験をしなさい。

2.10.3. テクスト

「語形リスト」と同じことを、次のような「テクスト」について行

います。

対象:

「対象」と「テクスト」とし、「出力」を「品詞」、「出現形に付

加」をチェックします。

Page 109: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.10 代表

109

結果:

【実習 2.10.3】英語のサンプルテクストで、「テクスト」の実験をし

なさい。

2.10.4. テクスト_品詞

次に、上のテクストに代表形を付加させるには、「対象」を「テク

スト_品詞」、「出力」を「代表形」とし、「出現形に付加」をチェッ

クします。

結果:

【実習 2.10】英語のサンプルテクストで、「テクスト_品詞」の実験

をしなさい。

非曖昧化

レンマ化の作業をしていると、 1 つの語形が複数の品詞やレンマ

に対応するケースに出会います。たとえば、ラテン語の amor は動

詞の活用形態でもあるし、名詞の主格形でもあります。そのような

とき、「代表」の操作では、 amor_Vt_Sm のように複数の品詞を出

力します。 この後、「鍵語」の「内置」などの機能を使って文脈

を探って解釈し、手作業でどちらかの品詞を外します。

このような手作業ではなく、一定の規則が見つかれば機械的な処

理をすることも可能です。スペイン語では、 los, la, las などは定冠

詞としても、または目的語の代名詞としても使われます。そこで、

los_T_X, la_T_X, las_T_X のように指定されます。そのデータを「置

換」で次の置換式を使って、変換します。

(los|la |las)_T_X(@&_V)=>$1_X$2

Page 110: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.10 代表

110

(los|la |las)_T_X(@&_S)=>$1_T$2

上の式は動詞の前では代名詞 (X)を選択するという規則、下の式

は名詞の前では定冠詞を選択するという規則を正規表現で示した

ものです。このような作業を「非曖昧化」disambiguation と呼びま

す。いろいろな規則を設定し、実験しながらテクストを非曖昧化し

ていきます。

出現形と代表形、トークンとタイプ

次の表は、スペインのカタルニア語の方言形(バレアレス方言)

のテクストに現れた動詞の出現形と代表形の頻度を示します。出現

形は、その全出現を数えた値(トークン)と、同じ形式をタイプと

してまとめた値を計算します。

トークン タイプ 代表形

全数 19.703 2.625 822

最大頻度 2.277 2.277 3.512

この表が示すように、全出現形(延べ語数)は、それをタイプに

すると(異なり語数)がかなり減尐し、代表形にまとめるとさらに

減尐します。19,703 語のデータについて、ひとつひとつの代表形を

指定するよりも、2,625 個のデータで同じ作業をするほうが効率的

です。さらに、代表形と品詞のリストを作成するならば、その数は

822 に縮小します。

次のグラフは、頻度順に並べたトークンと代表形が、累積してテ

クスト全体をカバーする率がどのくらいに上昇するかを示してい

ます。

Page 111: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

111

この図を見ると、出現形に比べて代表形(レマ)が上昇するカー

ブが顕著であり、全体的に尐ない語数でテクスト全体をカバーして

いることがわかります。

2.11. 簡単なプログラミング

「分析」の「外置」を例にして簡単なプログラミングの実習をしま

す。はじめは簡単な例題による練習をして、尐しずつレベルを上げて

いきます。【実習】はかならず自分で挑戦してから解答を見てくださ

い。いろいろな解法があるので正解は1つではありません。自分の解

法と解答を比べてみましょう。

2.11.1. コード

さっそくコードウィンドウに簡単なコードを書いてその出力を確か

めてみましょう。簡単な出力の実験です。ABC という文字をセル D3 に出

力させます。

Sub zikken12() ‘簡単な出力の実験

Cells(3, 4) = “ABC” ‘ABC という文字をセル D3 に出力

End Sub

このコードは、

Voces

Lemas

Page 112: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

112

Sub [プログラム名 ]

[statements]

End Sub

という構造になっています 39。このようにプログラムの本体を Sub と

End Sub で囲みます。Sub の後にプログラム名を書きます 40。この枠内

にある [statements]がプログラムの本体です。Cells(3, 4)は「座標 (3, 4)

のセル」、つまり第 3 行第 4 列のセルを示します 41。Excel シートでは

D3(D 列 3 行)にあたります。D3 のように列 (D)・行 (3)のように示す

方法と、Cells(3,4)のように行 (3)・列 (4)で示す方法があります。両者

は行と列の順番が異なるので注意が必要です。プログラムでは一般に

Cells(3, 4)のような指定の仕方をしたほうが操作がしやすいので、この

方法をとります。

次の「=“ABC”」は、ABC という文字をイコール (=)の左の項(ここ

では Cells(3,4))に入れることを意味します。一般にプログラム内の

「a=b」は a に b の値を「代入」することを意味します。

結果

現在選択されているシートを見ると次が出力されています。

【課題 2.11.1a】次のコードを実行するとどのような結果になるか予想

しなさい。その実行結果を確かめさない。

Sub zikken12x() ‘簡単な出力の実験

Cells(1, 1) = “Sheet”

39

Sub [プログラム名 ]を入力すると自動的に End Sub がつきます。 40

コードウィンドウの中にプログラム名が同じコードを書くことは

できません。 zikken12, zikken12x, ...などのように名前の一部を付加し

たり、変更してあれば大丈夫です。プログラム名の終わりにかっこ ()

をつけていますが、このことは後で説明します。プログラム名は、た

とえば A1, B5 などのセル名と重なるものと使うと実行時のトラブル

の原因となります。 41

「行」はシートの最上段から下に向かって数えていきます。「列」

はシートの最左端から右に向かって数えていきます。

Page 113: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

113

Cells(1, 2) = “Row”

End Sub

【課題 2.11.1b】ABC という文字を B2 のセルに出力し、DEF という文

字を B3 のセルに出力するコードを書きなさい。

2.11.2. ヘルプ

コードは英語を使っていますが、その技術的な意味については、VBE

のヘルプが役に立ちます。

*「ヘルプ」→「Microsoft Visual Basic ヘルプ (H) F1」

*たとえば、 Input で検索すると次の画面が現れます 42。

それぞれの技術的な説明は最初はわかりにくいかも知れませんが、

尐しずつ慣れていくはずです。巻末の参考書も役に立ちます。インタ

ーネットでも多くのサイトから有用な情報が送られていますから、検

42

ショートカットは、コードの中の Input にカーソルを置き F1 を押し

ます。

Page 114: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

114

索してください。

2.11.3. 変数・関数・制御

ここではプログラムに必要な基本的な要素として、変数と関数と制

御を扱います。変数には定数や変数の内容を代入することができます。

関数によって、一定の値を変数に返すことができます。制御はプログ

ラムの流れを決めます。これらの要素を使うことによってプログラム

は多くの機能を果たします。

変数

数値データの変数

はじめに数値の変数を扱います。ここでは数値のうち整数を扱いま

す。整数には次の 2 種類のデータ型があります。

整数型( Integer): -32,768 ~ 32,767

長整数型(Long): -2,147,483,648 ~ 2,147,483,647

これらのデータ型は、扱う数値の大きさによって使い分けます。正

確な数値の範囲を覚えておく必要はありませんが、数値が 32000 以下

である予想できるときは整数型を使い、それを超えるときは長整数型

を使うとよいでしょう。データ型はプログラムの最初の宣言文で示し

ます。変数の宣言文は Dim で始め、As の後にデータ型を示します。

次のようにコードの先頭に Option Explicit をつけると、かならず変数

のデータ型を宣言しなければなりません。

コード

Sub zikken21a() '足し算

Dim intA As Integer '整数型

Dim intB As Integer '整数型

intA = 1 'intA に 1 を代入

intB = 2 'intB に 2 を代入

Cells(3, 4) = intA + intB '足し算の結果をセル D3 に出力

End Sub

Page 115: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

115

結果

演算子

上のコードの intA + intB で使った「+」は足すことを示す演算子で

す。演算子には次の記号が使われます。

足し算:例 intA + intB

引き算:例 intA - intB

掛け算:例 intA * intB

割り算:例 intA / intB

【課題 2.11.3a】上のコードに演算子を使った文を書き足して、次の結

果を出すコードを書きなさい。

(割り算の結果が代入されるのは宣言文にある変数ではなく、 Cells

なので整数でなくてもかまいません。)

文字データの変数

文字(列)も変数に代入することができます。文字なのに「変数」

というのは尐しわかりにくいかも知れませんが、「変数」が variable

であることを理解すればよいでしょう。つまり、変数にさまざまな値

として文字が代入されるのです。

文字データの変数には次のデータ型を使います。

可変長文字列型 (String):0 バイトから 2 ギガバイトまでの範囲

型宣言文字

変数の後に次の文字を加えることによって、データ型を宣言するこ

とができます。次のデータ型には型宣言文字があります。

%: 整数型 (Integer)

&: 長整数型 (Long)

!: 単精度浮動小数点型 (Single)

Page 116: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

116

#: 倍精度浮動小数点型 (Double)

$: 文字型 (String)

型宣言文字を宣言文や他の代入文などで最初で指定しておけば、以

降は必要ではありません。ここでは、繰り返しの For...Next などでは、

簡略化して、宣言文だけで示すことにします。他はデータ型を意識す

るために、かならず書くようにします。

コード

Sub zikken21b() '文字データ

A$ = "太郎は " 'A$に代入

B$ = "学生です。 " 'B$に代入

Cells(2, 3) = A$ & B$ '連結させて出力

End Sub

文字列を連結させるには、アンド (&)の記号を使います。

結果

【課題 2.11.3b】上のコードを書き換えて、次の結果を出すコードを書

きなさい。

関数

数学で使う「関数」は数字データを扱い、たとえば、f(x) = 2x + 1 の

ように書きます。このような関数の中で使われる変数 x を「引数」(ひ

きすう)といいます。そして関数は引数に従って一定の値を示すこと

を「返す」、という表現を使います。たとえばここで f(x)の引数 x が 1

のときは関数 f(x)は 3 を返し , x が 2 ならば関数 f(x)は 5 を返します。

引数が 2 つ以上のときもあります。たとえば、関数 f(x, y) = 2x + y

の場合、x=1, y = 2 のとき f(x, y)は 4 を返します。このような関数の考

え方はプログラミングでも使われます。上のような数学の関数は f(x) =

2x + 1 のように自分で定義しますが、プログラミングで使う関数は多

くの場合、すでに用意されているものを使います。

Page 117: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

117

ここでは文字データを扱う次のような文字列操作関数を扱います。

Len(strA):文字列 strA の文字数を返す

Left(strA, intB):文字列 strA の左から intB 文字分を返す

Right(strA, intB):文字列 strA の左から intB 文字分を返す

Mid(strA, intB, intC):文字列 strA の左から数えて intB 文字の位

置から intC 文字分を返す

たとえば Left(“abcdefghi”, 3) は “abcdefghi”という文字列の左から 3

文字分である “abc” を返します。また、Mid(“abcdefghi”, 3, 2)は”cd”

を返します。

コード

Sub zikken22a() '関数 Left

A$ = "In principio creavit Deus caelum et terram." 'A$に文字列を代入

Cells(1, 1) = A$ '文字列全体を出力

Cells(2, 1) = Len(A$) '文字列の長さを出力

Cells(3, 1) = Left(A$, 7) '左の 7 文字分を出力

End Sub

Left 関数で切り出した文字数は空白も含めます。

結果

【課題 2.11.3b】次のコードを読み、結果を予想しなさい。その後で、

実行して確かめなさい。

Sub zikken22x() '関数 Left

A$ = "In principio creavit Deus caelum et terram." 'A$に文字列を代入

Cells(1, 1) = A$ '文字列全体を出力

Cells(2, 1) = Len(A$) '文字列の長さを出力

Cells(3, 1) = Left(A$, 7) '左の 7 文字分を出力

Cells(3, 1) = Right(A$, 5)

Page 118: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

118

Cells(4, 1) = Mid(A$, 4, 3)

End Sub

制御

プログラムの流れを条件判断や繰り返しの指定によって制御しま

す。

条件判断

プログラムは基本的に上から下に向かって処理を進めますが、次の

ように途中で条件によって流れを分けることがあります。

上の図で (3)の部分の条件によってプログラムの流れは (4)、または

(5)に分岐します。以下のコード内の If はこのような条件判断に使われ

ます。

コード

Sub zikken23a() '文字列の長さの判断

A$ = "principio" 'strA に文字列を代入

Cells(1, 1) = A$ '文字列全体を出力

If Len(A$) <= 8 Then

Cells(2, 1) = "比較的短い単語です。 " '文字列の長さの判断を出力

(1)

(4) (5)

(6)

(2)

(3)

Page 119: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

119

Else

Cells(2, 1) = "比較的長い単語です。 " '文字列の長さの判断を出力

End If

End Sub

結果

繰り返し

プログラムの流れの中で同じ処理を何度でも繰り返すことが必要な

ときは、次の For i = a To b... Next という制御文を使います。For と Next

で囲まれた処理を、 i の値が a から 1 つずつ増えて b の値になるまで

繰り返します。

コード

Sub zikken23b() '逆順

Dim A$, S$, i& ‘宣言

A$ = "TERRAM" 'A$に文字列を代入

For i = 1 To Len(A$) ‘A$の文字数まで繰り返す

S$ = Mid(A$, i, 1) & S$ ‘ i 番目の 1 文字を前に連結

Next

Cells(1, 1) = A$ '文字列全体を出力

Cells(2, 1) = S$ '逆順を出力

End Sub

上のコードの例では Mid で切り出した文字 (1 文字 )を strS に前から

連結させていきます。ここでは strA に “TERRAM”が代入されています

から、Len(strA)は 6 です。

i の増加に従って Mid(strA, i, 1)と strS がどのように変化するのかを次

に示します。

i Mid(strA, i, 1) strS

1 T T

Page 120: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

120

2 E ET

3 R RET

4 R RRET

5 A ARRET

6 M MARRET

結果

【課題 2.11.3b】上のコードを書き換えて、次の結果を出すコードを書

きなさい。

2.11.4. マクロの記録

コードは「マクロの記録」によって知ることができます。

ワークシートの挿入

はじめに、シートの挿入という簡単な操作を例に「マクロの記録」

を実行します。

(1) 「開発」→「コード」→「マクロの記録」をクリック

(2) Shift+F11 を押すと、現在のシートの左にシートが証入されます。

Page 121: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

121

(3) 「開発」→「コード」→「記録終了」のボタンを押してください。

このボタンは「マクロの記録」と同じ位置にあります。

さて、この後でマクロの VBE のコード画面を見ると次のような一連

のコードが自動的に書き込まれています。[Alt]+F11 によってコードが

見られます。これは、ユーザーが行った操作のコードを記録したもの

です。

コード

Sub Macro1()

'

' Macro1 Macro

'

'

Sheets.Add

End Sub

このコードの最初にある Macro1 の数字 1 は、以前に作成されたマ

クロの数によって変化します。次に続く 3 行と、その後 1 行置いて 1

行は、シングルコーテーション (‟)ではじまるコメント文です。この部

分はプログラムの実行にかかわりません。以下では省略します。ここ

では Sheets.Add に注目しましょう。これは、Sheets を対象にして、そ

れを追加 (Add)するという意味です。

次に、上の (2)の段階で、シートのタブの最後にある「ワークシート

の挿入」タブを押してみましょう。

Page 122: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

122

これを記録すると以下のコードになります。

コード

Sub Macro6()

Sheets.Add After:=Sheets(Sheets.Count)

End Sub

ここでは、Sheets.Add に続く After:=でワークシートを追加する位置

を決めます。この場合は Sheets(Sheets.Count)の後ということですが、

こ れ は 現 在 扱 っ て い る ワ ー ク ブ ッ ク の 中 に あ る シ ー ト 数 を

Sheets.Count で数え、そこで返された数、たとえば 14 を引数として

Sheets(引数 )にあてまめます。そうすると、シートがシート番号 14 番

の後に追加されるのです。

ここで使われている Add は、その前にある Sheets を加え (Add)、Count

はそれを数えています。この Add や Count のように、その前にある要

素に一定の操作をする機能があるものを「メソッド」と呼びます。

【課題 2.11.4a】次のコードを実行し、結果を確かめなさい。この結果

からコードの意味を解釈しなさい。

Sub Macro6()

Sheets.Add Before:=Sheets(1)

End Sub

【課題 2.11.4b】次のコードを実行し、結果を確かめなさい。この結果

からコードの意味を解釈しなさい。

Sub Macro6()

Sheets.Add Count:=3

End Sub

【課題 2.11.4c】マクロの記録によってシートのコピーのコードを探し

なさい。現シートのコードは ActiveSheet

ウィンドウ

ウィンドウを開く操作のコードを探しましょう。

(1)「開発」→「コード」→「マクロの記録」をクリック

(2)「表示」→「ウィンドウ」→「新しいウィンドウを開く」

Page 123: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

123

結果:同じワークブックが 2 つのウィンドウに表示されます 43。

(3)「表示」→「ウィンドウ」→「整列」→「左右に並べて表示」

(4) 「開発」→「コード」→「記録終了」

コード

Sub Macro7()

ActiveWindow.NewWindow

Windows.Arrange ArrangeStyle:=xlVertical

End Sub

最初のコメント文は省略しました。ここでは「新しいウィンドウを

開く」と「左右に並べて表示」という 2 つの操作をしました。それぞ

れが 1 行ずつ、全体で 2 行のコードになっています。NewWindow と

43

一方を閉じ、残ったウィンドウを最大化すれば、元の状態に戻りま

す。

Page 124: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

124

Arrange というメソッドに注目しましょう

【課題 2.11.4】「ウィンドウの整列」で「上下に並べて表示」を選択

し、そのコードを確かめ、全体を解釈しなさい。

並べ替え

次に、並べ替えの操作をします。並べ替えの操作は、「データ」→

「並べ替えとフィルタ」で「昇順」を選びます。

これまでと同じ方法で、並べ替えのコードを調べましょう。シート

は Voc を使い、D1 のセルを選択します。

Page 125: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

125

結果

コード 44

ActiveWorkbook.Worksheets("Voc").Sort.SortFields.Clear

ActiveWorkbook.Worksheets("Voc").Sort.SortFields.Add

Key:=Range("D1"), _

SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _

xlSortTextAsNumbers

With ActiveWorkbook.Worksheets("Voc").Sort

.SetRange Range("A1:G399")

.Header = xlYes

.MatchCase = False

.Orientation = xlTopToBottom

.SortMethod = xlPinYin

.Apply

End With

全体のプログラムは、

ActiveWorkbook.Worksheets("Voc").Sort.SortFields.Clear

から始まります。このうち

44

Excel2007 のコードです。Excel2003 では異なるコードが記録されま

す。この場合の Excel2007 のコードを Excel2003 で使うことはできま

せん。Excel2003 では、次のヘルプで示されるコード形式、または Sub

sort01()のコードを使ってください。

Page 126: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

126

ActiveWorkbook.Worksheets("Voc")

は現在のブックの Voc というシートを指しています。その後にある

Sort が重要です。この Sort という言葉について VBE のヘルプを見る

と、次の情報が得られます 45。

式 .Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header,

OrderCustom, MatchCase, Orientation, SortMethod, DataOption1,

DataOption2, DataOption3)

これは、Range を対象にして、(Key1, ...)という条件で Sort をすると

いう意味です。上の式では (...)の順番が限定されていますが、先に見

たマクロの記録によるコードを見ると Key:=というような書き方もあ

ることがわかります。Key はソートの「キー」を指しますが、他にこ

こで重要な条件は、ヘッダーの有無、大小文字の区別、そしてオーダ

ー(昇順 xlAscending・降順 xlDescending)です。

キーの位置は先のマクロの記録では Range("D1")というレンジで示

さ れ てい ま す。 こ こで は列 を指 定 して 並 べ替 え るの で、 これ を

Columns(4)と書くこともできます。ヘッダーがなければ Header の指定

は必要ありません。オーダーは昇順ならば指定する必要はありません。

向きも必要に応じて Orientation(ソートの向き:上下=xlTopToBottom,

左右:xlLeftToRight)も使います。上下ならば指定する必要はありま

せん。

上のコードを書き換えて、次のようなコードにまとめることができ

ます。

Sub sort01()

ActiveSheet.UsedRange.Sort Header:=xlYes, MatchCase:=False, _

Key1:=Columns(2), Order1:=xlDescending, _

Key2:=Columns(1), Order2:=xlAscending, _

Orientation:=xlTopToBottom

'ソート(ヘッダー:有、大小文字区別:無、キー 1,2:カラム、昇

順、向き:上下)

End Sub

ここでは第 1 キーを B 列、第 2 キーを A 列にしてありますから、「代 45

Sort という語の一部にカーソルを置いて、 [F1]キーを押すとヘルプ

画面が立ち上がります。その中の「Range.Sort メソッド」をクリック

してください。

Page 127: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

127

表形」を第 1 キーとし、それが同じときは「C.1-2」を第 2 キーとして

並べ替えます。

【課題 2.11.4a】上のコードの条件(ヘッダー、大小文字、キー、オー

ダー、向き)を変えて実験し、気づいたことを書きなさい。

【課題 2.11.4b】次の「並べ替え」のボタンを押して、並べ替えの条件

を変えてマクロを記録しなさい。上のコードとの違いに注意して気づ

いたことを書きなさい。

2.11.5. 行と列・セル・レンジ

行と列の操作

ワークシートにあるデータの行数や列数を数えるプログラムを作り

ます。それをメッセージボックスに出力します。メッセージボックス

の OK ボタンを押すまでは、他の操作ができません。

コード:

Sub p341a() '使用している行数

MsgBox "行数は " & ActiveSheet.UsedRange.Rows.Count

End Sub

Page 128: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

128

結果

【課題 2.11.5a】列の数をメッセージボックスに出力するコードを書き、

実験しなさい。「列」は Columns を使います。

シートから実行

これまでは VBE からプログラムを実行していましたが、次にシート

から実行してみましょう。 [Alt]+F5 でマクロのフォームを出し、マク

ロ名を選択し「実行」ボタンを押します。マクロ名を直接ダブルクリ

ックしてもよいでしょう。

*シートから [Alt]+F5→該当するマクロ名を選んで実行

【課題 2.11.5b】VBE から実行する方法とシートから実行する方法を比

較して気づいたことを書きなさい。

Page 129: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

129

セルの操作

セルは、行と列で決定されます。たとえば C2 は、第 2 行、第 3 列

にあるセルを指します。私たちは先に特定のセルに文字列を出力する

方法を見ました(→3.1.2)。ここでは、For ... Next を使って、複数の

セルに出力する方法を扱います。

データ:c.1

コード:

Sub p_341a() '使用している行数

Dim SheetName$, RowCnt& 'シート名、使用行数 46

SheetName$ = ActiveSheet.Name 'シート名

ActiveSheet.Copy After:=Sheets(Sheets.Count) '新シートにコピー

RowCnt& = ActiveSheet.UsedRange.Rows.Count '使用行数

Columns(1).Insert '1 列挿入

Cells(1, 1) = "Sheet" 'タイトル

For i = 2 To RowCnt& '行数まで繰り返す

Cells(i, 1) = SheetName$ 'シート名を出力

Next

End Sub

46

このように型宣言文字のある変数を宣言しておくと、長い変数名を

書くとき、小文字で書いて、改行したときに大文字に自動的に変換さ

れるので、綴りのミスを確認できます。たとえば、shetname$と書いて

も大文字になりませんが、sheetname$は改行すると SheetName$に変換

されます。

Page 130: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

130

結果:

SheetName$ = ActiveSheet.Name によって、現在のシート名を strSheet

に代入しておきます。

ActiveSheet.Copy After:=Sheets(Sheets.Count)では、現在のシートをコ

ピーし、現在存在するすべてのシートの後に、つまり一番右の位置に

ペーストします。

RowCnt& = ActiveSheet.UsedRange.Rows.Count によって現在のシー

ト で 使 用 し て い る 領 域 の 行 数 を lngRow に 代 入 し ま す 。 (1)

Columns(1).Insert は第 1 列、つまり A 列の前に 1 行挿入するという意

味です。(2) Cells(1, 1) = "Sheet"では、A1 のセルに Sheet という文字列

を出力します。 (3) 次の For ... Next による制御文では、 i が 2 から行

数 (lngRow)まで Next までの処理が繰り返されます。はじめは i = 2 な

ので、 (4) Cells(2, 1)に、先に代入して老田シート名 strSheet を出力し

ます。以下同様に i が 3, 4, ....と続き、 lngRow になるまでこの処理が

繰り返されます。

【課題 2.11.5】上のコードに加えて、次のように連続番号を出力する

プログラムを書きなさい。

レンジの操作

レンジ (Range)を使うことによって、シート内のデータの入力や出力

を一括して処理することができます。たとえば、 Range(Cells(1,1),

Cells(1,3))は Cells(1,1)から Cells(1,3)を含む範囲を指します。つまり、

A1 から C1 までの範囲です。次は最初の 1 行にあるタイトル全体の背

景色を指定するコードです。

Page 131: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

131

コード:

Sub p343

Dim ColCnt% '使用列数

ColCnt% = ActiveSheet.UsedRange.Columns.Count '使用列数

Range(Cells(1, 1), Cells(1, ColCnt%)).Interior.Color _

= RGB(150, 255, 0) '背景色を指定

End Sub

これは次のコードと同じ結果になります。

Sub p343b

ColCnt% = ActiveSheet.UsedRange.Columns.Count '使用列数

For i = 1 to ColCnt%

(Cells(1, i)= RGB(150, 255, 0) '背景色を指定

Next

End Sub

Page 132: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

132

結果:

上のコードで Interior.Color の部分が背景色を代入する部分です。色

を指定する方法の1つとして、RGB 関数を使う方法があります。これ

は 3 つの引数を使いますが、それぞれ赤 (R)、緑 (G)、青 (B)に対応しま

す。以下は、代表的な色を出すためのそれぞれの引数です。

色 R G B

赤 255 0 0

緑 0 255 0

青 0 0 255

白 255 255 255

黒 0 0 0

シアン 0 255 255

マゼンタ 255 0 255

黄色 255 255 0

他にも、上のコードで指定したように、3 つの引数を組み合わせる

ことによって微妙な色合いを使うことができます。引数と実際の色の

関係は、「テーマの色」の「その他の塗りつぶしの色」で確認するこ

とができます。

Page 133: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

133

*適当なセルを選択し、右クリック→「テーマの色」→「その他の塗

りつぶしの色」→「ユーザー設定」

【課題 2.11.5】以下に示すように A 列が太字(ボールド)にするコー

ドの Range の部分を完成させなさい。(太字にするためのコードはマ

クロの記録を使えばわかります。)

Sub b()

Dim lngRow As Long '使用行数

lngRow = ActiveSheet.UsedRange.Rows.Count '使用行数

Range(...................).Font.Bold = True '範囲を太字に

End Sub

結果:

2.11.6. ユーザーフォームとイベント

ユーザーがプログラムを使いやすいようするために、ユーザーフォ

Page 134: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

134

ームを作成しましょう。はじめにユーザーフォームを作成し、その後

このユーザーフォームを標準モジュールから立ち上げます。

2.11.7. ユーザーフォームの作成

ユーザーフォームを作成するにはプロジェクトウィンドー内のブッ

クに、ユーザーフォームを挿入します。

*「挿入」→「ユーザーフォーム」

ユーザーフォームを起動

*「標準モジュール」に次のコードを書き込み、F5 で実行します。

コード

Sub zikken13() 'ユーザーフォーム

UserForm1.Show 'ユーザーフォームを立ち上げる

End Sub

標準モジュールとフォーム

Page 135: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

135

結果:

【課題 2.11.7a】上のコードを解釈しなさい。

【課題 2.11.7b】フォームの大きさを変えて実験しなさい。

ツールボックスとコントロール

Page 136: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

136

コントロール

ラベル:説明や簡単な指示を書き込みます。

テキストボックス:データをキーインで入力したり、データを表示した

りします。

コンボボックス:リストの一覧から選択したり、一覧にないデータを入

力したりします。

リストボックス:リストの一覧から選択します。

チェックボックス:チェックを入れて選択します。

オプションボタン:フレームコントロールと組み合わせて、選択項目

の中から1つを選択くします。

フレーム:コントロールをグループ化します。

コマンドボタン:ボタンをクリックして一定の処理をします。

マルチページ:コントロールをページごとにグループ化します。

他に、トグル、タブストリップ、スクロールバー、スピン、イメー

ジ、などがあります。

【課題 2.11.7】 フォームにそれぞれのコントロールを配置し、その動作を確か

めましょう。

コマンドボタンとイベント

コマンドボタンをクリックすることで、メッセージボックスが現れ

たり、ユーザーフォームを終了させたりするプログラムを作りましょ

う。

(1) VBE にユーザーフォームを挿入します。

Page 137: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

137

(2) ユーザーフォームにコマンドボタンを設定しします。

(3) プロパティーウィンドウの Caption で、キャプションを「メッセー

ジボックス」とします。

(4) 同様にして、「終了」のボタンを作ります。

Page 138: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

138

(5) 「メッセージボックス」をダブルクリックして、このボタンをク

リックしたときに起動する内容のコードを書きます。ここでは、次の

ようにメッセージボックスを起動するようにします。

(6) 同様にして、「終了」ボタンによってユーザーフォームを終了さ

せるコードを書き込みます。

(7) VBE で標準モジュールを挿入します。

(8) 標準モジュールに、このユーザーフォームを起動するコードを書

き込みます。

Page 139: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

139

(9) 動作を確認するために、シートに戻って、Alt+F8, UserFormShow

を選択します。

(10) 「メッセージボックス」のボタンをクリックします。

(11) 「終了」のボタンをクリックして、終了します。

【課題 2.11.7】 これまでに 3.1~3.4 で扱ったコードの中から 1 つ選び、ユーザ

ーフォームから実行するプログラムを作りなさい。

2.11.8. 正規表現

検索・置換という文字列の処理のためには正規表現が有用です。一

定のパターンによる検索式や置換式を書くことにより、さまざまな検

Page 140: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

140

索・置換を高速で実行します。正規表現のパターンについては、第Ⅱ

部 (***)を参照してください。

テスト

次のデータを使って、たとえばパターンに一致する語があるかどう

かをテストするプログラムを作ります。ここではパターンをインプッ

トボックスで指定します。

データ:

(C:V) Text

(1:0) *Cap.1

(1:1) In principio creavit Deus caelum & terram.

(1:2) Terra autem erat inanis & vacua: & tenebrae erant super faciem

abyssi: & spiritus Dei ferebatur super aquas.

(1:3) Dixitque Deus. Fiat lux. Et facta est lux.

コード:

Sub p_361() '正規表現でテスト

Dim objRE As Object, RE$, i&

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成 (1)

objRE.IgnoreCase = True '大小文字を区別しない (2)

RE$ = InputBox("例:母音で始まる語", _

"正規表現を指定してください。 ", "¥b[aeiou]¥w*")

„インプットボックス (3)

If RE$ = "" Then End 'キャンセル (4)

objRE.Pattern = RE$ „パタン (5)

For i = 2 To ActiveSheet.UsedRange.Rows.Count

'2 から使用行数まで (6)

MsgBox i & ": " & objRE.Test(Cells(i, 2))

'行番号とテスト結果を出力 (7)

Next

Page 141: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

141

Set objRE = Nothing „VBScript のオブジェクトを解放 (8)

End Sub

解説:

(1) Set objRE = CreateObject("VBScript.RegExp")によって、VBScript の

オブジェクトを生成します。この手続きによって以下の正規表現によ

る様々な検索と置換が可能になります。

(2) objRE.IgnoreCase を True に指定すると、大小文字の違いを無視し

ます。たとえば、 ¥b[aeiou]¥w*によって小文字だけでなく、大文字の

母音で始まる語 (In, Et など )も検索されます。

(3) InputBox は結果にあるように、入力を促すインタフェースであり、

入力した文字列を返す関数です。主な引数は最初の 3 つの文字型のデ

ータです。ラベル、タイトル行、そしてテキストボックスのデフォル

トをダブルコーテーションで囲んで、指定します。

(4) キャンセルボタンを押すと、返り値がないので、プログラムを終

了します。

(5) objRE.Pattern = RE$によって、パタンを設定します。

(6) For i = 2 To ActiveSheet.UsedRange.Rows.Count によって、Next まで

の処理を i&が 2 から使用行数になるまで繰り返します。

(7) MsgBox i& & ": " & objRE.Test(Cells(i, 2))によって、行番号とテス

ト結果をメッセージボックスに出力します。ここで、

objRE.Test(Cells(i, 2))

は各セルにあるデータについて、先に設定したパタンに一致する文

字列があるかどうかをチェックします 47。

結果:

はじめに次のインプットボックスが現れます。

47

ここでの出力は True または False ですが、これは文字列ではなく、

真 (True)または偽 (False)を示すブール型の変数です。

Page 142: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

142

結果は最初 (2 行目 )は False になり、4 行目のときに True になります。

【課題 2.11.8a】インプットボックスに他のパタンを指定して、実験しなさい。

【課題 2.11.8b】次のように C 列にテストの結果を出力するコードを書きなさい。

置換

正規表現を使うことにより、文字列の置換が一般化できて、とても

便利になります。たとえば、母音 a, e, i, o, u を、それぞれ{*a*}, {*e*},

{*i*}, {*o*}, {*u*}に変換するためには、a=>{*a*}, e=>{*e*}, ...のよう

に一つずつ変換するのではなく、 ([aeiou])=>{*$1*}という 1 つの置換

式にまとめこむことができます 48。

コード:

Sub p_362() '正規表現で置換

Dim objRE As Object, RE$, i& '変数を宣言

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

objRE.IgnoreCase = True '大小文字を区別しない

objRE.Global = True 'グローバル

48

ここでは、 [aeoiu]は a, e, i, o, u の中のいずれかの文字を示し、 (.. .)

はそれを後で参照させます。=>は左のパタンを右のパタンに置換する

ときに使います。ここでは、{*$1*}の$1 によって、 ([aeiou])を参照し

ます。詳しくは第 I 部をご覧ください。→1.*.****

Page 143: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

143

RE$ = InputBox("例:母音で始まる語", _

"正規表現を指定してください。 ", "(¥b[aeiou]¥w*)=>{*$1*}")

'インプットボックス (1)

If InStr(RE$, "=>") <= 1 Then End 'キャンセル (2)

objRE.Pattern = Left$(RE$, InStr(RE$, "=>") - 1) 'パタンを設定 (3)

For i = 2 To ActiveSheet.UsedRange.Rows.Count

'2 から使用行数まで繰り返す

MsgBox i & ": " & objRE.Replace(Cells(i, 2), _

Mid$(RE$, InStr(RE$, "=>") + 2))

'行番号と置換の結果を出力 (4)

Next

Set objRE = Nothing „VBScript のオブジェクトを解放

End Sub

解説:

(1) インプットボックスのテキストボックスのデフォルトは、

(¥b[aeiou]¥w*)=>{*$1*}

です。これは、母音で始まる語を {*...*}で囲む、という意味です。

(2) インプットボックスの返り値 (RE$)に “=>”がなかったり、または

“=>”で始まっていたりするときはキャンセルします。関数 Instr(a$, b$)

は、文字列 a$の中で b$が占める位置を返します。b$が見つからないと

きはゼロ (0)を返します。

(3) パタンは RE$の中の “=>”の直前の位置までです。関数 Left$(a$, b&)

は文字列 a$の中の b&の位置までの文字列を返します。ここでは b&は

Instr で “=>”の位置を求め、それから 1 を引いた数となります 49。

(4) 行番号と置換の結果を出力します。置換の結果は、

objRE.Replace(a$, b$)

で返します。a$は対象の文字列で、b$は置換文字列(パタン)です。

49

1 を引かないと、 ”=”が含まれてしまいます。

Page 144: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

144

ここでは、a$が Cells(i, 2)、b$が Mid$(RE$, InStr(RE$, "=>") + 2)となっ

ています。関数 Mid$(a$, b&)は文字列 a$の中で、b&番目の文字以降を

切り取った文字列を返します。ここで b&は InStr(RE$, "=>") + 2 とな

っていますが、これはインプットボックスで入力された文字列の中か

ら、“=>”の位置を調べ、それに 2 を足した数を示します 50。

結果:

【課題 2.11.8a】インプットボックスに他のパタンを指定して、実験しなさい。

【課題 2.11.8b】次のように C 列に置換の結果を出力するコードを書きなさい。

検索

(1) カウント Count

パターンに一致する文字列の数を数えます。

50

2 を足すのは、 “=>”が 2 文字分あるためです。2 を足さないと、返

り値に ”=>”が含まれてしまいます。

Page 145: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

145

コード:

Sub p_363a() '正規表現でカウント

Dim objRE As Object, Matches As Object, RE$, i&

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

objRE.IgnoreCase = True '大小文字を区別しない

objRE.Global = True 'グローバル (1)

RE$ = InputBox("例:母音で始まる語 ", _

"正規表現を指定してください。 ", "¥b[aeiou]¥w*")

„インプットボックス

If RE$ = "" Then End 'キャンセル

objRE.Pattern = RE$ 'パタンを設定

For i = 2 To ActiveSheet.UsedRange.Rows.Count

'2 から使用行数まで繰り返す

Set Matches = objRE.Execute(Cells(i, 2))

'Matches コレクションをセット (2)

MsgBox i & ": " & Matches.Count

'行番号とカウントの結果を出力 (3)

Next

Set objRE = Nothing „VBScript のオブジェクトを解放

End Sub

解説:

(1) objRE.Global を True にすると、最初に一致する語だけでなく、全

体を検索します。

(2) Matches はパタンにマッチしたすべての文字列を集めたものです。

(3) 行番号と Matches の数を出力します。

Page 146: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

146

(2) 検索された文字列 Value

正規表現によって検索された文字列(キーワード)を出力するプロ

グラムを作ります。検索の対象となる文字列に含まれるすべてのキー

ワードを出力します。

コード:

Sub p_363b() '正規表現で検索された文字列

Dim objRE As Object, Match As Object, Matches As Object

'正規表現オブジェクト (1)

Dim Sheet$, RE$, i&, k& 'シート名、正規表現、作業用 (2)

RE$ = InputBox("例:母音で始まる語 ", _

"正規表現を指定してください。 ", "¥b[aeiou]¥w*")

'インプットボックス

If RE$ = "" Then End 'キャンセル

Sheet$ = ActiveSheet.Name '現シート名 (3)

Sheets.Add After:=Sheets(Sheets.Count) 'シートを追加 (4)

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

objRE.IgnoreCase = True '大小文字を区別しない

objRE.Global = True 'グローバル

objRE.Pattern = RE$ 'パタンを設定

For i = 2 To Sheets(Sheet$).UsedRange.Rows.Count

'2 から使用行数まで繰り返す

Set Matches = objRE.Execute(Sheets(Sheet$).Cells(i, 2))

'Matches コレクションをセット

Page 147: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

147

For Each Match In Matches

'Matches コレクションのそれぞれの Match について (5)

k = k + 1 '出力行 (6)

Cells(k, 1) = Sheets(Sheet$).Cells(i, 1) 'ID (7)

Cells(k, 2) = Match.Value 'キーワード (8)

Cells(k, 3) = Sheets(Sheet$).Cells(i, 2) '段落 (9)

Next

Next

Set objRE = Nothing „VBScript のオブジェクトを解放

End Sub

解説:

(1) 正規表現のオブジェクトとして、Match を追加します。Match につ

いては→ (4)

(2) シート名 Sheet$と作業用の変数 k&を追加します。

(3) 現シート名を代入します。これは、次にシートを追加したときに、

現シート名が代わってしまうので、データ用のシート名を保持してお

くためです。

(4) シートをブックの最後に追加します。

(5) Matches コレクションのそれぞれの Match について、Next までの処

理をします。これは、すこしわかりにくいかもしれませんが、 (8)で

Match を使うために必要です。

(6) 出力行をインクリメントします。

(7) データの ID を該当する位置にコピーして出力します。

(8) 検索された文字列をキーワードとして、該当する位置に出力しま

す。

(9) データの段落を該当する位置にコピーして出力します。

Page 148: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

148

結果:

(3) 検索された文字列の位置と長さ FirstIndex, Length

検索された文字列の位置と長さが求められれば、それを使って、出力

した段落に、<*...*>のような記号をつけて、際立たせることができま

す。また、色を変えて出力することもできます。

コード:

Sub p_363c() '正規表現で検索された文字列の位置と長さ

Dim objRE As Object, Match As Object, Matches As Object

'正規表現オブジェクト

Dim Sheet$, RE$, Par$, i&, k& 'シート名、正規表現、作業用 (1)

RE$ = InputBox("例:母音で始まる語 ", _

"正規表現を指定してください。 ", "¥b[aeiou]¥w*")

'インプットボックス

If RE$ = "" Then End 'キャンセル

Sheet$ = ActiveSheet.Name '現シート名

Sheets.Add After:=Sheets(Sheets.Count) 'シートを追加

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

objRE.IgnoreCase = True '大小文字を区別しない

objRE.Global = True 'グローバル )

objRE.Pattern = RE$ 'パタンを設定

For i = 2 To Sheets(Sheet$).UsedRange.Rows.Count

'2 から使用行数まで繰り返す

Page 149: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

149

Par$ = Sheets(Sheet$).Cells(i, 2) '対象のセル (2)

Set Matches = objRE.Execute(Par$)

'Matches コレクションをセット )

For Each Match In Matches

'Matches コレクションのそれぞれの Match について

k = k + 1 '出力行

Cells(k, 1) = Sheets(Sheet$).Cells(i, 1) 'ID

Cells(k, 2) = Match.Value 'キーワード

Cells(k, 3) = Left$(Par$, Match.Firstindex) _

& "<*" & Match.Value & "*>" _

& Mid$(Par$, Match.Firstindex + Match.Length + 1) '段落 (3)

Next

Next

Set objRE = Nothing „VBScript のオブジェクトを解放

End Sub

解説:

(1) 対象のセルを複数回扱うので、Par$という変数を用意しておきま

す。

(2) 対象のセルを Par$に代入します。

(3) 検索された文字列(キーワード)の前にある文字列、キーワード、

キーワードの後にある文字列を探して、キーワードを<*...*>で囲みま

す。キーワードの前にある文字列は Left$(Par$, Match.Firstindex)にな

り 、 Left$(Par$, Match.Firstindex-1) で は あ り ま せ ん 。 こ れ は

Match.Firstindex が検索された文字列の 1 文字目の位置が 0 になる規則

があるためです。キーワードの後にある文字列は Par$ の中で、

Match.Firstindex + Match.Length + 1 から以後の文字列となります。+1

が必要なのは、やはり、Match.Firstindex が検索された文字列の 1 文字

目の位置が 0 になる規則によるものです。

Page 150: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

150

結果:

【課題 2.11.8a】次のように C 列にキーワードを赤字で出力させるためのコード

を書きなさい。

次のコードを参考にして、a, b, c, d を決めなさい。

Cells(a, b) = Par$ „段落

Cells(a, b).Characters(Start:=c, Length:=d).Font.ColorIndex = 3

'フォントを赤に

ユーザーフォーム

次のユーザーフォームからプログラムを実行させます。はじめにユ

ーザーフォームを作成します。

Page 151: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

151

ここでは、次のコントロールを使います。プロパティウィンドーで

オ ブ ジ ェ ク ト 名 (lbl, txtRE, chkCap, frm, optSig, optRed, cmdExec,

cmdEnd と Caption(「正規表現による検索」、「選択」、「記号」、

「赤字」、「実行」、「終了」)を正しく設定してください。テキス

トボックスもデフォルト値 (¥b[aeiou]¥w*)は、Text で指定します。

ラベル: lbl「正規表現による検索」

テキストボックス: txtRE

大小文字区別: chkCap

フレーム: frm「選択」

オプションボタン 1:optSig「記号」

オプションボタン 2:optRed「赤」

コマンドボタン 1: cmdExec「実行」

コマンドボタン 2: cmdEnd「終了」

Page 152: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

152

コード:

Option Explicit

Private Sub cmdExec_Click()

Dim objRE As Object, Match As Objec t, Matches As Object

'正規表現オブジェクト

Dim Sheet$, RE$, Par$, i&, k& 'シート名、正規表現、作業用

RE$ = txtRE '正規表現 (2)

If RE$ = "" Then End 'キャンセル

Sheet$ = ActiveSheet.Name '現シート名

Sheets.Add After:=Sheets(Sheets.Count) 'シートを追加

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

objRE.IgnoreCase = Not chkCap '大小文字を区別 (1)

objRE.Global = True 'グローバル )

objRE.Pattern = RE$ 'パタンを設定

For i = 2 To Sheets(Sheet$).UsedRange.Rows.Count

'2 から使用行数まで繰り返す

Par$ = Sheets(Sheet$).Cells(i, 2) '対象の段落

Set Matches = objRE.Execute(Par$)

'Matches コレクションをセット )

For Each Match In Matches

'Matches コレクションのそれぞれの Match について

k = k + 1 '出力行

Cells(k, 1) = Sheets(Sheet$).Cells(i, 1) 'ID

Cells(k, 2) = Match.Value 'キーワード

Cells(k, 3) = Par$ '段落

If optSig Then „「記号」オプション (3)

Cells(k, 3) = Left$(Par$, Match.Firstindex) _

& "<*" & Match.Value & "*>" _

Page 153: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

153

& Mid$(Par$, Match.Firstindex + Match.Length + 1) '段落

Else „「赤字」オプション (4)

Cells(k, 3).Characters(Start:=Match.Firstindex + 1, _

Length:=Match.Length).Font.ColorIndex = 3 'フォントを赤に

End If

Next

Next

Set objRE = Nothing „VBScript のオブジェクトを解放

End Sub

Private Sub cmdEnd_Click()

End '終了

End Sub

解説:

(1) 大小文字の区別をするときは chkCap の値が True になるので、こ

れを False にして、objRE.IgnoreCase に代入します。逆も同じです。

(2) テキストボックス (txtRE)の値を RE$に代入します。

(3) 「記号」オプションボタンが True のときは、次の出力になります。

(4) 「赤字」オプションボタンが True のときは、次の出力になります。

【課題 2.11.8a】3.6.2で扱った置換のためのユーザーフォームを作り、そのコー

ドを書きなさい。「記号」と「赤字」のオプションは不要です。

【課題 2.11.8b】置換と検索を統合するユーザーフォームを作り、そのコードを

書きなさい。

2.11.9. 単語リスト

Excel の外部にある VBScript の「ディクショナリ」を組み込むこと

によって、文字列をキーとした配列を使うことができます。

配列とディクショナリ

ふつうの配列は整数をキーとして、文字列や数を項目にします。た

とえば、D$(1) = ”in”という代入文では、D$という文字列の配列のキー

=1 に ”in”という文字列が代入されます。一方、ディクショナリオブジ

ェクトを使うと、整数ではなくて文字列を配列のキーとすることがで

Page 154: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

154

います。

コード:

Sub p_371a() 'ディクショナリで検索

Dim objDic As Object, D$(3) 'ディクショナリオブジェクト

D$(1) = "in" '配列に格納 (1)

D$(2) = "est" '配列に格納 (2)

MsgBox D$(1) '出力 (3)

MsgBox D$(2) '出力 (4)

Set objDic = CreateObject("Scripting.Dictionary")

'ディクショナリオブジェクトを生成 (5)

objDic("in") = 1 '配列に格納 (6)

objDic("est") = 2 '配列に格納 (7)

MsgBox objDic("in") '出力 (8)

MsgBox objDic("est") '出力 (9)

Set objDic = Nothing 'VBScript のオブジェクトを解放 (10)

End Sub

解説:

(1-2) 配列のそれぞれの位置(キーによって示す)に、文字列を代入

します。

(3-4) 配列のそれぞれの位置に格納されたデータを次のように出力し

ます。

Page 155: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

155

最初は、D$(1)に代入された値 (in)を示しています。次は、D$(2)に代

入された値 (est)を示しています。

(5) ディクショナリオブジェクトを生成します。これはディクショナ

リを使うための手続きです。

(6-7) それぞれ、 ”in”, “est”という文字列をキーとして、 1, 2 という数

を代入します。

(8-9) 配列のそれぞれの位置に格納されたデータを次のように出力し

ます。

(10) VBScript のオブジェクトを解放します。

【課題 2.11.9】上のコードの(1-4), (6-9)の一部を変えて、実験しなさい。

キーの存在

私たちが主として扱うのは文字列による言語データですが、数字を

キーにして、文字列を代入しておくと、数字をキーとした配列では、

その内容(文字列)を引き出して、それが検索している対象であるか

どうかをチェックする必要があります。一方、ディクショナリを使っ

て文字列をキーとすることで、そのキーが存在することが一瞬でわか

ります。

コード:

Sub p_372() 'ディクショナリで検索

Dim objRE As Object, Match As Object, Matches As Object

'正規表現オブジェクト

Dim objDic As Object 'ディクショナリオブジェクト

Dim Sheet$, i&, k& 'シート名、正規表現、作業用 (1)

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

Page 156: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

156

Set objDic = CreateObject("Scripting.Dictionary")

'ディクショナリオブジェクトを生成

Sheet$ = ActiveSheet.Name '現シート名

Sheets.Add After:=Sheets(Sheets.Count) 'シートを追加

objDic("in") = 1 '配列に格納

objDic("est") = 2 '配列に格納

objDic("erat") = 3 '配列に格納

objRE.IgnoreCase = True '大小文字を区別しない

objRE.Global = True 'グローバル )

objRE.Pattern = "¥w+" 'パタン(単語)を設定

For i = 2 To Sheets(Sheet$).UsedRange.Rows.Count

'2 から使用行数まで繰り返す

Set Matches = objRE.Execute(Sheets(Sheet$).Cells(i, 2))

'Matches コレクションをセット )

For Each Match In Matches

'Matches コレクションのそれぞれの Match について

If objDic.Exists(LCase(Match.Value)) Then

„文字列が objDic に存在すれば (1)

k = k + 1 'k をインクリメント

Cells(k, 1) = i '入力行

Cells(k, 2) = objDic(LCase(Match.Value)) '語番号 (2)

Cells(k, 3) = Match.Value '語

Cells(k, 4) = Sheets(Sheet$).Cells(i, 2) '段落

End If

Next

Next

Set objRE = Nothing 'VBScript のオブジェクトを解放

Set objDic = Nothing 'VBScript のオブジェクトを解放

End Sub

Page 157: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

157

解説:

(1) マッチした文字列を小文字に変換した文字列が objDic に存在すれ

ば、以下の出力の処理に入ります。マッチした文字列を小文字に変換

に変換することで、データの中に In や Est のような大文字語が含まれ

ていても、ディクショナリで検索されます。大文字と小文字を区別す

るときは、 If objDic.Exists(Match.Value) Then とします。

(2) ディクショナリには語の番号が入力されていますから、ここでマ

ッチした文字列に対応する語の番号が出力されます。

結果:

【課題 2.11.9】上のコードの(1), (2)の一部を変えて、大小文字を区別して検

索するプログラムを作成しなさい。

文字列を単語リストに

インプットボックスに検索する単語のリストを記入します。単語は

ブランク(空白)などで区切って置きます。インプットボックスに入

力された文字列を正規表現によって語に分割し、それぞれの語をディ

クショナリの配列に格納します。

コード:

Sub p_373() 'ディクショナリで検索

Dim objRE As Object, Match As Object, Matches As Object

'正規表現オブジェクト

Dim objDic As Object 'ディクショナリオブジェクト

Dim Sheet$, KW$, i&, k& 'シート名、正規表現、作業用 (1)

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

Set objDic = CreateObject("Scripting.Dictionary")

'ディクショナリオブジェクトを生成

KW$ = InputBox("例:", "単語を指定してください。 ", _

Page 158: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

158

"in est erat") 'インプットボックス (1)

If KW$ = "" Then End 'キャンセル

Sheet$ = ActiveSheet.Name '現シート名

Sheets.Add After:=Sheets(Sheets.Count) 'シートを追加

objRE.IgnoreCase = True '大小文字を区別しない

objRE.Global = True 'グローバル

objRE.Pattern = "¥w+" 'パタン(単語)を設定

Set Matches = objRE.Execute(KW$)

'Matches コレクションをセット (2)

For Each Match In Matches

'Matches コレクションのそれぞれの Match について (3)

k = k + 1 'k をインクリメント (4)

objDic(LCase(Match.Value)) = k '配列に格納 (5)

Next

k = 0 'k を初期化 (6)

For i = 2 To Sheets(Sheet$).UsedRange.Rows.Count

'2 から使用行数まで繰り返す

Set Matches = objRE.Execute(Sheets(Sheet$).Cells(i, 2))

'Matches コレクションをセット )

For Each Match In Matches

'Matches コレクションのそれぞれの Match について

If objDic.Exists(LCase(Match.Value)) Then

k = k + 1 'k をインクリメント

Cells(k, 1) = i '入力行

Cells(k, 2) = objDic(LCase(Match.Value)) '語番号

Cells(k, 3) = Match.Value '語

Cells(k, 4) = Sheets(Sheet$).Cells( i, 2) '段落

End If

Next

Next

Page 159: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

159

Set objRE = Nothing 'VBScript のオブジェクトを解放

Set objDic = Nothing 'VBScript のオブジェクトを解放

End Sub

解説:

(1) 検索する語のリストを入力するためのインプットボックス関数で

す。これは次のように出現します。返り値は KW$に代入されます。

(2) 入力された文字列 KW$について、Matches コレクションをセット

します。

(3) Matches コレクションのそれぞれの Match について、以下を実行し

ます。

(4) 配列に格納する整数 k をインクリメントします。

(5) 配列のキーをマッチした文字列を小文字に変換した文字列を使い、

そのキーに整数 k を格納します。

(6) k を出力行として再利用するので、0 に初期化します。

【課題 2.11.9】上のコードの一部を変更して、次のように、第 1行をタイトル行と

して出力するプログラムを書きなさい。

ユーザーフォーム

次のユーザーフォームからプログラムを実行させます。はじめにユ

ーザーフォームを作成します。

Page 160: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

160

それぞれのコントロールは、先の「正規表現による検索」を同じ物

を使います 51。

ラベル: lbl「単語リストによる検索」

テキストボックス: txtRE

大小文字区別: chkCap

フレーム: frm「選択」

オプションボタン 1:optSig「記号」

オプションボタン 2:optRed「赤」

コマンドボタン 1: cmdExec「実行」

コマンドボタン 2: cmdEnd「終了」

コード:

Private Sub cmdExec_Click()

Dim objRE As Object, Match As Object, Matches As Object

'正規表現オブジェクト

Dim objDic As Object 'ディクショナリオブジェクト

Dim Sheet$, Par$, KW$, M$, i&, k&

'シート名、段落、キーワード、マッチ文字列、作業用

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

Set objDic = CreateObject("Scripting.Dictionary")

'ディクショナリオブジェクトを生成

51

ワークブックをコピーしてもかまいません。

Page 161: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

161

KW$ = txtRE '単語リスト

If KW$ = "" Then End 'キャンセル

Sheet$ = ActiveSheet.Name '現シート名

Sheets.Add After:=Sheets(Sheets.Count) 'シートを追加

objRE.IgnoreCase = True '大小文字を区別しない

objRE.Global = True 'グローバル

objRE.Pattern = "¥w+" 'パタン(単語)を設定

Set Matches = objRE.Execute(KW$)

'Matches コレクションをセット

For Each Match In Matches

'Matches コレクションのそれぞれの Match について

M$ = Match.Value 'マッチ文字列 (1)

If Not chkCap Then M$ = LCase(M$)

'大小文字を区別しないならばマッチ文字列を小文字に (2)

objDic(M$) = “” '配列に格納 (3)

Next

Cells(1, 1) = "ID" 'ID (4)

Cells(1, 2) = "Key Word" „(5)

Cells(1, 3) = "Paragraph" „(6)

k = 1 'k を初期化 (7)

For i = 2 To Sheets(Sheet$).UsedRange.Rows.Count

'2 から使用行数まで繰り返す

Par$ = Sheets(Sheet$).Cells(i, 2) '対象の段落

Set Matches = objRE.Execute(Par$)

'Matches コレクションをセット

For Each Match In Matches

'Matches コレクションのそれぞれの Match について

M$ = Match.Value 'マッチ文字列 (8)

If Not chkCap Then M$ = LCase(M$)

Page 162: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

162

'大小文字を区別しないならばマッチ文字列を小文字に (9)

If objDic.Exists(M$) Then

'文字列が objDic に存在すれば (10)

k = k + 1 'k をインクリメント

Cells(k, 1) = Sheets(Sheet$).Cells(i, 1) 'ID

Cells(k, 2) = Match.Value 'キーワード

Cells(k, 3) = Par$ '段落

If optSig Then

Cells(k, 3) = Left$(Par$, Match.Firstindex) _

& "<*" & Match.Value & "*>" _

& Mid$(Par$, Match.Firstindex + Match.Length + 1) '段落

Else

Cells(k, 3).Characters(Start:=Match.Firstindex + 1, _

Length:=Match.Length).Font.ColorIndex = 3 'フォントを赤

End If

End If

Next

Next

Set objRE = Nothing 'VBScript のオブジェクトを解放

Set objDic = Nothing 'VBScript のオブジェクトを解放

End Sub

Private Sub cmdEnd_Click()

End '終了

End Sub

解説:

先の「正規表現による検索」とほとんど同じですが、次が異なりま

す。

(1-3) 大小文字を区別するときは、マッチ文字列を単語リストに加え、

大小文字を区別しないときはマッチ文字列を小文字に変換します。文

字列関数 Lcase(A$)は、A$を小文字に変換して返します。ここでは、

配列に ””(ヌル)を代入しています。これは、後でキー(の存在)だ

けを参照するので、とくに項目が必要でないためです。

Page 163: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

163

(4-7) 第 1 行をタイトル行とするためのコードです。

(8-10) 対象とする段落内の単語が、ディクショナリの配列内の単語と

一致するかどうかを見るために、大小文字の区別をするかどうかで、

マッチ文字列の扱いが代わります。

結果(1):大小文字を区別しない、記号

結果(2):大小文字を区別する、赤字

【課題 2.11.9】先の「正規表現による検索」と今回の「単語リストによ

る検索」を統合するユーザーフォームを作り、そのコードを書きなさい。

2.11.10. プログラムの構成

読みやすさ

次の 2 つのコードの動作は同じですが、コード 2 のほうが読みやす

いと言えるでしょう 52。

コード 1

WinCnt% = WinCnt% + 1 'クリック回数

52

これは次のコードの [...]の部分です。

Private Sub cmbAnaWindow_Click()

'ウィンドウ・コマンドボタンをクリック

[...]

End Sub

Page 164: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

164

If WinCnt% Mod 3 = 1 Then „3 の除算の余りが 1 ならば

C3$ = ActiveCell.Address '現在のカーソルの位置

ActiveWindow.NewWindow '新しいウィンドウを開く

ActiveWorkbook.Windows.Arrange ArrangeStyle:=xlVertical

'ウィンドウを縦に並べる

Range("A2").Select: ActiveWindow.FreezePanes = True

'ウィンドー枠を固定

Range(C3$).Select '以前のウィンドウのカーソル位置に移動

ElseIf WinCnt% Mod 3 = 2 Then „3 の除算の余りが 2 ならば

ActiveWorkbook.Windows.Arrange ArrangeStyle:=xlHorizontal

'ウィンドウを横に並べる

ElseIf WinCnt% Mod 3 = 0 Then „3 の除算の余りが 0 ならば

If Windows.Count > 1 Then

ActiveWindow.Close 'ウィンドウを閉じる

ActiveWindow.WindowState = xlMaximized '最大化

End If

End If

コード 2

Select Case WinCnt% Mod 3 '3 の除算の余りによって以下を選択

Case 0:

If Windows.Count > 1 Then 'ウィンドウが複数のときは…

ActiveWindow.Close 'ウィンドウを閉じる

ActiveWindow.WindowState = xlMaximized '最大化

End If

Case 1:

C3$ = ActiveCell.Address '現在のカーソルの位置

ActiveWindow.NewWindow '新しいウィンドウを開く

ActiveWorkbook.Windows.Arrange ArrangeStyle:=xlVertical

'ウィンドウを縦に並べる

Range(C3$).Select '以前のウィンドウのカーソル位置に移動

Case 2:

ActiveWorkbook.Windows.Arrange ArrangeStyle:=xlHorizontal

'ウィンドウを横に並べる

Page 165: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

165

End Select

このように読みやすいコードを書くことは、コードの説明や管理の

ために重要です。主な留意点として次が挙げられます 53。

コメント文を書く

段落を意識して改行とインデントをする

同じ階層に属する行の行頭位置を揃える 54

わかりやすい変数名を使う 55

なるべく短いコードを書く 56

【課題 2.11.10】適当なコマンドボタンを作って、上の 2つのコードの動きを確か

めなさい。

構造化

プログラム全体を部分(モジュール)に分け、それらを構造化する

ると、全体の動きがわかりやすくなり、ミスも防げます。また、大き

なプログラムを作るとき、最初は小さな機能だけが実行できるような

モジュールを作り、それに他の機能のモジュールを付け足していくよ

うに作り上げていくとよいでしょう。初めから大きなプロジェクトを

展開すると、うまく動かないときに原因がどこにあるのか見つけにく

くなります。

このようにモジュールを積み上げていく、という方法をとるとき、

次の方法が有効です。

プログラムの流れの制御

サブルーチン

ユーザー定義関数

プログラムは基本的に上から順に実行されますが、条件によって実

53

他に、構造化という重要な留意点がありますが、これについては次

節で扱います。 54

VBE のタブの初期設定は 4 文字ですが、ここでは 2 文字に変更して

あります。VBE の「ツール」→「オプション」→「編集」→「タブ間

隔」を 2 とする。 55

ここでは文字型 ($)、短整数型 (%)、長整数型 (&)、単精度浮動小数点

(!)以外は、たとえば varI のように語頭に変数型を示す文字を使ってい

ます。 56

長くなるときは、次で扱う構造化をします。1 つのモジュールの長

さは、たとえば 40 行以内にすると読みやすいと思います。

Page 166: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

166

行の流れが分岐したり、ループによって処理が繰り返されたりします。

たとえば、次のプログラムでは、オプションボ タン optPrepTitle,

optPrepNum, optPrepSepInt のどれか 1 つが True であることを条件に、

処理が 3 つのモジュールに分岐しています 57。

Sub ZYUNBI() '■資料:準備

If optPrepTitle Then '●A1:題名を付与

[処理 ]

End If

If optPrepNum Then '●A2:番号を付与

[処理 ]

For i = 2 To Rw '使用中の行数まで繰り返す

[処理 ]

Next

End If

If optPrepSepInt Then '●B1:分離 ID から統合 ID へ

If Cl <= Val(cmbPrepSepInt.text) Then

[処理 ]

End If

[処理 ]

End If

End Sub

さらに「A2:番号を付与」には For ... Next の繰り返しのモジュール

があり、「B1:分離 ID から統合 ID へ」には、If ... End If の条件分岐に

よるモジュールがあります。

大きなプログラムは、その一部のモジュールをサブルーチンにして

おくとわかりやすくなります。サブルーチンは元のプログラム(最初

に実行されるプログラム:メインルーチン)から呼び出されます。サ

ブルーチンからさらに別のサブルーチンを呼び出すこともあります。

57

If ... End If と同様に条件分岐をする Select Case ... End Select につい

ては先に扱いました。モジュールの境界には 1 行の空白を置くと全体

がわかりやすくなります。

Page 167: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

167

サブルーチンがとくに有用なのは、それが複数のプログラムから呼び

出されるときです。

Public Sub cmdExec_Click() '◎「実行」ボタンを押したとき

(...)

Call ColumnsAutofit '▼行幅・行高を自動調整

End Sub

Sub ZYUNBI() '■資料:準備

(...)

If optPrepAutofit Then '●E.行幅・行高を自動調整

Call ColumnsAutofit '行幅・行高を自動調整

End If

End Sub

Sub ColumnsAutofit() '行幅・行高を自動調整

ActiveSheet.UsedRange.Font.Name = cmbFontName.Value 'フォント名

ActiveSheet.UsedRange.Font.Size = cmbFontSize.Va lue 'フォントサイ

ActiveSheet.UsedRange.Columns.ColumnWidth = Val(txtColMax)

'列幅を最大値に

ActiveSheet.UsedRange.Columns.WrapText = True '折り返し

ActiveSheet.UsedRange.Columns.AutoFit '列幅を自動調整

ActiveSheet.UsedRange.Rows.AutoFit '行高を自動調整

Range("A2").Select: ActiveWindow.FreezePanes = True

'ウィンドー枠を固定

End Sub

上 の コ ー ド で は 、 ColumnsAutofit と い う サ ブ ル ー チ ン が

cmdExec_Click というイベントによって起動するプログラムから呼び

出され、さらに、ZYUNBI というサブルーチンからも呼び出されてい

ます。

以前に、あらかじめ用意されている関数について扱いました。あら

かじめ用意されている関数ではなく、プログラムの中で、ユーザー(プ

ログラマー)があれば便利だと思う関数を作成することができます。

たとえば、次の fncReplaceRE は、対象、検索文字、置換文字、大小文

Page 168: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

168

字区別、という 4 つの引数によって正規表現置換を実行する関数です。

対象の文字列が、これらの条件に従って置換された値(文字列)が返

されます。

Sub YOMIKOMI() '■資料:読み込み

(...)

varK = fncReplaceRE(varK, " ", "_123", False) 'データ

(...)

Function fncReplaceRE(ByVal T$, S1$, S2$, bolIC As Boolea n) As String

'=関数:正規表現による置換(対象、検索文字、置換文字、大小文字

区別)

objWK.IgnoreCase = Not bolIC '大小文字区別を判定

objWK.Pattern = fncRedefRE(S1$) '検索パターン

S2$ = Replace(S2$, "¥t", vbTab)

S2$ = Replace(S2$, "¥n", vbCr)

fncReplaceRE = objWK.Replace(T$, S2$) '置換・代入

End Function

【課題 2.11.10a】 LETRAS のコードの中から If ... End If, For ... Next を使っ

た部分をいくつか抽出して、その機能を解読しなさい。

【課題 2.11.10b】 LETRAS のコードの中から Call と Function を使った部分を

いくつか抽出して、その機能を解読しなさい。

高速化

プログラムが正しく実行されれば一応完了したことになりますが、

見直すと無駄な処理が見つかることがあります。

変数を使うことによって不必要な計算を繰り返すことを防ぎ、実行

が高速化することができます。たとえば、次の 2 つのコードを比べて

みましょう。

コード 1

Sub p_383a()

For i = 1 To ActiveSheet.UsedRange.Rows.Count

'現シートの行数まで繰り返す

Cells(i, 1) = i '連続番号を書き込む

Next

Page 169: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

169

End Sub

コード 2

Sub p_383b()

Dim Rw& '現シートの行数

Rw& = ActiveSheet.UsedRange.Rows.Count '現シートの行数

For i = 1 To Rw& まで繰り返す

Cells(i, 1) = i '連続番号を書き込む

Next

End Sub

コード 1 では、For ... Next のループを繰り返すごとに、現シートの

行数をカウントしています。一方、コード 2 では Rw&という変数に一

度だけ現シートの行数を計算して代入し、For ... Next のループではこ

れを繰り返して使っています。計算するという動作が 1 回きりなので、

コード 2 のほうが高速です。尐ないデータでは差があまり感じられま

せんが、大量のデータとなったときに差が顕著になります。

一方、上のように変数を使うと行数が増え、また変数の内容にも注

意しておかなければならなくなります。このように高速化と読みやす

さにはそれぞれ一長一短がある場合があります。どちらを優先させる

かはケースバイケースです。

【課題 2.11.10a】 データの量を多くして、上の 2つのコードの実行時間を比較

しなさい。

上のコードでは Cells という個々のセルを単位として処理していま

すが、レンジ (Range)という「面」(2 次元)の単位を使うことにより

処理を高速化することができます 58。とくに次のように、一括して処

理するときに有効です。

Sub p_383c()

Dim Rw& '現シートの行数

Rw = ActiveSheet.UsedRange.Rows.Count '現シートの行数

Range(Cells(1, 1), Cells(Rw, 1)) = ActiveSheet.Name '現シート名

58

上のコードで使っている UsedRange も 1 つの「レンジ」です。

Page 170: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

170

End Sub

Range は、上のように始点と終点のセルを指定することにより、それ

らを含む長方形の範囲になります。このように Range を使うと、コー

ドも比較的単純になります。

【課題 2.11.10b】 Range を使って、次の出力を得る簡潔なコードを書きなさ

い。

ワークシート関数はエクセルシートで使われる関数です。たとえば、

次のシートの A1:B5 の範囲の最大値を求めるには、コード p_383d を

使います。

Sub p_383d() '最大値

MsgBox WorksheetFunction.Max(Range(Cells(1, 1), Cells(5, 2)))

End Sub

結果:

ワークシート関数を使わないと、コードが複雑になり、実行時間も

増加することになります。

Page 171: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

171

最後に、処理の時間を計算するコードを示します。これを使うこと

によってさまざまな処理の経過時間を比較することができます。

Sub k()

varStart = Time '開始時

For i = 1 To 10000

For j = 1 To 10

Cells(i, j) = i '処理

Next

Next

MsgBox Minute(Time - varStart) & "分" _

& Second(Time - varStart) & "秒" '経過時間

End Sub

結果:

【課題 2.11.10c】 ワークシート関数を使って最小値 (Min)と平均値 (Average)

を出力するコードを書きなさい。ワークシート関数を使わないで最小値と平均

値を求めるコードを書き、両者を比較しなさい。

2.11.11. 課題コードの解答

【課題 3.1.2b】

Sub p_312b()

Cells(2, 2) = "ABC"

Cells(3, 2) = "DEF"

End Sub

Page 172: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

172

【課題 3.2.1a】

Sub p_321b()

Dim intA As Integer '整数型

Dim intB As Integer '整数型

intA = 1 'intA に 1 を代入

intB = 2 'intB に 2 を代入

Cells(1, 1) = "足し算 "

Cells(1, 2) = "引き算 "

Cells(1, 3) = "掛け算 "

Cells(1, 4) = "割り算 "

Cells(2, 1) = intA + intB

Cells(2, 2) = intA - intB

Cells(2, 3) = intA * intB

Cells(2, 4) = intA / intB

End Sub

【課題 3.2.1b】

Sub p_321b()

A$ = "太郎は " 'A$に代入

B$ = "学生です。 " 'B$に代入

C$ = "花子は " 'C$に代入

Cells(1, 1) = A$ & B$ '連結させて出力

Cells(2, 1) = C$ & B$ '連結させて出力

End Sub

【課題 3.2.3b】

Sub p_323b() '逆順

Dim A$, S$, i& '宣言

A$ = "TERRAM" 'A$に文字列を代入

For i = 1 To Len(A$) 'A$の文字数まで繰り返す

Cells(i, 1) = i '番号

Page 173: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

173

Cells(i, 2) = Mid(A$, i, 1) '文字

S$ = Mid(A$, i, 1) & S$ 'i 番目の 1 文字を前に連結

Cells(i, 3) = S$ '文字列

Next

End Sub

【課題 3.3.1c】

マクロの記録:

Sub Macro1()

' Sheets("Sheet1").Select

Sheets("Sheet1").Copy After:=Sheets(5)

End Sub

現シートのコピー:

Sub Macro2()

ActiveSheet.Copy After:=Sheets(Sheets.Count)

End Sub

【課題 3.4.1b】

Sub p341b() '使用している列数

MsgBox "列数は " & ActiveSheet.UsedRange.Columns.Count

End Sub

【課題 3.4.2】

Sub p341a() '使用している行数

Dim strSheet As String, lngRow As Long, i As Long

'、使用行数、作業用変数

strSheet = ActiveSheet.Name 'シート名

ActiveSheet.Copy After:=Sheets(Sheets.Count)

'新シートに出力するとき

lngRow = ActiveSheet.UsedRange.Rows.Count '使用行数

Columns(1).Insert '1 列挿入

Cells(1, 1) = "Sheet" 'タイトル

Page 174: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

174

For i = 2 To lngRow

Cells(i, 1) = strSheet 'シート名を出力

Next

Columns(1).Insert '1 列挿入

Cells(1, 1) = "No." 'タイトル

For i = 2 To lngRow

Cells(i, 1) = i - 1 '連続番号を出力

Next

End Sub

【課題 3.4.3】

Sub b()

Dim lngRow As Long '使用行数

lngRow = ActiveSheet.UsedRange.Rows.Count '使用行数

Range(Cells(1, 1), Cells(lngRow, 1)).Font.Bold = True '範囲を太字に

End Sub

【課題 3.6.1】

Sub p_361bw() '正規表現でテスト

Dim objRE As Object, RE$, i&

Set objRE = CreateObject("VBScript.RegExp") 'VBScript のオブジェク

トを生成

RE$ = InputBox("例:母音で始まる語 ", "正規表現を指定してくださ

い。 ", "¥b[aeiou]¥w*")

If RE$ = "" Then End 'キャンセル

objRE.Pattern = RE$

For i = 2 To ActiveSheet.UsedRange.Rows.Count '2 から使用行数まで

Cells(i, 3) = objRE.Test(Cells(i, 2)) '行番号とテスト結果を出力

Page 175: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

175

Next

End Sub

【課題 3.6.2b】

Sub p_362w() '正規表現で置換

Dim objRE As Object, RE$, i& '変数を宣言

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

objRE.IgnoreCase = True '大小文字を区別しない

objRE.Global = True 'グローバル

RE$ = InputBox("例:母音で始まる語 ", _

"正規表現を指定してください。 ", "(¥b[aeiou]¥w*)=>{*$1*}")

'インプットボックス

If InStr(RE$, "=>") <= 1 Then End 'キャンセル

objRE.Pattern = Left$(RE$, InStr(RE$, "=>") - 1) 'パタンを設定

For i = 2 To ActiveSheet.UsedRange.Rows.Count

'2 から使用行数まで繰り返す

Cells(i, 3) = objRE.Replace(Cells(i, 2), _

Mid$(RE$, InStr(RE$, "=>") + 2)) '行番号と置換の結果を出力

Next

End Sub

【課題 3.6.3a】

Sub p_363c() '正規表現で検索された文字列の位置と長さ

Dim objRE As Object, Match As Object, Matches As Object

'正規表現オブジェクト

Dim Sheet$, RE$, Par$, i&, k& 'シート名、正規表現、作業用 (1)

RE$ = InputBox("例:母音で始まる語 ", _

"正規表現を指定してください。 ", "¥b[aeiou]¥w*")

'インプットボックス

If RE$ = "" Then End 'キャンセル

Page 176: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

176

Sheet$ = ActiveSheet.Name '現シート名

Sheets.Add After:=Sheets(Sheets.Count) 'シートを追加

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

objRE.IgnoreCase = True '大小文字を区別しない

objRE.Global = True 'グローバル )

objRE.Pattern = RE$ 'パタンを設定

For i = 2 To Sheets(Sheet$).UsedRange.Rows.Count

'2 から使用行数まで繰り返す

Par$ = Sheets(Sheet$).Cells(i, 2) '対象のセル (2)

Set Matches = objRE.Execute(Par$)

'Matches コレクションをセット )

For Each Match In Matches

'Matches コレクションのそれぞれの Match について

k = k + 1 '出力行

Cells(k, 1) = Sheets(Sheet$).Cells(i, 1) 'ID

Cells(k, 2) = Match.Value 'キーワード

Cells(k, 3) = Par$ '段落

Cells(k, 3).Characters(Start:=Match.Firstindex + 1,

Length:=Match.Length).Font.ColorIndex = 3

'フォントを赤に

Next

Next

Set objRE = Nothing 'VBScript のオブジェクトを解放

End Sub

【課題 3.7.2】

If objDic.Exists(Match.Value) Then

„文字列が objDic に存在すれば (1)

k = k + 1 'k をインクリメント

Cells(k, 1) = i '入力行

Page 177: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

177

Cells(k, 2) = objDic(Match.Value) '語番号 (2)

【課題 3.7.3】

Sub p_373() 'ディクショナリで検索

Dim objRE As Object, Match As Object, Matches As Object

'正規表現オブジェクト

Dim objDic As Object 'ディクショナリオブジェクト

Dim Sheet$, KW$, i&, k& 'シート名、正規表現、作業用 (1)

Set objRE = CreateObject("VBScript.RegExp")

'VBScript のオブジェクトを生成

Set objDic = CreateObject("Scripting.Dictionary")

'ディクショナリオブジェクトを生成

KW$ = InputBox("例: ", _

"単語を指定してください。 ", "in est erat") 'インプットボックス

If KW$ = "" Then End 'キャンセル

Sheet$ = ActiveSheet.Name '現シート名

Sheets.Add After:=Sheets(Sheets.Count) 'シートを追加

objRE.IgnoreCase = True '大小文字を区別しない

objRE.Global = True 'グローバル )

objRE.Pattern = "¥w+" 'パタン(単語)を設定

Set Matches = objRE.Execute(KW$)

'Matches コレクションをセット )

For Each Match In Matches

'Matches コレクションのそれぞれの Match について

k = k + 1 'k をインクリメント

objDic(LCase(Match.Value)) = k '配列に格納

Next

Cells(1, 1) = "ID" 'ID

Cells(1, 2) = "Key Word"

Cells(1, 3) = "Paragraph"

Page 178: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

178

k = 1 'k を初期化

For i = 2 To Sheets(Sheet$).UsedRange.Rows.Count

'2 から使用行数まで繰り返す

Set Matches = objRE.Execute(Sheets(Sheet$).Cells(i, 2))

'Matches コレクションをセット )

For Each Match In Matches

'Matches コレクションのそれぞれの Match について

If objDic.Exists(LCase(Match.Value)) Then

k = k + 1 'k をインクリメント

Cells(k, 1) = i '入力行

Cells(k, 2) = objDic(LCase(Match.Value)) '語番号

Cells(k, 3) = Match.Value '語

Cells(k, 4) = Sheets(Sheet$).Cells(i, 2) '段落

End If

Next

Next

Set objRE = Nothing 'VBScript のオブジェクトを解放

Set objDic = Nothing 'VBScript のオブジェクトを解放

End Sub

【課題 3.8.3b】

Sub p_383b()

Range(Cells(1, 1), Cells(10, 10)) = "V" 'レンジに出力

Range(Cells(3, 3), Cells(8, 8)) = "+" 'レンジに出力

End Sub

【課題 3.8.3c1】

Sub p_383b() '最小値と平均

MsgBox WorksheetFunction.Min(Range(Cells(1, 1), Cells(5, 2)))

MsgBox WorksheetFunction.Average(Range(Cells(1, 1), Cells(5, 2)))

End Sub

Page 179: 2. Excel VBA による言語テクスト分析 - …lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/3-letras/letras...2Excel VBA による言語テクスト分析 2.1 読込 6 に回答を差し上げられるようにいたします。

2Excel VBA による言語テクスト分析

2.11 簡単なプログラミング

179

【課題 3.8.3c2】

Sub p_383b() '最小値と平均

M = Cells(1,1) '最小値の初期値

For i = 1 To 5

For j = 1 To 2

If Cells(i, j) < M Then M = Cells(i, j) '最小値

S = S + Cells(i, j) '和

Next

Next

MsgBox "Min.=" & M '最小値

MsgBox "Ave.=" & S / 10 '平均

End Sub