Gre*_*edo 5 arrays excel vba excel-vba
我有一个数字(比如5),我首先要将其转换为二进制(101),然后在VBA中拆分成一个位数组{1,0,1}或布尔值{True,False,True}
有没有办法在没有循环的情况下做到这一点?
我可以转换为二进制文件而无需使用工作表公式在我的代码中循环,如下所示
myBinaryNum = [DEC2BIN(myDecInteger,[places])]
Run Code Online (Sandbox Code Playgroud)
但是我被告知工作表功能非常低效,而且这个功能特别有限.
我不知道如何在没有循环数字的情况下拆分成数组MID.有没有像strConv数字一样的东西?
您可以先将值转换为"01"字符串WorksheetFunction.Dec2Bin.然后用代码替换每个"0","1" 0或1将结果转换为Byte数组:
Public Function ToBitArray(ByVal value As Long) As Byte()
Dim str As String
str = WorksheetFunction.Dec2Bin(value) ' "101"
str = Replace(Replace(str, "0", ChrW(0)), "1", ChrW(1)) ' "\u0001\u0000\u0001"
ToBitArray = StrConv(str, vbFromUnicode) ' [1, 0, 1]
End Function
Run Code Online (Sandbox Code Playgroud)
但Dec2Bin仅限于511,使用字符串相当昂贵.因此,如果您的目标是获得最佳性能,那么您应该使用循环来读取每个位:
Public Function ToBitArray(ByVal value As Long) As Byte()
Dim arr(0 To 31) As Byte, i As Long
i = 32&
Do While value
i = i - 1
arr(i) = value And 1
value = value \ 2
Loop
ToBitArray = MidB(arr, i + 1) ' trim leading zeros
End Function
Run Code Online (Sandbox Code Playgroud)