我正在创建一个工具并同时教我自己excel vba。我不是程序员,但出于这个任务的目的,我是。
我正在尝试将一系列单元格中的十进制数转换为二进制数(使用16位二进制数),以便我可以将其乘以比例因子。我已经在网上看到了几条关于如何为奇异值和单元格执行此操作的代码,但在范围内没有任何内容。
Here是指向我认为相当有用的网页的链接,但我仍然不确定如何编码或甚至如何工作。
对于一些noob风格的问题道歉并且我通常发布我尝试过的内容(如果需要),但老实说我不知道从哪里开始。任何帮助将不胜感激。
提前致谢。
答案 0 :(得分:0)
浮点类型已经在内部存储为IEEE 754,因此没有任何理由使用VBA重新转换它们 - 只需将它们直接从内存复制到非浮点类型具有相同的宽度。请注意,VBA没有本机16位浮点类型 - 最短的是32位Single
。这会将Single
复制到Long
(具有二十补码布局):
'In a module
Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias _
"RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, _
ByVal length As Long)
Public Function SingleToTwosComplement(data As Single) As Long
Dim retVal As Long
CopyMemory VarPtr(retVal), VarPtr(data), LenB(retVal)
SingleToTwosComplement = retVal
End Function
如果您使用的是64位版本的Office,则可以使用Double
对LongLong
执行相同的操作:
'64 bit VBA only.
Public Function DoubleToTwosComplement(data As Double) As LongLong
Dim retVal As LongLong
CopyMemory VarPtr(retVal), VarPtr(data), LenB(retVal)
DoubleToTwosComplement = retVal
End Function
在32位Office上,您需要将其复制到一对Long或64位宽的其他结构中。
像这样使用:
Public Sub Usage()
Dim foo As Single
foo = 3.14159265359
Debug.Print SingleToTwosComplement(foo)
End Sub