【コラム】

日本語で10行プログラミング

81 Excelシートの比較を行う

クジラ飛行机  [2006/11/08]

開発日誌~オープンソースカンファレンス2006 Tokyo/Fallへ出展

10月28日に、「オープンソースカンファレンス2006 Tokyo/Fall」へ出展しました。今回は、「なでしこ」の出展も行ったのですが、特にWeb開発環境「葵」を前面に出しました。

「葵」は、いま私が力を入れて開発をしているソフトで、なでしこのような日本語プログラミング言語を用いて、掲示板やWikiなどを作ることができます。今回も、いろいろな人が見に来てくださって、意見交換を行うことができました。そしてイベント後に、なでしこユーザーの方々とささやかな食事会を開きまして、なでしこの今後の活動についても話し合うことができました。

フリーソフトを作っていたり、オープンソースで開発していると、なかなか自分の開発成果をじかに発表する場所がないのですが、オープンソースカンファレンスは開発者とユーザーを結ぶ素晴らしい祭典です。終わったばかりですが、次が待ち遠しいなぁと思うのでした。

Excelシートの比較をするプログラム

さて、今回は2つのExcelシートの内容を比較するプログラムを作ってみます。

Excelには、セルの変更履歴を記録する機能がついていますが、これを利用するためには、対象のブックに対して「共有」の設定を行わなければなりません。

ですので、通常、自分の作った住所録を誰かが編集した場合、どこが編集されたのかを探すのは容易なことではありません。どこが変わったのか、いちいち2つシートを開いて見比べていくのは、とても大変です。

そこで、セルの内容を比較する簡単なプログラムを作れば、見比べていく必要がなく、瞬時に変更点を見つけることができます。

実現方法いろいろ

では、どうすれば、Excelシートの内容を比較できるのか少し考えてみましょう。

一番初めに思いつくのはこんな方法でしょうか。箇条書きにしてみます。

  1. 比較したい2つのExcel文書を開きます。
  2. 2つの文書の左上のセルから右下のセルへと順に見比べていきます。
  3. 見比べてみて、違うところがあれば、セルを赤くマーキングします。

これは、私たちが手作業で行う方法と同じかもしれません。今回10行で作るプログラムでも、この方法で比較することにします。

テキスト比較ツールを利用する方法

他にも、テキスト比較ツールを利用してExcelの内容を比較する方法があります。世の中には、テキストの比較ツールが多く存在しています。有名なものでは、UNIXに標準で用意されているコマンドのDIFFや、Windows 2000以上で用意されているFCコマンド、また、テキストエディタなどにも、比較ツールが用意されていることもあります。

しかし、Excelのファイルはテキストファイルではないので、そのままでは比較することができません。そこで、テキスト比較ツールが使えるように、一度CSVファイルなどの形式で保存しておいて、CSVファイル同士を比較します。

せっかくなので、Windows標準の比較ツールFCでファイルの内容を比較する方法を詳しく書いてみます。例えば、Excelの文書「a.xls」と「b.xls」の内容を比較してみます。

  1. 比較したい2つのファイル「a.xls」「b.xls」をそれぞれ、CSV形式で保存します。保存するには、名前を付けて保存をクリックし、保存ダイアログで「CSV(カンマ区切り)」を選択して、「a.csv」と「b.csv」という名前で保存します。
  2. 以下のようなバッチファイルを作って実行します。メモ帳に以下のコマンドを貼り付けて「比較.bat」などの名前で保存します。
fc /N a.csv b.csv
pause

違っている行付近が表示されます

これを実行すると、違っているセル近辺の情報が行番号と共に示されます。

FCコマンドに関しては、本連載の64回目で、なでしこによるフロントエンドを作成していますので、そちらも参考にしてください。

なでしこからExcelを操作する

今回作る10行プログラムでは、なでしこでExcelを起動させ、比較したい2つのExcel文書を開き、そのセルを1つずつ順に確認していくという方法を取りますので、なでしこから、Excelを操作する方法をいくつか見ていきたいと思います。

なでしこでExcelを起動するのは簡単です。一行、「エクセル起動」と書くだけです。そして、エクセルファイルを開くのも、「(ファイル名)をエクセル開く」と書くだけです。

そして、Excelのセルの内容を一括で取得するには、「(左上セル)から(右下セル)までエクセル一括取得」と書きます。こう書くと、なでしこの二次元配列形式でセルの内容を一括で取得できます。

