• ベストアンサー
  • 困ってます

VBAで進数変換

マクロ内で、 16進数から2進数、2進数から10進数といったように 変換したいんですけど、うまいほうほうないですか? シート上ならHex2decとか使えるんですけど、 10桁までしかできないし、できればマクロ内でやりたいんです。 でも、Macro中には10進数から16進数とかはあるんですけど、逆が見当たらないんです。 ちなみにWorksheetFunctionにもありません。 助けてください。

  • tKc
  • お礼率44% (33/74)

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数13398
  • ありがとう数14

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.3
  • ARC
  • ベストアンサー率46% (643/1383)

こんな感じでどうでしょ? 16進→数値  Val("&HFF") 数値→16進  Hex$(255) 8進→数値  Val("&o377") 数値→8進  Oct$(377) 数値→2進 Public Function Num2Bin(Value As Variant) As Variant   Dim NVal As Long   Dim i As Long   If IsNumeric(Value) = False Then     Num2Bin = Null     Exit Function   End If   NVal = Val(Value)   For i = 15 To 0 Step -1     Num2Bin = Num2Bin & ((NVal And 2 ^ i) / (2 ^ i))   Next i End Function 2進→数値 Public Function Bin2Num(Value As Variant) As Variant   Dim i As Long   Dim StrVal As String   Dim Cursor As Long      If IsNumeric(Value) = False Then     Bin2Num = Null     Exit Function   End If   StrVal = CStr(Value)      Cursor = 0   For i = Len(StrVal) To 1 Step -1     Select Case Mid$(StrVal, i, 1)       Case "0"       Case "1"         Bin2Num = Bin2Num + (2 ^ Cursor)       Case Else         Bin2Num = Null         Exit Function     End Select     Cursor = Cursor + 1   Next i End Function

共感・感謝の気持ちを伝えよう!

質問者からのお礼

やっぱ作るしかないみたいですね。 ありがとうございました。

関連するQ&A

  • EXCEL VBA 16進から2進に変換

    EXCEL VBAにて16進数から2進数に変換したいと思い、 下記を実行したところ使用したところ、A1セルに入っている値が "AA"といったように2桁なら上手くいくんですが "AAA"というようにそれ以上の桁数になると、Hex2Binのプロパティが 取得できませんというエラーが出てしまいます。 Dim bin_1 As String bin_1 = Application.WorksheetFunction.Hex2Bin(Cells(1、1)) 使い方が間違ってますでしょうか?

  • VBA ワークシート関数のエラー

    シートに数式を入れていたものを、VBAで値のみ入力しようと考えています。 そこで、.Cells(1,1) = WorksheetFunction.数式といった形のメソッドを試しています。 しかし、複雑な数式を記述するとエラーが出てしまいます。 成功 (iferrorというワークシート関数が1つ) Debug.Print WorksheetFunction.IfError(1 / .Cells(1, 5) + 1 / .Cells(1, 6) + 1 / .Cells(1, 7) - 1, "P") 失敗(ワークシート関数のifとcountifなど複数のものが数式に混入) Debug.Print WorksheetFunction.If(CountIf(Range("C17:D49"), Range("C29")) > 5, Range("C29"), Range("D29")) Countifの場所でエラーになります。このcountifを使えるようにするためには、どうすればよいのでしょうか? WorksheetFunction.if(WorksheetFunction.Countif(、、、、という書き方はダメでした。 数式が汚くてすみません。 宜しくお願いいたします。

  • VBAの簡略化について

    VBAで数値をカウントするマクロを作りました。  Dim Co1 As Integer Co1 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<1") Dim Co2 As Integer Co2 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<2") Dim Co3 As Integer Co3 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<3") Dim Co4 As Integer Co4 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<4") Dim Co5 As Integer Co5 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<5") Dim Co6 As Integer Co6 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<6") Dim Co7 As Integer Co7 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<7") Dim Co8 As Integer Co8 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<8") Dim Co9 As Integer Co9 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<9") Dim Co10 As Integer Co10 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<10") Dim Co11 As Integer Co11 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), ">=10") Cells(2, 1) = Co1 Cells(3, 1) = Co2 - Co1 Cells(4, 1) = Co3 - Co2 Cells(5, 1) = Co4 - Co3 Cells(6, 1) = Co5 - Co4 Cells(7, 1) = Co6 - Co5 Cells(8, 1) = Co7 - Co6 Cells(9, 1) = Co8 - Co7 Cells(10, 1) = Co9 - Co8 Cells(11, 1) = Co10 - Co9 Cells(12, 1) = Co11 Cells(2, 1) = "0~0.999" Cells(3, 1) = "1~1.999" Cells(4, 1) = "2~2.999" Cells(5, 1) = "3~3.999" Cells(6, 1) = "4~4.999" Cells(7, 1) = "5~5.999" Cells(8, 1) = "6~6.999" Cells(9, 1) = "7~7.999" Cells(10, 1) = "8~8.999" Cells(11, 1) = "9~9.999" Cells(12, 1) = "10~" これを短くする方法を教えてください。

