365日Excelの強制終了に苦しむ非エンジニアが、お気持ちだけのテクニックを詰め込んでみる


# はじめに

こんにちは、こんばんは。
[Livesense - 関 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/livesense-kan)の23日目とかいうわりと期待値高そうな枠を取ってしまった7404と申します。
どうぞお手柔らかによろしくおねがいします。


## 今回のテーマはExcel、君に決めた！
昨年はSpreadsheetだったので、ちょっと原点に帰りたいと思います。

みなさま、Excelの動作の重さで苦しんだことはありますか？
私は365日苦しんでいますよ～
しかし、苦しいのはExcelも一緒なのかもしれません。
同じ結果が出るものでも、工程や関数を変えれば軽くなることが多々あるのではないかと思い、今回この記事を勢いで書いてみることにします。
Excelを守ることで自分も守りましょう :point_up:


### その1 Excelを守るための3つのルール

まずは、「テクニック」というより、守りたい「ルール」について書きたいと思います。
特に人と共有するためのファイルは、以下の3つを意識すると、ステキエクセルライフが送れると思います。

#### 1. 関数として残しておく必要がないものは値化する。

データ加工時に作業ファイルを「どう処理したのか？」を表すためにも、関数残して保存しがちなのですが、
データ量によっては関数入れっぱなしのファイルは地獄を見ることになります。
作業続行して、ﾌﾘｰｽﾞｼﾀ…ﾎｿﾞﾝｼﾃﾅｲ…ﾔﾊﾞｲ。って経験ありませんか？
必要がなければ、値貼り（関数）、もしくは、一行目のみ関数を残し保存するなどしてExcelを労りましょう。


#### 2.データ処理中「折り返して全体を表示する」はOFF
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146336/8106c309-ba2f-30c6-33ec-2ace6e796bd3.png)

この「折り返して全体を表示する」なのですが、
ざっくり説明すると、この機能は、「行高を文字列の長さに合わせて自動調整をしてくれるもの」です。
いちいちこちらで文字量に合わせてサイズを変更しなくても、Excelがお察ししてサイズ調整を行ってくれる便利な機能です。

例えば、以下の画像Aが「折り返して全体を表示する」がONになっている状態のものです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146336/6f677e3b-e3b5-5885-8e13-7f0f0f9019ee.png)

見栄えのことをかんがえたらAのほうが読みやすいし、人に渡す資料としては適してるかもしれません、が、
「折り返して全体を表示する」のまま、ファイルを開いたり関数を入れたりすると、
更新のたびにセルの行高の自動調整が入ってしまい、やたらデータ処理に時間がかかります。
作業時はBの「折り返して全体を表示する」をOFFにした状態にすることをオススメします。

#### 3. Excelの便利機能、特に「条件付き書式」を使いすぎない。

2と同じで、見栄えを考えると重複をわかりやすくしてくれたり数値の色を変えられたり便利な機能ではあるんですが、
使えば使うほどファイルサイズが重くなります。
行列をコピーして設定した覚えないセルにも設定されてるときがあるので、
動作が鈍くなったら、条件付き書式の「ルールの管理」、または、「ルールのクリア」から不必要な設定はないか見直しましょう。
私はこの機能で重複確認…は、よほどのことがない限り使いません。

意外とわすれがち＆基本的なことだけピックアップしてみました。
無駄にフォントや色を増やさない、意味もなく昔の保存形式を選ばない（.xls形式。互換性調整でむちゃくちゃ重くなります）、
シートを増やし過ぎない、非表示行列を増やさない…なんてことも大事だと思います。
レッツエンジョイ快適エクセルライフ :muscle::innocent::sparkles:





### その2 気持ちばかりのExcelテクニック集
この作業は重いものと諦めていませんか。
同じ結果になるなら軽い関数・手順選びたいよね！？…ということで、いくつか軽めにご紹介、検証します。
色々な手段を知ってると、自分の選択肢が増えるのでよりステキエクセルライフをすごせるとおもいますので、お役に立てれば幸いです。

#### ◆ VLOOKUPとINDEX＋MATCHとOFFSET＋MATCH、どれが軽いのか問題

漠然と「VlookupとCountifは重い」と都市伝説のように聞くのですが、
**「重い」のは当たり前、諦める…って方少なくないのではと思います。**
今回、風のうわさでVlookupより、INDEX＋MATCHや、OFFSET＋MATCHのが軽いって聞いたので、
実践してみました。

ごらんください、ドン。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146336/a33adb8b-fa25-b6e0-c83f-1ccb44e78203.png)


**結論：特に変わらなくて筆者が凹む。**

