忍者ブログ

VBAで2進数を10進数に変換する関数を作ってみた(LSBに対応)

2024年01月06日
会社で2進数のログを扱うことがあって、
2進数を10進数に変換する自作関数を作った。

普通と違うのは、各ビットを読む順番。
マニアックなことに左側を下位ビットとして解釈する(LSBというらしい)。

1110→7
0011→12

昔、16進数を10進数に変換しようとしてこんな関数は作ってた。

' %%%% 16進数から10進数へ %%%%%
Function Hex2DecEx(Hex)
If Hex = "" Then
    Hex2DecEx = ""
Else
    Dim i As Long
    
    For i = 1 To Len(Hex)
        Hex2DecEx = Hex2DecEx * 16 + CInt("&H" & Mid(Hex, i, 1))
    Next i
End If    
End Function

エクセルの標準関数が用意されているけど、当時アドインを入れないといけなかったのと
文字数に制限があって作った気がする。


WEBで検索したらこのサイトがクリーンヒット。よく見たらbin2decじゃん。




やった作業はめっちゃ簡単。
●HexをBinに変えて16を2に変えた
●逆順に対応できるようにフラグを用意して、逆順の場合はループを逆回し


今回作ったソースは以下の通り。
ちなみに、逆順フラグはオプションにして、省略可能にしておいた。
やった作業はめっちゃ簡単。
●HexをBinに変えて16を2に変えた
●逆順に対応できるようにフラグを用意して、逆順の場合はループを逆回し
今回作ったソースは以下の通り。
ちなみに、逆順フラグはオプションにして、省略可能にしておいた。
' %%%% 2進数から10進数へ %%%%%
Function Bin2DecEx(Bin As String, Optional lsbFlag As Long = 0)
    If Bin = "" Then
        Bin2DecEx = ""
    Else
        Dim i As Long
        If lsbFlag = 0 Then
            For i = 1 To Len(Bin)
                Bin2DecEx = Bin2DecEx * 2 + CInt("&H" & Mid(Bin, i, 1))
            Next i
        Else
            For i = Len(Bin) To 1 Step -1
                Bin2DecEx = Bin2DecEx * 2 + CInt("&H" & Mid(Bin, i, 1))
            Next i
        End If
    End If
End Function

PR

エクセルの標準書式について

2023年11月11日
2つ前の記事で、text形式のセルが#####と表示される対策を書いた。

選択オートフィルタの改良と標準機能について~.textの列幅エラー対策~

selection.textだと、#####となってしまうので、
format(selection.value,selection.numberformatlocal)にしようという内容。

一見問題なさそうだけど、オーバーフローになっちゃうよっていうお話。
(これ、前にもハマったな・・・)
つづきはこちら "エクセルの標準書式について"

選択オートフィルタの改良と標準機能について~.textの列幅エラー対策~

2023年11月05日
最近、schooというオンライン学習サイトを利用している。

会社の教育の一環でやらされた感はあるが、
講師の中にエクセルで有名なoffice TANAKA が居るではないか!!!

ってことで色々エクセル関係の動画を見ているわけだけど、
知らないことが結構あってなかなか勉強になる。


特に衝撃だったのが、
選択セルでオートフィルタの絞り込みが標準機能にあったこと。。。

わざわざマクロまで作ったのに。
今回は、選択セルでオートフィルタを絞り込むやり方と、列幅が狭くて#####と表示されているセルのテキストを取得するマクロについて。


つづきはこちら "選択オートフィルタの改良と標準機能について~.textの列幅エラー対策~"

VBAでオブジェクトの繰り返し定義による速度考察した話

2023年10月10日
VBAを書いていると、ファイルシステムオブジェクトとかシェルスクリプトオブジェクトとか使うことがよくある。

CreateObject("Scripting.FileSystemObject")
CreateObject("WScript.Shell")

オブジェクトを使ったら後始末みたいな記述をよくみるので、なんとなく繰り返し呼び出すのは良くないと思っていた。

実際どんだけ遅くなんのよ?ってのが今回の話。
結論を先に書くと、
つづきはこちら "VBAでオブジェクトの繰り返し定義による速度考察した話"

ショートカットファイルのリンク先をショートパスで指定して文字数制限対策をした話

2023年10月06日
会社で使っているNASのリンク切れが激しい。。。2回目の呟き

リンク先修正時のリンク先存在チェックはひとまず置いておいて、NASのパスだけでも修正しようと久々にリンク先を取得するマクロを動かしてみた。

リンク先を取得するのにCreateShortcutを使ってるんだけど、引数の文字数が256バイトを超えるとエラーを吐くので、対策を考えてみた。

CreateObject("WScript.Shell").CreateShortcut(フルパスファイル名)


つづきはこちら "ショートカットファイルのリンク先をショートパスで指定して文字数制限対策をした話"