本ページには広告が含まれています。

VBA Oct 関数 指定した数値を8進数の文字列に変換する

VBA Oct 関数 指定した数値を8進数の文字列に変換する

Excel VBAの「Oct 関数」について解説します。

スポンサーリンク

Oct 関数とは

Excel VBA の Oct 関数は、指定した値を 8進数(octal)文字列に変換するための関数です。
日常で8進数を扱う機会は少ないですが、数字を他の進数で扱う用途として利用されます。

Oct 関数の構文や実際の使い方について具体的に解説していきたいと思います。

Oct 関数(Visual Basic for Applications リファレンス)

スポンサーリンク

構文(引数と戻り値)

Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。

構文

Oct(number)

引数

指定項目説明
number【必須】任意の有効な数値式または文字列式を指定します

number が整数でない場合、最も近い整数に丸めてから評価されます。
number に負数を指定した場合は、2の補数表現(32bit符号付き整数)として解釈された
“8進数の文字列”が返ります。例:「Oct(-1) の結果は “37777777777”」

戻り値

number の値Oct の戻り値
NullNull
Emptyゼロ (0)
それ以外の値最大 11 桁の 8 進数*
  • 10進数の最大値 2,147,483,647 を渡すと、17777777777(11桁)が返されます。
  • 内部的には32ビット整数(Long型)の範囲(-2,147,483,648 ~ 2,147,483,647)を基準としています。この範囲を超える数値を渡すとオーバーフローエラーが発生します。

適切な範囲の数値の前に &O を付けて記述すると、値を直接 8 進数で表すことができます。
たとえば、10進数の 8 は、&O10 で 8 進数表記になります。

解説(使用例)

ここからは、サンプルを使って使用例や注意点などについて解説します。

Oct 関数の使用例

基本的な使用例(10進数→ 8進数 変換)

次の例は、InputBox に入力した数値を8進数に変換して表示します。

'■ Oct関数サンプル1(基本的な使用例)
Sub Oct_sample_01()
  Dim n As Long
  Dim result As String
  n = InputBox("8進数に変換したい数値を入力してください", _
                "10進数→8進数 変換")
  result = Oct(n)
  MsgBox "10進数 " & n & " は 8進数で " & result & " です"
End Sub

このコードを実行した InputBox と入力した結果が表示されたMsgBox画像がこちらです。

Oct_sample_01のInputBox画像
Oct_sample_01の結果を表示したMsgBox画像

Oct 関数の戻り値は数値ではなく「文字列」であることに注意してください。数値として扱いたい場合は、Clng 関数などで数値に変換する必要があります。

実用例|0〜256 をまとめて 8進数にしてシートへ出力

次の例は、アクティブシートの A列に 10進数、B列に変換後の 8進数を表示します。

'■ Oct関数サンプル2(応用例:セル値を変換)
Sub Oct_sample_02()
  Dim i As Long
  '見出し書き込み
  Range("A1").Value = "10進数"
  Range("B1").Value = "8進数(Oct)"
  '0~256をまとめて8進数に変換して出力
  For i = 0 To 256
    Cells(i + 2, 1).Value = i
    Cells(i + 2, 2).Value = Oct(i)
  Next i
End Sub

実行結果の出力例のうち、8進数の桁変化が分かりやすい行だけを表示した画像がこちらです。

Oct_sample_02のシート画像

8進数を10進数に戻す独自関数

VBAには「8進数 → 10進数」に変換する組み込み関数がないため、独自関数(OctToDec)を作って変換する例を紹介します。

'■自作関数で8進数を10進数に逆変換する
Sub Oct_sample_03()
  Dim strOct As String
  Dim result As Long
  strOct = InputBox("変換したい8進数の値は?", _
                "8進数→10進数 変換")
  result = OctToDec(strOct)
  If result = 0 And _
        Val(StrConv(strOct, vbNarrow)) <> 0 Then
    MsgBox strOct & " は 8進数ではありません!"
  Else
    MsgBox strOct & " は 10進数で " & result & " です"
  End If
End Sub
'■ 8進数を10進数に戻す関数
Function OctToDec(strOct As String) As Long
  Dim i As Long
  Dim oct As String
  Dim result As Long
  Dim digit As Long
  '文字列が全角だとValが0を返すため半角に変換
  oct = StrConv(strOct, vbNarrow)
  For i = 1 To Len(oct)
    digit = Val(Mid(oct, i, 1))
    '入力値が8進数ではない場合抜ける
    If digit > 7 Then Exit Function
    result = result * 8 + digit
  Next i
  OctToDec = result
End Function
  • 5行目:InputBoxを表示して変換したい 8進数の値を入力させます。
  • 7行目:入力値は、OctToDec関数の引数として渡されます。
  • 16行目以降:OctToDec関数で10進数に変換します。
  • 23~28行目:引数を桁毎の数値で評価し変換していきますが、8進数ではなかった場合は処理を中断し OctToDec は 0 を返します。
  • 8~10行目:OctToDec が 0 で、引数が 0 以外なら「引数が 8 進数ではない」旨MsgBoxで通知します。
  • 12行目:それ以外は、処理結果として「引数と変換後の 10 進数」をMsgBoxに表示します。
Oct_sample_03でOctToDec関数の結果表示MsgBox画像

まとめ

VBA の Oct 関数は、引数の数値を 8 進数文字列に変換して返す関数です。

返り値は 数値ではなく文字列 である点に注意が必要です。

次のような処理で使用される機会がありそうです。

  • ビット演算系の処理
  • ファイル属性の解析
  • システムプログラミング教材
  • 異なる基数の変換処理

など、数字を他の進数で扱う用途では役立ちます。

使用例の最後で「8進 → 10進」への逆変換用の独自関数を載せましたが、需要は意外とあるかもしれませんね。

VBA の Oct 関数に負数を渡すと、数学的な「負の 8進数」ではなく、
32bit 符号付き整数の 2の補数表現(ビット表現)を 8進数で返す」ということです。そのため、結果は意図しない表示になることがあります。
負数を扱わないのであれば、事前チェックして負数を許可しなくするなどの設計にする必要があると思います。

以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;幸いです(^^;

VBAの関数一覧はこちらからご参照ください。

スポンサーリンク

VBAサンプルファイルダウンロードページのご案内

このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。

ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!