【コラム】

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

81 Excelシートの比較を行う

81/90

開発日誌~オープンソースカンファレンス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文書の比較は、ちょっとした折に便利に使えると思いますので、ぜひ、使いやすく改造してみてください!

81/90

インデックス

連載目次
第90回 10行プログラミング最終回~10行プログラミングを振り返って
第89回 フォルダ一括圧縮
第88回 テキストエディタに貼り付けたExcelの表を見やすく整形する
第87回 一発加算電卓
第86回 ブログにHTMLソースを貼れるよう変換する
第85回 カード式メモ帳
第84回 時間電卓を作る
第83回 アスキーアート地図エディタ
第82回 縦書き風テキスト作成ツール
第81回 Excelシートの比較を行う
第80回 ノルマ計算機
第79回 高速バックアップ
第78回 単語帳に読み上げ機能をつける
第77回 ホームページのバックアップツール
第76回 英単語帳を作成する(その2)
第75回 英単語帳を作成する(その1)
第74回 メモリカード挿入でデータをコピーするツール
第73回 モールス信号ソフトの作成
第72回 フォトCDランチャーを作る
第71回 残暑見舞い作成ツールを作る
第70回 画面キャプチャプログラムを作る
第69回 様々なルールに対応するビンゴシートのプログラムを作る
第68回 ビンゴカードを作る
第67回 ビンゴマシンを作る
第66回 パスワードマネージャの作成
第65回 アンドゥ機能をつける
第64回 テキストの比較ツール~FCフロントエンド
第63回 システム情報クリップ
第62回 飲み会電卓を作る
第61回 バイナリエディタの作成
第60回 メールフッタ作成ツール(その2)
第59回 メールフッタ作成ツール(その1)
第58回 プロセス監視ツールを作成する
第57回 TODOメモを作る
第56回 携帯電話をテキストリーダーに使う(2)
第55回 携帯電話をテキストリーダーに使う(1)
第54回 「オープンソースカンファレンス2006 Tokyo/Spring」に参加しました
第53回 10行でチャットソフトを作る(2)
第52回 10行でチャットソフトを作る(1)
第51回 プレゼンタイマーを作る
第50回 カラーピッカーを作る
第49回 簡単な暗号作成プログラム
第48回 お手軽データベース「SQLite」を使う
第47回 CUI(コマンドライン)環境を拡張する
第46回 デスクトップ画像を記録するプログラム
第45回 市外局番で住所を調べる検索プログラム
第44回 コマンドライン型ランチャーを作る
第43回 文字数カウンタを作る
第42回 日本語でバッチ処理
第41回 イベントドリブンと電光掲示板
第40回 なでしこでWindowsの「送る」メニューを使いやすくする
第39回 同人音楽即売会M3に参加して思ったこと
第38回 画像のサムネイル作成
第37回 なでしことExcelで行事予定カレンダーを作ろう
第36回 なでしことExcelで月間カレンダーを作ろう!
第35回 なでしことExcelで年間カレンダーを作ろう
第34回 急な電話にも安心、意外と便利な「手書きメモ」
第33回 携帯電話のアドレスデータを取り出す
第32回 記念日カウンターを作る
第31回 顔文字入力支援ソフト
第30回 アスキーアートのためのエディタ
第29回 HTTPサーバーを作る
第28回 手紙のあいさつ文を作成するプログラム
第27回 ギターコードの構成音を表示
第26回 音楽の再生スピードを変える
第25回 ミニスライドショーを作る
第24回 撮影日で写真を振り分け
第23回 PSP用テキスト画像の作成
第22回 金種計算
第21回 パスワードを自動生成
第20回 携帯メールでWEBを更新する
第19回 時間の使い方を反省するプログラム
第18回 ウェブを画像でキャプチャ
第17回 ラーメンタイマーを作る
第16回 画像のトリミングツール
第15回 ごみの分別カレンダー
第14回 デスクトップ検索ツール
第13回 フォント見本帳
第12回 セピア調の画像ビューワー
第11回 健康チェック
第10回 10行で壁紙にらくがきする
第9回 WEBサイトの更新チェッカー
第8回 WEBページのリンク切れをチェック その2
第7回 WEBページのリンク切れをチェック
第6回 音楽ファイルの整理 - メディアタグから自動フォルダ分類
第5回 請求書の自動作成・印刷~Word連携技
第4回 重要データのバックアップ術
第3回 10行ニュースリーダーを作ろう!
第2回 なでしことは その2
第1回 なでしことは? その1

もっと見る

人気記事

一覧

イチオシ記事

新着記事