スプレッドシートで、サーバーの管理表やログに並ぶ「755」「644」のような8進数を10進数に戻したい。そんなときに使うのがOCT2DEC関数です。結論から言うと、=OCT2DEC("755") と書けば 493 が返ります。
ただ、実際のデータを流し込むと、思わぬ結果に出会うことがあります。
- 「8」や「19」が混ざっていて
#NUM!が出た 7777777777を変換したら -1 になった- 空白の行だけ
#VALUE!になった
どれも関数の仕様どおりの動きで、入力側を少し整えれば直せます。放っておくと、エラーの原因がわからないまま手作業で直すはめになりがちです。
この記事の主な値は、Googleスプレッドシートの実機で確かめたもの。計算で求めた例には、その旨を添えています。書き方・入れ方別の結果・負の数の読み方・権限値の判定・エラーの直し方の順に見ていきましょう。
10進数から8進数への逆変換は、DEC2OCT関数の記事で解説しています。
スプレッドシートのOCT2DEC関数の書き方(=OCT2DEC(“755”)は493)
=OCT2DEC("755") の結果は 493。7×64+5×8+5=493 という計算です。OCT2DEC(オクト・ツー・デック)は、Octal(8進)to Decimal(10進)の略。8進数を10進数の数値に変換します。
構文と引数(引数は1つだけ・最大10桁)
=OCT2DEC(8進数)
| 引数 | 必須 | 内容 |
|---|---|---|
| 8進数 | 必須 | 0〜7の数字だけで書いた値。最大10桁。文字列でも数値でもよい |
結果の範囲は -536,870,912〜536,870,911 です。OCT2BINやOCT2HEXにある「桁数」の引数はなく、渡すのは変換したい値だけ。10桁を超えると、先頭を0で埋めただけの値でも #NUM! になります。
結果は文字列ではなく数値で返ります。=ISNUMBER(OCT2DEC("755")) は TRUE なので、そのまま足し算や比較に使えますね。
8進数と10進数の対応(短表)
| 8進数 | 10進数 | メモ |
|---|---|---|
| 7 | 7 | 1桁の最大 |
| 10 | 8 | 桁が1つ上がる |
| 17 | 15 | 1×8+7 |
| 77 | 63 | 2桁の最大 |
| 100 | 64 | 8の2乗 |
| 644 | 420 | ファイル権限の定番 |
| 755 | 493 | ディレクトリ権限の定番 |
| 3777777777 | 536,870,911 | 正の最大値 |
17・644・755・3777777777 は実機の結果、それ以外は計算で求めた値です。桁が1つ増えるごとに、1桁の重みは8倍になります。3桁の最大は 777 で、10進数にすると511。
セル参照・ARRAYFORMULAでまとめて変換する
A2に8進数が入っているなら、セル参照で渡すだけです。
=OCT2DEC(A2)
列ごと変換するなら、ARRAYFORMULAとの組み合わせが手軽です。ただし空白セルを渡すと #VALUE! になるので、空行はIFで外しておくと安心でしょう。
=ARRAYFORMULA(IF(A2:A20="", "", OCT2DEC(A2:A20)))
入れ方で結果は変わる?文字列・数値・先頭ゼロ・空白
公式ヘルプに書かれているのは、「数値でも文字列でも変換できる」「0〜7以外の数字は #NUM!」の2点だけです。では、先頭ゼロや空白、小数、スペースまじりの値はどうなるのか。実機で確かめた結果を一覧にしました。
入れ方別の結果一覧(実機値)
| 入れ方 | 式の例 | 結果 |
|---|---|---|
| 文字列 | =OCT2DEC("755") | 493 |
| 数値 | =OCT2DEC(755) | 493 |
| 先頭ゼロ付きの文字列 | =OCT2DEC("0755") | 493 |
| 先頭ゼロ付きの数値 | =OCT2DEC(0755) | 493 |
| セル参照(数値755/文字列”0755″) | =OCT2DEC(A1) | 493 |
| 0埋めで11桁 | =OCT2DEC("00000000755") | #NUM! |
| 空白セル | =OCT2DEC(A1)(A1が空) | #VALUE! |
| 空文字 | =OCT2DEC("") | 0 |
| 論理値 | =OCT2DEC(TRUE)/FALSE | #VALUE! |
| 小数 | =OCT2DEC(7.5)/"7.5" | #NUM! |
| 前後・途中のスペース | " 17 "/"7 5" | #NUM! |
| マイナス記号付き | "-17"/-17 | #NUM! |
| 8・9・英字を含む | "8"/"19"/"abc" | #NUM! |
数値でも文字列でも同じ。気をつけるのは空白と記号
数値で渡しても文字列で渡しても、結果は同じ493でした。8進数の 0755 と 755 は同じ値なので、先頭のゼロが落ちても結果は変わりません。
「数値で渡すと #VALUE! になる」「先頭ゼロが消えて危ない」と心配する必要はないわけです。むしろ気をつけたいのは、次の3点。
- 空白セルは #VALUE!、空文字 “” は 0。見た目は同じ空欄でも結果が分かれる
- 0埋めは10桁まで。11桁にすると、値が小さくても #NUM!
- 小数・スペース・マイナス記号は、#VALUE! ではなく #NUM! になる
3つ目は、エラーの種類から原因を絞るときに役立ちます。今回試した範囲では、#VALUE! は空白セルか論理値のとき。#NUM! は中身の文字や桁数が原因でした。
7777777777が-1になる理由(10桁の負の数)
先頭が4〜7の10桁は負の数として読まれる
OCT2DECは、10桁の8進数を「符号付き」として読みます。公式ヘルプによると、引数は30ビットの符号付き8進数です。最上位ビットが符号を表し、負の数は2の補数で書かれます。
8進数の1桁は3ビットぶん。そのため10桁目が4〜7だと最上位ビットが1になり、負の数として返ってきます。
| 8進数(10桁) | OCT2DECの結果 |
|---|---|
| 3777777777 | 536870911 |
| 4000000000 | -536870912 |
| 7777777533 | -165 |
| 7777777634 | -100 |
| 7777777776 | -2 |
| 7777777777 | -1 |
表はすべて実機の結果です。先頭が0〜3の10桁や、9桁以下の値は、仕組み上は正の数になります。
読み方のコツは、「符号なしの値から1,073,741,824(2の30乗)を引く」こと。たとえば DECIMAL("7777777777",8) は、符号を考えずに 1073741823 を返します。ここから1,073,741,824を引くと、OCT2DECの結果と同じ -1 です。
DEC2OCTで往復して確かめる
負の数が出てきて不安なときは、逆関数のDEC2OCTで戻してみましょう。
=DEC2OCT(-100) → 7777777634
=OCT2DEC(DEC2OCT(-100)) → -100
往復して元の値に戻れば、変換そのものは合っています。10桁の負数がどう作られるかは、DEC2OCT関数の記事で出力側から詳しく説明しました。
逆に「負にせず、そのままの大きさで読みたい」場面もあるはず。その場合はOCT2DECではなく、後半で紹介するDECIMAL関数を使います。
実務例:8進の権限値を10進に戻してBITANDで判定する
LinuxやUnixのファイル権限は、755や644のような3桁の8進数で書かれます。左から「所有者・グループ・その他」を表し、各桁は読み取り4・書き込み2・実行1の合計です。
書き込み権限があるかをTRUE/FALSEで出す
「その他ユーザー」の書き込みは、10進に戻した値の「2」のビットに当たります。そこでBITAND関数を使い、2のビットが立っているかを調べましょう。
=BITAND(OCT2DEC(A2), 2) > 0
| A列:権限値 | B列:=OCT2DEC(A2) | C列:その他に書き込み |
|---|---|---|
| 777 | 511 | TRUE |
| 775 | 509 | FALSE |
| 755 | 493 | FALSE |
| 666 | 438 | TRUE |
| 664 | 436 | FALSE |
| 644 | 420 | FALSE |
755と777は実機の結果で、BITANDの値はそれぞれ0と2でした。ほかの行は計算で求めた値です。755は所有者だけが書き込める設定なので、その他の書き込みはFALSEになります。
グループとその他をまとめて調べたいときは、2つ目の引数に OCT2DEC("022")(=18)を渡します。
=BITAND(OCT2DEC(A2), OCT2DEC("022")) > 0
644ならBITANDの結果は0で、グループにもその他にも書き込み権限がないとわかります。
この判定列は、3〜4桁の正の権限値で使ってください。10桁の負の数(先頭が4〜7)を渡すと、BITANDが負の数を受け付けず #NUM! になります。
戻り値は数値なのでSUM・比較・VLOOKUPにそのまま使える
OCT2DECの結果は数値です。一方、同じ8進系のOCT2BINやOCT2HEXはテキストを返します。たとえば OCT2HEX("17") は “F”、OCT2BIN("17") は “1111” というテキストでした。
数値で返るおかげで、次のような使い方がそのままできます。
=OCT2DEC(A2) = OCT2DEC("0644")
=VLOOKUP(OCT2DEC(A2), 権限マスタ!A:B, 2, FALSE)
=SUM(ARRAYFORMULA(IF(A2:A20="", 0, OCT2DEC(A2:A20))))
1行目は、「644」と「0644」の表記ゆれをそろえて比べる例です。どちらも420になるので、A2が644ならTRUE。2行目は10進の値をキーにしたマスタから、権限名を引いています。
3行目のSUMは、8進で記録されたコード値などを合計したいときの形。空行は0として足すようにしています。
エラーの直し方と10桁を超えるときのDECIMAL
#NUM!・#VALUE!の原因と直し方(早見表)
| 症状 | 主な原因 | 直し方 |
|---|---|---|
| #NUM! | 8・9・英字が混ざっている | 元データを確認する。8進数でない値は変換できない |
| #NUM! | 前後や途中にスペースがある | SUBSTITUTE(A2," ","") で取り除いてから渡す |
| #NUM! | 0埋めで11桁以上になっている | REGEXREPLACE(A2,"^0+","") で先頭の0を外す |
| #NUM! | 0埋め以外で11桁以上 | DECIMAL(A2,8) に切り替える |
| #NUM! | 小数・マイナス記号付き | 元の値の書き方を見直す |
| #VALUE! | 空白セルを参照している | IF(A2="","",OCT2DEC(A2)) で空欄を外す |
| #VALUE! | TRUE/FALSEを参照している | 参照先の列がずれていないか確認する |
先頭の0を外す式は、A2がテキストのときに使う形です。すべて0の値なら空文字になりますが、OCT2DEC("") は0を返すので問題ありません。
大量のデータを流す前に、8進数として正しいかを先にチェックしておくのも手です。
=REGEXMATCH(TO_TEXT(A2), "^[0-7]{1,10}$")
A2が数値の755のとき、TO_TEXT を付けた式はTRUEを返しました。数値のセルをREGEXMATCHへそのまま渡すと #VALUE! になるので、TO_TEXTで包むのがポイントです。
10桁を超える8進数はDECIMAL(…,8)で変換する
OCT2DECで扱えない値は、DECIMAL関数で変換できます。第2引数に基数の8を指定する形です。
=DECIMAL("755", 8) → 493
=DECIMAL("7777777777", 8) → 1073741823
=DECIMAL("17777777777", 8) → 2147483647
DECIMALは符号を読まないので、7777777777 も負の数になりません。11桁の 17777777777 もそのまま変換できました。使い方の詳細はDECIMAL関数の記事をどうぞ。
10進数を8進数以外の基数に戻したいなら、BASE関数が対になります。
OCT2BIN・OCT2HEX・Excel版との違い(短表)
| 関数 | 変換の向き | 結果の型 | 詳しい記事 |
|---|---|---|---|
| OCT2DEC | 8進→10進 | 数値 | この記事 |
| OCT2BIN | 8進→2進 | テキスト | OCT2BIN関数 |
| OCT2HEX | 8進→16進 | テキスト | OCT2HEX関数 |
| DECIMAL | 任意の基数→10進 | 数値 | DECIMAL関数 |
| BASE | 10進→任意の基数 | テキスト | BASE関数 |
ExcelにもOCT2DEC関数があり、引数が1つという構文は同じです。ただ、空白や文字列の細かな扱いまで同じとは限りません。Excelで使うときは、ExcelのOCT2DEC関数の記事で確かめてください。
よくある質問
Q. 先頭にゼロが付いた8進数は、そのまま渡してよい?
A. 問題ありません。”0755″ でも 0755 でも、結果は493でした。ただし0埋めで11桁になると #NUM! なので、桁数だけは10桁以内に収めましょう。
Q. 数値で渡すと #VALUE! になると聞いたけれど?
A. 実機では、数値の755も文字列の”755″も493でした。#VALUE! が出たのは、空白セルとTRUE/FALSEを渡したときです。
Q. 10進数にした値を、8進数に戻すには?
A. DEC2OCT関数を使います。結果はテキストで返るので、計算に使うならOCT2DECで戻した数値のほうが扱いやすいですよ。
まとめ
OCT2DECは、8進数を10進数の数値に戻す関数です。押さえたいポイントを整理します。
=OCT2DEC("755")→ 493。引数は1つで、最大10桁- 数値・文字列・先頭ゼロ付きは同じ結果。空白セルとTRUE/FALSEは #VALUE!、”” は0
- 8・9・英字・小数・スペース・マイナス記号・11桁は #NUM!
- 10桁で先頭が4〜7なら負の数(7777777777 → -1)
- 負にしたくない値や10桁を超える値は
DECIMAL(…,8)で変換する - 結果は数値なので、BITANDの権限判定や比較・VLOOKUPにそのまま使える
つまずきの多くは、関数ではなく入力側にあります。#NUM! なら中身の文字と桁数、#VALUE! なら空白と論理値を疑うのが近道です。
ほかの基数から10進数に戻したいときは、16進数ならHEX2DEC関数、2進数ならBIN2DEC関数が使えます。書き方はOCT2DECとほぼ同じなので、あわせて覚えておくと便利ですね。