以下は、ExcelファイルのセルA1からB50の範囲の内容を取得して画面に表示する例です。

エクセル起動。
「ファイル名.xls」をエクセル開く。
「A1」から「B50」までエクセル一括取得
それを表示。

セルに色を付ける

次に、今回は、Excelシートの内容を比較して、相違点があれば、シートを赤色にマーキングするということをしたいのです。それで、セルに色を付ける方法も見ておきましょう。

セルに色をつけるには、はじめに、「エクセル選択」命令を使って、着色したい範囲を選択します。そして、「エクセル着色」命令で選択範囲のセルに色をつけます。

以下は、セルに色を塗る例です。

エクセル起動。
エクセル新規シート。
「B2」をエクセル選択。
赤色でエクセル着色。

選択しておいてから、色を付けるという手順なので、少し使い方に戸惑うかもしれません。

10行プログラム

それでは、改めて10行プログラムの内容を箇条書きで確認しておきましょう。

  1. 比較したい2つのExcel文書を開きます。
  2. それぞれのシートについて比較したい範囲を取得しておきます。
  3. 取得した範囲について各セルの内容を比較していきます。
  4. 見比べてみて違っていればセルを赤くマーキングします。

セルを1つずつ取得して比較することもできますが、初めに比較したい範囲を取得しておいて、後から比較した方が実行速度が速くなりますので、この方法で作ってみました。

ここでは、Excelのファイル「a.xls」と「b.xls」を比較するプログラムを作りました。実際に動かしてみるには、以下の10行プログラムと同じフォルダに比較したいファイルを、「a.xls」と「b.xls」という名前でコピーしておきます。

# エクセルファイルの内容を取得する
エクセル起動。#1
母艦パス&「a.xls」をエクセル開く。#2
「A1」から「B50」までエクセル一括取得して見本セルに代入。#3
母艦パス&「b.xls」をエクセル開く。#4
「A1」から「B50」までエクセル一括取得して比較セルに代入。#5
# 内容を比較する
ROWを0から行数(見本セル)まで繰り返す。#6
  COLを0から表列数(見本セル)まで繰り返す。#7
    もし(見本セル[ROW,COL]≠比較セル[ROW,COL])ならば #8
      「{CHR((COL % 21) + ASC("A"))}{ROW}」をエクセル選択。#9
      赤色でエクセル着色。#10

1行目では、Excelを起動します。2行目では、比較元となるExcelファイル「a.xls」を開き、3行目で比較したい範囲を取得して、変数「見本セル」に代入します。

4~5行目では、比較するExcelファイル「b.xls」を開き、比較範囲を取得して、変数「比較セル」に代入しておきます。

6行目、7行目では、セルの内容を1つずつ繰り返し比較するように「繰り返す」構文を使います。繰り返す範囲は、それぞれ、字下げ(インデント)している範囲です。

8行目では、「もし」構文でセルの内容を比較しています。もし、セルの内容が違うなら、9行目以降を実行します。

9行目では、比較したセルを選択しています。セルの選択は、「A6」(A列6行目)とか「C4」(C列4行目)のようなExcel固有の形式で指定しなければならないので、ここでは、列番号を「CHR」関数を使ってエクセル形式に変換してから、セルを選択しています。

10行目では、9行目で選択したセルを赤色で塗りつぶします。

Excelシートの内容を比較し、違う部分を赤くマーキングします

改造のヒント

改造のヒントですが、まず、ここでは、「a.xls」と「b.xls」とExcelファイルの名前を固定にしてしまってますので、「ファイル選択」命令などを利用して、比較するファイルを選択できるように改造してみると、汎用的に使えるツールになると思います。

また、比較の範囲も、ここでは、「A1」から「B50」と非常に限られた範囲しか範囲にしていませんので、範囲も任意の大きさに広げてみてください。

これだけ変更するだけでも、ぐっと使いやすくなると思います。また、冒頭で紹介したFCを利用したテキスト比較も、なでしこを利用することにより、バッチファイルを書いたりしなくてもフロントエンドを作ることが出来ると思います。

Excel文書の比較は、ちょっとした折に便利に使えると思いますので、ぜひ、使いやすく改造してみてください!

    新着記事

    特設サイトの情報

    人気記事

    一覧

    イチオシ記事

    新着記事

    特別企画

    一覧