（※ .xlsxと.xlsbで若干容量の差があるよ。っていうのをチラ見せ。でも保存方法の違いについては、Excel/バイナリとcsv/テキストの違いを理解してれば問題ないです。）


:star:使用した関数。（A3中なっちを検索値、B3に関数が入ってる）

| 種類       |関数 | 
|:-----------------|:------------------|:------------------:|
| VLOOKUP         | =VLOOKUP($A3,master!$A:$J,2,0) | 
| INDEX＋MATCH     |=INDEX(master!$A:$J,MATCH($A3,master!$A:$A,0),2) |
|OFFSET＋MATCH|=OFFSET(master!$A2,MATCH(A$3,master!$A$3:$A$43,0),1)|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146336/fee5be45-c6d0-e11d-de57-1b63ea427c9b.png)


で、でも使い分けるメリットはあるのではないでしょうか。

Vlookupは検索値が含まれる列より左の値は引っ張ってこれないし、
最初からうまい具合にVlookupをすんなり使えるケースって結構珍しいと思うのです。
列を移動したり、または、増やして調整したり…ってことを考えると、INDEX＋MATCHのがメリットあるのかなぁとあくまで個人的には思います。
それこそ10万行のデータが元になるなら別の方法を取りたいです。
（例えば、CSV化して10万の中で必要ないデータは削除した上で使うとか。ぐぐってみると結構色々方法ある）
もしこの関数のが軽いよっていう情報をお持ちの方は教えて下さい。

追記：[【奥義】大量データでの高速VLOOKUP](http://excel-ubara.com/excel3/EXCEL019.html) のやり方おすすめです（おせわになってます:blush:）


#### ◆ 全然テクニック紹介じゃなかったので、プチVlookup手抜き術:bow:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146336/1897c715-5afe-b51a-d98b-21c4f06399ef.png)

こちらA5以下の鞘師里保ちゃん（意図せずお肉のランク付けみたいになった）ですが、
それぞれ少しずつ関数を変えてデータを持ってきています。
元データのシートがばらけていて、シート範囲を選択したり、列番号選択したりが
めんどくさいときに使えます。割りと使ってる方は居るはず。


| 関数を入れたセル       |関数 | 
|:-----------------|:------------------|:------------------:|
|B5        | =VLOOKUP($A5,master!$A:$J,B$3,0) | 
|B6     |=VLOOKUP($A6,master!$A:$J,COLUMN(),0) |
|B7|=VLOOKUP($A7,INDIRECT($B$2&"!A:Z"),COLUMN(),0)|

…はい。予め検索値を入れたセルを参照セルとして組み込む方法です。
これならいちいち検索値や範囲(B7の関数)を変えなくて済みます。
今回は元のマスターデータとvlookupを入れたシートの列の並びが一緒なので、
そのままCOLUMN関数で抜き出せてるんですが、
別であれば、元のマスターデータに数値を入れてhlookupで引っ張った上でvlookupを入れてます。

また、参照シートが変わってめんどくさいときはINDIRECTで指定してしまうのが有効だと思います。
他にも、hlookup＋ROWなど組み合わせで覚えると、関数をコピペするだけで、行番号を変える手間もなくなるので、いろいろチャレンジしてみてくださいね。


# おわりに

唐突に締めます。長々と申し訳ございませんでした。
自分を苦しめない＆Excelを苦しめない術が少しでも見つかれば幸いです。
（ファイルサイズ軽くならなくてすみません）

~~他にもCOUNTIFSがおもすぎるときは昇順で並び替えてIF関数使ったり、列範囲全選択をCOUNTAで補うとか、フィルタしたまま行削除すると固まる問題はセルの文字列を消した上で、フィルタ解除して昇順ソートかけて空白セルから一気に行削除すると固まらないよ、とか、日別集計で複雑な集計でなければピボットテーブル使ったほうが楽だよとか、色々書きたかったんですが、Excelの前に私の背中と腰がやられてしまったので、今年はこれで終わりにします。~~ :hospital: :runner: 

OFFSET,INDIRECT,ROW,COLUMNはあわせ技として使えるようになるとすごく便利なんですが、
人に教えるのがちょっと難しかったり、必要性をあわせて説明することを考えると浸透しにくい関数のように感じています。
背中と腰が治り次第、積極的にお伝えしていこうと思います。

それでは、少し早いですがメリークリスマス :santa: :bomb: 




:pear:  宣伝 :pear:

偶然にも本日23日の弊社アドベントカレンダーの他のテーマの担当が、
前同じグループに所属していた私の元上司とからあげさんなので、
他のカレンダーもよろしくお願いします。

[Livesense - 学 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/livesense-gaku)
[Livesense - 自 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/livesense-ji)