特定のセルを保護して数式を隠したい

割と調べるのが面倒だったので覚えとして。ちなみに隠せるとは言っていない。

Excel for Macでしか確認してないけどWindowsでもだいたい同じはず。

# 特定のセルの内容を非表示&編集不可にする
「ツール > 保護 > シートの保護」からシートを保護するとシートを編集できなくできるが、全てのセルが編集できなくなるし数式は丸見えだしコピーもできるのであまり意味がない。

例えば、データの入力欄だけを編集可能にして、ほかは編集させない、計算の過程も隠したい、というような場合にどうするか。このような場合はそれぞれのセルに個別に設定をする。

セルに対する個別の設定は**シートの保護をする前に**行う必要がある。具体的には設定したいセル範囲を選択した上でセルの書式設定を呼び出し(Ctrl+1または⌘+1)、「保護」タブから設定する。

<img width="599" alt="スクリーンショット 2017-05-09 20.19.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/109348/60e94eb9-5938-16c9-aa4c-801f250ba84d.png">

デフォルトでは「ロック」にチェックが入っていて「表示しない」にはチェックが入っていない。ゆえに、「シートの保護」をONにするとこの設定が全てのセルに適用され、編集はできないが中身丸見えみたいな状態になる。

ロックを外せば編集可能なセルにできるし、表示しないにチェックを入れれば数式等を隠せる。

数式を隠すとこんな感じになる。

<img width="254" alt="スクリーンショット 2017-05-09 19.36.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/109348/b1093a87-b141-1b12-0937-1eacbce7c7b2.png">

隠した数式内で参照しているセルの中身を書き換えれば値も更新される。コピーもできるが、貼り付けると値になるので、数式は知られないで済む。

保護する際に一応パスワードの設定ができるので、設定しておくと**無駄な安心感**を得られる。

# シートの保護を解除する

xlsx限定の話だが、xlsxはxmlをzip圧縮しただけのものなので普通に解凍ができる。

```zsh
% unzip testbook.xlsx                                                                                                                                                                    
Archive:  testbook.xlsx
  inflating: [Content_Types].xml
  inflating: _rels/.rels
  inflating: xl/_rels/workbook.xml.rels
  inflating: xl/workbook.xml
  inflating: xl/sharedStrings.xml
  inflating: xl/theme/theme1.xml
  inflating: xl/styles.xml
  inflating: xl/worksheets/sheet1.xml
 extracting: docProps/thumbnail.jpeg
  inflating: docProps/app.xml
  inflating: xl/calcChain.xml
  inflating: docProps/core.xml
```

シートは`xl/worksheets`フォルダに入っているので、適当なエディタで開く。

```zsh
% ls xl/worksheets                                                                                                                                                                       
sheet1.xml
% vi xl/worksheets/sheet1.xml
```

そして`password`とかで検索すると

```xml
<sheetProtection password="83AF" sheet="1" objects="1" scenarios="1" />
```

みたいなタグが見つかるので、消す。または、上記の例のように`password=`に`"83AF"`を指定すればパスワードが`password`になる。

しかる後に再圧縮する。finderからやる場合は階層を間違えないように(解凍してできたフォルダを選択して圧縮するのではなく、中身のファイルを全部選択して圧縮すること)。

```zsh
% rm testbook.xlmx
% zip -r testbook_unpass.xlsx .                                                                                                                                                          
  adding: [Content_Types].xml (deflated 73%)
  adding: _rels/ (stored 0%)
  adding: _rels/.rels (deflated 65%)
  adding: docProps/ (stored 0%)
  adding: docProps/app.xml (deflated 49%)
  adding: docProps/core.xml (deflated 48%)
  adding: docProps/thumbnail.jpeg (deflated 54%)
  adding: xl/ (stored 0%)
  adding: xl/_rels/ (stored 0%)
  adding: xl/_rels/workbook.xml.rels (deflated 70%)
  adding: xl/calcChain.xml (deflated 16%)
  adding: xl/sharedStrings.xml (deflated 15%)
  adding: xl/styles.xml (deflated 71%)
  adding: xl/theme/ (stored 0%)
  adding: xl/theme/theme1.xml (deflated 78%)
  adding: xl/workbook.xml (deflated 54%)
  adding: xl/worksheets/ (stored 0%)
  adding: xl/worksheets/sheet1.xml (deflated 60%)
```

そして開く。

```
% open testbook_unpass.xlsx
```

何か怒られるかもしれない。

<img width="438" alt="スクリーンショット 2017-05-09 19.42.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/109348/b1b906be-688f-44f1-8329-a2b7fb7a9521.png">

が、無視して開くと保護はなくなっている。

<img width="230" alt="スクリーンショット 2017-05-09 19.42.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/109348/5b3a5c79-e68e-8b56-4641-bd1e8202edbb.png">

従って、シートの保護にあたってパスワードを設定してもあまり意味はない。できれば編集してほしくないという意思表示程度の効果に思っておいたほうがいい。

xlsxファイルで面倒なのは読み取りパスワードくらいで、ブックの保護や書き込みパスワードなども概ね同様の手順で解除できる(cf. [Excel の各種パスワードを突破する方法まとめ - Corredor](http://neos21.hatenablog.com/entry/2016/09/30/081709))