Tips: 固定幅方式のデータを Excelに読み込んでから切り分ける

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列から、レイアウトシートの内容をコピーする

  1. レイアウトシートlayout.xlsを開き、項目名、開始桁、桁数の列データ(この場合は C2:D4)をコピーする
  2. データを読み込んだワークシートを選択して、セル B1をアクティブセルにする
  3. 形式を選択して貼り付け を使って 「値」「行と列を入れ替える」を使って貼り付ける

貼付が終わると以下のような感じになる

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 関数というのがある。半角の英数字だけを扱っている際には MIDBMIDは同じ動作をするが、日本語混じりのデータでは「文字」の考え方が MIDBMIDで違うため挙動が異なる。外部からのデータが Excelと同じように文字を扱っているかどうかは自明でないので、勝手に文字を判断してしまう MIDを使うよりは、単純なバイト列としてあつかう MIDBを使って処理する方が無難なケースが多い。

Step 5. 「形式を選択して貼り付け」を使って、値に変換する

Step 4. までの操作では切り分けたように見えるデータは全て MID関数なので、そのままでは他の操作ができなくて不便。データ範囲を一旦クリップボードにコピーし、「形式を選択して貼り付け」の「値」を使って、値に変換する。

Step 6. 数値の部分は、数値形式に変更しておく

Step 5までの操作では、全てのデータを文字列としてあつかってきたが、中には数値データを含むセルもあるので変換する。ここでは売上の部分が数値。

  1. どこでもいいので、空いているセルに 1 を入力する。ここでは セル A1 が空いているので使う
  2. セル A1を Ctrl + C (メニューからコピーを選んでもよい)でクリップボードにコピーする
  3. 数値に変換したい範囲を選択する
  4. 「形式を選択して貼付」を使い、「値」をはり付け、演算として「乗算」を選択する。要するに、選択範囲範囲に1をかける。この操作では1をかけているので値は変わらないが、乗算を行うので結果は数値となる