INDIRECT関数を使用する

## はじめに
たまたま知ったINDIRECT関数。
作業手順書など作成するうえで有効だと思ったのでいろいろ試してみました。

## INDIRECT関数とは
INDIRECT関数とは、Excelで使用できる関数の一つで、文字列として提供された参照を実際のセル参照や範囲参照へ変換するために使用するとのこと。

## 実際に使ってみる
B2セルに「**テストします**」の値を入力します。

B4セルに以下の書式で入力します。


```
=INDIRECT("参照セル")
```

B4セルに「**=INDIRECT("B2")**」の値を入力します。

B2セルの値が参照され、B4セルに「**テストします**」が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/4c4b4fb2-63f7-07ea-a46c-85400bc8a94f.png)

### 参照先の値が変更されても反映されている

B2セルの値を「**テストしませんでした**」に変更します。

B4セルの値も「**テストしませんでした**」に変更されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/0dcb612f-d456-532e-479a-812ef26f79f8.png)

参照先の値と変更したい値が同一であれば、変更する手間がなくなります。

## 任意の場所で参照先を指定する
1行目のセルを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/753e7540-cc9f-f028-34e4-63a03fb4cc68.png)

1行目のセルを削除すると、B2セルがB1セルとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/3ca33415-24ac-4004-40cb-146d522ddb39.png)

B4セルもB3セルに変更となります。
B2セルを参照先としていたので、B3の値は「**0**」となってしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/7aa57922-1bec-5cb0-340b-668a2752497b.png)

### セルの値を参照し続けるためには
セルの書式を変更せずに参照するためには以下の書式を使用します。
```
=INDIRECT(ADDRESS(ROW(), COLUMN()))
```
それぞれの関数の説明は以下の通りとなります。
| 関数 | 説明 |
|:-:|:-:|
|  ADDRESS |  行番号と列番号を指定して、シート内のセルのアドレスを取得 |
|  ROW |  引数として指定された配列の行番号を返す |
|  COLUMN | 指定された セル参照の列番号を返す  |

B2セルに「**テスト再実施します**」の値を入力します。

C4セルに「**=INDIRECT(ADDRESS(ROW()-2, COLUMN()-1))**」を入力します。

C4セルに「**テスト再実施します**」が表示されたことを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/5f76966e-507a-815d-47fc-a70496058631.png)
- 「**ROW()-2**」で2つ上の行
- 「**COLUMN()-1**」で1つ左の列
をそれぞれ指定しています。



B5セルに「**=INDIRECT(ADDRESS(ROW()-3, COLUMN()))**」を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/91793bce-f37b-8680-e995-215101529204.png)

- 「**ROW()-3**」で3つ上の行
を指定しています。
行や列の指定を片方のみと指定したい場合は、指定する側のみ書式に数値を入力します。
今回の場合は行のみをしていて、列は指定していません。

## INDIRECT関数を使用する際の注意点
3行目のセルを削除すると、B5がB4となります。
B4(もともとB5)セルは3つ上の行を参照するように引数を指定していて、B1セルを参照することとなり、「**0**」という値を返しています。
今回のように行や列を削除して、指定したセルの場所に変更が生じる場合には、修正は必須であることがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/4247c719-4e9b-1baa-166d-b201f9ff8d9b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/3ce1c2a3-9acd-0404-1ec4-1527467f3ca4.png)

## セルの値が連続で入力されている場合
手順書作成時に作業時間、開始時間、終了時間を記載する必要がある場合を考えます。
### 前提
- 作業時間は作業完了時にかかった時間を手入力する
- 開始時間は一番目を手入力する
- 上記以外は手入力しないこととする

一番目であるC5セルに「**9:00**」と手入力し、開始時間を9時とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/e2ead58b-0523-59f8-f562-73332e8ab70c.png)

一番目の作業時間に10分要したとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/6d33413f-ac64-8431-93ed-328767224637.png)

終了時間が開始時間 + 作業時間である「**9時10分(9:10)**」となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/39d4cd09-3258-bf8f-8e91-f584ec29b4cf.png)

D5セルには以下の値を入力しています。
```
= INDIRECT(ADDRESS(ROW(), COLUMN()-1))+ INDIRECT(ADDRESS(ROW(), COLUMN()-2))
```

C6セルには以下の値を入力しています。
一番目の終了時間を参照し、二番目の開始時間としています。
```
= INDIRECT(ADDRESS(ROW()-1, COLUMN()+1))
```

C6セルが「**9:10**」となっていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/507fa52f-67eb-3a9d-82bc-28a53d031bd6.png)

二番目の作業時間は5分、終了時間は一番目の値と同じ値を入力します。
終了時間が「**9時15分(9:15)**」となったことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/ce701ad1-b138-6235-4911-bba86ae26758.png)

三番目の作業時間を20分、開始時間と終了時間は二番目の作業と同じ値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/e3ec2ed2-e3fb-7aff-b8d2-16fac8ef6ad5.png)

二番目の作業である6行目を削除してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/04f62398-7ff9-3e16-24f6-4f7248203355.png)

セルが連続している場合には、開始時間と終了時間が問題なく反映されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/2a1a488d-772e-1131-bd41-fefa0f100f9b.png)

作業時間を変更する必要はありますが、二番目の作業の行をコピー&貼り付けしても問題なく表示させることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091403/164d4307-8cdd-c136-774b-558ded2ec3dc.png)

## まとめ
参照先のセルに依存するのではなく、セル場所で参照できることが便利だと感じました。