その他の回答 (2)

  • 回答No.2
  • popesyu
  • ベストアンサー率36% (1782/4883)

一文字づつ分解して(笑) 16→10に計算しなおすマクロ。 基数の16を2にすれば、2進数にも対応可・・・ sub sinsuu() '数値取得 suuji = Cells(1, 1) '文字数数える mojisuu = Len(suuji) '初期値 xxx = 0 h = 1 '数値を分解し、一文字づつ掛け算 For i = 1 To mojisuu keta = Mid(suuji, mojisuu + 1 - i, 1) '16進数変換 Select Case keta Case "A" keta = 10 Case "B" keta = 11 Case "C" cata = 12 Case "D" keta = 13 Case "E" keta = 14 Case "F" keta = 15 End Select xxx = keta * h + xxx '基数 h = h * 16 Next i MsgBox xxx end sub

共感・感謝の気持ちを伝えよう!

  • 回答No.1
noname#25358
noname#25358

 あ。2進数に関する関数がないので、自分で作ってください(笑)  たとえばこんな感じ。 Function Dec2Bin(DecimalVal) i = 1 Ret = "" Do While i <= DecimalVal If (i And DecimalVal) <> 0 Then Ret = "1" & Ret Else Ret = "0" & Ret End If i = i * 2 Loop Ret = "&B" & Ret Dec2Bin = Ret End Function  これだとちょっと効率悪いですけどね。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • Excel 「0x」、「h」 付き 16進変換

    【Excel 2002 SP3】 を使用しております。 A1セル:"0xFFFFh" B1セル:"0x55h" C1セル:"0xAAh" D1セル:"0x0000h" 上記データが各セル書き込まれています。 上記値を10進に変換したいのですが、 A2セル:"=HEX2DEC("A1")" B2セル:"=HEX2DEC("B1")" C2セル:"=HEX2DEC("C1")" D2セル:"=HEX2DEC("D1")" 上記では10進変換できませんでした。 "0x","h"が原因だとわかっているのですが、 どちらも付加したまま10進変換できればと考えています。 VBAで文字解析するれば対応できそうでしたが、 VBAを使わず、Cellの式だけで実現したいと考えています。 何かよい方法はないでしょうか?

  • ■VBA■ SUMとAVERAGEの違い

    A列に5分毎のデータが並んでいて、このデータの30分毎の平均や合計をB列に出力したいとします。 このとき、以下のマクロを実行すると 「WorksheetFunctionクラスのAverageプロパティを取得できません。」 というエラーが出てしまいます。 Dim i As Integer For i = 1 To 1000 Cells(7 + i, 2).FormulaR1C1 = Application.WorksheetFunction.Average(Range(Cells(1 + 6 * i, 1), Cells(6 + 6 * i, 1))) Next しかし、Averageの部分をSumにすると実行できるのです。。。 なぜでしょうか????? それから、5分毎のデータを30分毎のデータに変換する良い方法があったらそちらも加えて教えてください!!

  • VBAのWorksheetFunctionの引数に配列を使いたい

    VBAにチャレンジし始めて、1ヶ月ほどの者です。 WorksheetFunctionの引数にVBAの配列を入れて計算させたいと思っています。 例えば、作業用の配列temp_arrayを定義し、temp_array()に格納した数字の平均値をWorksheetFunctionで求めるといったことです。 しかし、 Dim temp_array() As Variant Dim a As Double a = WorksheetFunction.Average(temp_array()) としても、 「実行時エラー'1004' WorksheetFunctionクラスのAverageプロパティーを取得できません」 というエラーで叱られます。 ネットで調べていると、Excelのワークシート関数には、引数として配列を扱えるものが多いとあったので、試してみています。 例えば、参考にしたのは下記のサイトの記述です。 http://www.clayhouse.jp/array/array03_d.htm もちろん、平均値を求めるぐらいなら、自分で関数をつくった方が早いのだとは思いますが、エクセルには色々な統計関数があるので、本当に配列として、WorksheetFunctionに簡単にわたせるなら、相当プログラムが楽でシンプルにできるなぁと思います。 もし、よくご存じの方がいたらアドバイスいただけませんでしょうか?

  • Excel ワークシート関数をVBAで使用したい

    お世話になります。 Excelでワークシート関数をVBAで使用したいのですが、うまくいきませんでした。 関数ですと「ISERROR(FIND(V$10,R$11))=FALSE」のような式をVBA上で使用したいと思い、以下のようにコードを書いてみましたが If Application.WorksheetFunction.IsError(Application.WorksheetFunction.Find(Cells(i, j), Cells(i, 18))) = False Then Cells(i, j).Select End If 「実行時エラー'1004' WorksheetFunction クラスのFindプロパティを取得できません」となります。 入れ子が問題なのでしょうか。 よろしくお願いします。

  • エクセル VBA もっときれいな書き方?

    Sub test() Dim i As Integer, n As Integer n = 1 For i = 2 To 150 If Cells(i, 1) <> Cells(i - 1, 1) Then Cells(i - 1, 5) = i - n Cells(i - 1, 6) = Application.WorksheetFunction.Sum(Range("B" & n & ":" & "B" & i - 1)) n = i End If Next i End Sub 上記のマクロですが Application.WorksheetFunction.Sum(Range("B" & n & ":" & "B" & i - 1)) この部分、もっとスマートに書く方法を教えてください。 Range("B" & n & ":" & "B" & i - 1)って、ちゃんと動きますが、書き方が何か変なような気がするんです。 よくわかってもいないのにすみません。

  • VBAでのMATCH関数の使用

    現在,VBAにてシートの比較プログラムを行っておりますが,その中で検索範囲を示すRangeに名前を使用したいのですがエラーでうまくいきません。 エラーは 「実行時エラー:1004 WorksheetFunctionクラスのMatchプロパティが取得できません」 とでます。 記述は Application.WorksheetFunction.Match(Cells(r, 132), Range("リース型具Key1"), 0) としており,”リース型具Key1”が事前に名前登録してある名前です。 方法をご存知の方,よろしくお願いします。

  • vbaの速度向上(sumif関数)

    エクセルvbaの速度を向上できないか、お知恵を貸していただきたく存じます。 以下のvba(sumif関数)をもっと速めたいです。何とかできないでしょうか。長い記載となり申し訳ないのですが、何卒よろしくお願い申し上げます。 myCnt7 = 2 Do Worksheets("●").Cells(myCnt7, 4).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 3), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 3), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 7).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 6), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 6), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 10).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 9), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 9), Worksheets("★").Range("C:C")) Loop While myCnt7 > 201 ※シート●のC列から3列ごとに、Sumifの検索条件があります。 ※シート●のD列から4列ごとに、Sumifの計算結果を出力させます。 ※計算対象シートは、シート◆とシート★の2つです。  シート◆のSumif合計から、シート★のSumif合計を差し引いています。  Sumifの条件自体は、どちらのシートも同じ(シート●)。 ※上記のSumif関数の記述は、3つですが、実際の記述は24あります。 ※すなわち、検索条件の組み合わせが24あり、201行分をmyCnt7でLoopさせて実行しています。

  • ExcelVBA:WorksheetFunctionのいろんな記述とエラー

    Excel2000でVlookup関数を記述してるんですが、WorksheetFunctionで以下のエラーメッセージが出てきます。 「エラー:1004 ApplicationクラスのVlookupプロパティーが取得できません」 (試してみた記述例) ○myVar = Application.WorksheetFunction.Vlookup(検索値, 範囲, 列位置, 検索の型) ○myVar = WorksheetFunction.Vlookup(検索値, 範囲, 列位置, 検索の型) 仕方ないので、97記述をすると問題なく出来ます。 (97記述例) ○myVar = Application.Vlookup(検索値, 範囲, 列位置, 検索の型) 今は97記述でしのげてます。 でも、たしかExcel2000からは、ワークシート関数はWorksheetFunctionを利用することになったんじゃないんでしょうか。 この記述がいつまで通用するのか分からないので、ちょっと不安です。

  • エクセルVBAの勉強を始めました。教えてください。

     VBAの勉強中なのですが、とにかくマクロで連続印刷をしたいのです。For~Nextステートメントを使いたいのですが、以下のマクロのTo以下の意味がわかりません。どうしてTo以下が数字になっていないのですか?初心者には全くわかりません(以下は連続印刷時のマクロの一部分です)  For 伝票カウンタ 1 to _ Application.WorksheetFunction.Count(Worksheets("売掛金合計票").Range("A4:A13)) Range("B2") = 伝票カウンタ 印刷 Next 伝票カウンタ    またApplication.WorksheetFunction.とは何者ですか?? よろしくお願い致します。

  • VBAで4桁の16進数から16桁の2進数変換

    VBAで4桁の16進数(FFFFとか)を2進数(1111 1111 1111 1111とか)に変換して変換した2進数を1桁づつセルに表示させるには、どうしたらいいでしょうか?ワークシート上だと8桁までしか対応してないようで、左右8桁づつわけてHEX2BINを使ってとりあえず変換する事は、できましたがVBAでマクロを組んで行いたいです。例えばA1に16進数を入れA2~P2に2進数を1桁づつ表示させたいです。よろしくお願いします。

専門家に質問してみよう