Excelのテキストウィザードでは、固定幅方式のデータを読むときフィールド幅をマウスで指定する。そのため
と、実務で使うには使いづらいことこの上ない。以下では、レイアウトシートが既に Excelのファイルとして提供されている場合を仮定して、データを一旦Excelに読み込んでから MID関数で分解していく操作を説明する。この方式のいいところは、人間が操作ミスする可能性が減る点。悪いところはメモリーを沢山使うところであるが、人間がミスするコストに比べたらメモリーを少しくらい多く使うくらいは無視してよい。
例題. レイアウト layout.xls に従って入力されている fixedwidth.txt を読み込む
データファイルは fixedwidth.txt と レイアウト layout.xls を用いるので、あらかじめ右ボタンクリックでダウンロードしておく。
Step 1. テキストファイルを Excelで開く
テキストファイルウィザードが起動するが、ここでは文字列として全部データを読み込んでから項目に切り分けるので、「スペースによって右または左にそろえられた固定長フィールドのデータ」を選び、2/3ではフィールドの幅を指定せず、3/3では形式を「文字列」にして読み込む。
この状態では、全てのデータがA列に、文字列として読み込まれている。A列に入っている文字列の長さが違うように見えるのは、表示に使っているフォントが文字によって幅を変えてあるフォント(プロポーショナルフォント)になっているからなので気にしなくても良い。
Step 2. ワークシートの先頭に3行空行を入れる
行の挿入を使って、ワークシートの先頭に3行空行を入れる
Step 3. B列から、レイアウトシートの内容をコピーする
貼付が終わると以下のような感じになる
Step 4. 文字列関数 MIDB を使って、A列のデータを切り分けていく(*1)
MIDB関数は、MIDB(文字列, 開始桁, 文字長)という形式で利用し、文字列の中の開始桁目から文字長切り出した結果を戻り値として返すので、2行目と3行目に入力した開始桁と桁数のデータを使って項目ごとにデータを切りだしていくことができる。
セル B4 → =MIDB($A4, B$2, B$3)
絶対参照が混じっていてちょっと分かりづらいが、これは計算式をコピーするだけで使えるようにしているから。本質は A4 に入っている文字列である
KITSUNE-FOODS 2000 435611111
の1桁目から30文字を取り出した結果をセル B4 の値にしろというだけのこと。
この計算式を A列にデータが入っている 4〜5行目にコピーすると以下のようになる
(*1)似たような操作をする関数に MID 関数というのがある。半角の英数字だけを扱っている際には MIDBと MIDは同じ動作をするが、日本語混じりのデータでは「文字」の考え方が MIDBと MIDで違うため挙動が異なる。外部からのデータが Excelと同じように文字を扱っているかどうかは自明でないので、勝手に文字を判断してしまう MIDを使うよりは、単純なバイト列としてあつかう MIDBを使って処理する方が無難なケースが多い。
Step 5. 「形式を選択して貼り付け」を使って、値に変換する
Step 4. までの操作では切り分けたように見えるデータは全て MID関数なので、そのままでは他の操作ができなくて不便。データ範囲を一旦クリップボードにコピーし、「形式を選択して貼り付け」の「値」を使って、値に変換する。
Step 6. 数値の部分は、数値形式に変更しておく
Step 5までの操作では、全てのデータを文字列としてあつかってきたが、中には数値データを含むセルもあるので変換する。ここでは売上の部分が数値。