- 締切済み
Excelで文字列を独自の二進数で表したい。
A,B,C,D,Eのいずれかを含む文字が順不同でセルに入っているものから、 A=10000 B=1000 C=100 D=10 E=1 と置換して足した、二進数であらわしたり、逆にその二進数から文字列に戻したりしたいです。 (例:DAなら10010、EBCなら1101) VBAの自作関数を含めてExcelの関数でできる方法があればお教えくださると助かります。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
当方も >>DAとADはおなじ「10010」になる、つまり順番は関係ないとの前提です。 >>また、AAとかEEとか22222とかのチェックやA-E以外の文字のチェック、もしていません。 B1セルに入力するとして 文字→数値 =SUMPRODUCT(10^(69-CODE(MID(B1,ROW(A1:INDEX(A:A,LEN(B1))),1)))) 数値→文字 =IF(INT(B1/10^4),"A","")&IF(MOD(INT(B1/10^3),10),"B","")&IF(MOD(INT(B1/10^2),10),"C","") &IF(MOD(INT(B1/10),10),"D","")&IF(MOD(B1,10),"E","") 両方あわせると =IF(B1="","",IF(ISNUMBER(B1), IF(INT(B1/10^4),"A","")&IF(MOD(INT(B1/10^3),10),"B","")&IF(MOD(INT(B1/10^2),10),"C","") &IF(MOD(INT(B1/10),10),"D","")&IF(MOD(B1,10),"E",""), SUMPRODUCT(10^(69-CODE(MID(B1,ROW(A1:INDEX(A:A,LEN(B1))),1))))))
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 双方向可能です。しかし、整数のみです。 例: MsgBox ConvChr2Dec(ConvChr2Dec(22221)) '------------------------------------------- Function ConvChr2Dec(ByVal myVal As Variant) Dim sData As Variant Dim fData As Variant Dim i As Integer Dim j As Integer Dim ret As Variant Dim buf As Variant sData = Array("A", "B", "C", "D", "E") fData = Array(10000, 1000, 100, 10, 1) If VarType(myVal) = vbString Then ret = 0 For i = 1 To Len(myVal) For j = LBound(sData) To UBound(sData) If StrComp(Mid(myVal, i, 1), sData(j), 1) = 0 Then ret = ret + fData(j) End If Next j Next i ElseIf IsNumeric(myVal) Then ret = "" buf = myVal For j = LBound(fData) To UBound(fData) i = buf \ fData(j) ret = ret & String(i, sData(j)) buf = buf Mod fData(j) Next End If ConvChr2Dec = ret End Function
- cistronezk
- ベストアンサー率38% (120/309)
マクロは以下が一例です。 なお、DAとADはおなじ「10010」になる、つまり順番は関係ないとの前提です。 また、AAとかEEとか22222とかのチェックやA-E以外の文字のチェック、もしていません。 'ABCDEを11111に変換します Function Str2MyBin(ByVal binstr As String) As Long Dim i As Integer binstr = UCase(binstr) For i = 1 To Len(binstr) Str2MyBin = Str2MyBin + 10 ^ (4 - (Asc(Mid(binstr, i, 1)) - Asc("A"))) Next End Function '11111をABCDEに変換します Function MyBin2Str(ByVal mybin As Long) As String Const EA_STR As String = "EDCBA" Dim i As Integer, binstr As String binstr = CStr(mybin) For i = Len(binstr) To 1 Step -1 If Mid(binstr, i, 1) = "1" Then MyBin2Str = MyBin2Str & Mid(EA_STR, i, 1) Next End Function
- KURUMITO
- ベストアンサー率42% (1835/4283)
式は多少長くなりますが次のような式でもよいでしょう。 =IF(ISNUMBER(FIND("A",A1)),10000,0)+IF(ISNUMBER(FIND("B",A1)),1000,0)+IF(ISNUMBER(FIND("C",A1)),100,0)+IF(ISNUMBER(FIND("D",A1)),10,0)+IF(ISNUMBER(FIND("E",A1)),1,0)
お礼
なるほど、該当がないときのエラー値で困っていましたが、ISNUMBERをかませればよいのですね。ありがとうございます。
お礼
遅くなりすみません。 1、UCaseで大文字変換 2、1から文字数までのfor文で文字列のi番目を取得 3、ASCで文字コードにして、コードのAからの数の差を取得、 4、Aが4桁になるように10をn乗して足し合わせ 1、変換する文字を入れた文字列を与えて 2、CStrで文字列型 3、1から文字数までのfor文 4、i番目が1なら、文字列から値をとってきて入れる ですね。 大変シンプルにまとめていただきありがとうございます。