jump to navigation

n進数とアルファベット26進 2012/08/13

Posted by dbot in VBAのメモ.
trackback

VBAのメモ
ただし、Execl2000、VB6.0、参考資料VBforExecl97用

10進数と16進数の変換手順でアルファベット26進を変換しようとしたらグダグダになったので整理

以下、わかり難い説明

Execlの列は通常アルファベットで表示されます。
A列は1列目、B列は2列目・・・Z列は26列目という意味です。
アルファベット(A~Z)26文字を組み合わせて表示する26進とも言えます。

20120806001 

1.n進数
普段使っているのが10進数
コンピュータ関係で馴染みがあるのは2進数、16進数

10進数(Dec):0,1,2,3,4,5,6,7,8,9の10種類を組み合わせて表示する数値。
2進数(Bin):0,1の2種類を組み合わせて表示する数値。
16進数(Hex):0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,Fの16種類を組み合わせて表示する数値。

10進数では9に1加算すると10です。10進数の最大数9に1加算することにより、桁上がりが発生し2桁の数値10となります。
16進数では9に1加算するとA(10)です。16進数の最大数F(15)に1加算することにより、桁上がりが発生し2桁の数値10(16)となります。

(1)10進数を16進数に変換する手順
変換したい数を16で割り、その余りを下位1桁とする。
商が0で無い場合は、商を16で割り、その余りを下位桁から並べ、商が0となるまで繰り返す。

10進数(Dec)1265の16進数(Hex)変換

1265 ÷16= 商79 ・・・余1 下位1桁:1
79 ÷16= 商4 ・・・余15→F 下位2桁:F
4 ÷16= 商0 ・・・余4 下位3桁:4
    商0で終了   下位4桁:0

16進数(Hex)では04F1となります。

 

(2)16進数を10進数に変換する手順

その前に、10進数の数字を各桁で分解するとこんな感じになります。

10進数(Dec)1265

1 2 6 5  
千の桁 百の桁 十の桁 一の桁  
(下位4桁:10^3) (下位3桁:10^2) (下位2桁:10^1) (下位1桁:10^0) 桁の重み
 
1×1000 2×100 6×10 5×1 合計1265

10^3は10の3乗の意味。n^1(nの1乗)はn、n^0(nの0乗)は1
この分解がそのまま16進数にも当てはまります。これがそのまま10進数への変換となります。

16進数(Hex)04F1の10進数変換

(下位4桁:16^3) (下位3桁:16^2) (下位2桁:16^1) (下位1桁:16^0) 桁の重み
0 4 F 1  
各桁を10進数化
0 4 15 1  
重みを掛ける
0×4096 4×256 15×16 1×1 合計1265

 

2.アルファベット26進数化

(1)アルファベット1桁(A~Z=1~26)に制限した場合

数値(1~26)をアルファベット(A~Z)に置き換える記述
Chr(Val(Asc("A")-1 + 入力数値))

アルファベット(A~Z)を数値(1~26)に置き換える記述
Asc(入力アルファベット)-Asc("A")+1

Acs:指定された文字列の頭1文字の文字コードを数値として返却する。
Val:指定された文字列を数値データとして扱う。
(入力数値が文字列扱いでも処理するための記述、必須ではない)。
Chr:指定された数値を文字列として扱う。

アルファベットA~Zは連続した文字コード。
アルファベットに置き換える場合は
"A"の文字コードを数値データとして扱い、入力数値を加算。結果を文字列として返却する。
数字に置き換える場合は、"A"の文字コードとの差を返却する。
"A"が1の扱いです、それぞれ-1+1が必要になります。 ("A"が0扱いの場合、不要)

(2)アルファベット複数桁を想定した場合
さて問題はアルファベットが複数桁になることを想定した時です。
10進16進変換の方法を参考にアルファベットから10進数への変換は上手くいきましたが、
10進数からアルファベットに変換すると上手くいきません。
入力数値を26で割って、余りを下位桁から並べていく。商を再び26で割るを繰り返す。

入力26→26÷26=商1余り0、結果"A@"

"@"は"A"の一つ前の文字コード、つまり0を表示しようとしています。
正解はどうみても"Z"です。
えーと、26で割った場合、余りは0~25なのです。
この結果残念となりました。

さてアルファベット26進では0に相当する文字がありません、A=1から始まります。
また最大数Zは26、26進数ですが26ではアルファベットZでは1桁です。
桁上がりが発生するのは27、アルファベットAAとなります。
桁上がりするタイミングが、n進数と比べると1つずれるのです。

26で割る値を-1してから割ることで解決しました。(商が0になるまで繰り返す。は変わらず)
これにより余り0(本来の余りは1)はA、余り25(本来の余りは0)はZと処理することになります。
また「商」は本来の余り0の場合に商が1ずれますが、これが桁上がりのずれとなります。

では、逆にアルファベットから数値に置き換える場合、そのままで問題ないのか。
えーと、アルファベットAは1、Zは26で処理してるので問題ないのです。

多分きっと合っている。

広告

コメント»

No comments yet — be the first.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。