スプレッドシートのOCT2DEC関数|8進→10進の変換と#NUM!の直し方

スポンサーリンク

スプレッドシートで、サーバーの管理表やログに並ぶ「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進数メモ
771桁の最大
108桁が1つ上がる
17151×8+7
77632桁の最大
100648の2乗
644420ファイル権限の定番
755493ディレクトリ権限の定番
3777777777536,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の結果
3777777777536870911
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列:その他に書き込み
777511TRUE
775509FALSE
755493FALSE
666438TRUE
664436FALSE
644420FALSE

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版との違い(短表)

関数変換の向き結果の型詳しい記事
OCT2DEC8進→10進数値この記事
OCT2BIN8進→2進テキストOCT2BIN関数
OCT2HEX8進→16進テキストOCT2HEX関数
DECIMAL任意の基数→10進数値DECIMAL関数
BASE10進→任意の基数テキスト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とほぼ同じなので、あわせて覚えておくと便利ですね。

タイトルとURLをコピーしました