【问题标题】:Convert a range of cells from Decimal to Two's Comp将一系列单元格从 Decimal 转换为 Two's Comp
【发布时间】:2016-12-07 11:29:49
【问题描述】:

我目前正在创建一个工具并同时自学 excel vba。我不是程序员,但为了完成这项任务,我是。

我正在尝试将一系列单元格中的十进制数转换为二进制数(使用 16 位二进制),以便可以将其乘以比例因子。我在网上看到了几段关于如何对奇异值和单元格执行此操作的代码,但在范围内没有。

Here 是一个我发现相当有用的页面的链接,但我仍然不确定如何对其进行编码,甚至不确定它是如何工作的。

对于一个菜鸟风格的问题表示歉意,我通常会发布我尝试过的内容(如果需要),但老实说,我不知道从哪里开始。任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 也许您可以详细解释一下 two's comp 的工作原理,以便我们更好地了解您想要的输出?
  • 首先在 Excel 上启用开发人员模式。绘制一个 ActiveX 按钮并插入链接到该按钮的代码。尝试调整代码,如果失败,请带着代码和您所做的调整来到这里。
  • 您需要在excel中寻找循环一系列单元格的代码,然后将单元格值传递给示例中的函数。
  • 谢谢大家,我会告诉你我的想法。

标签: vba excel excel-2010


【解决方案1】:

浮点类型已经在内部存储为 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 上,您需要将其复制到一对 Longs 或其他 64 位宽的结构中。

像这样使用它:

Public Sub Usage()
    Dim foo As Single
    foo = 3.14159265359
    Debug.Print SingleToTwosComplement(foo)
End Sub

【讨论】:

  • 您好共产国际,感谢您的回答。我使用的是 32 位版本的 Excel。然而,该代码的顶部不断出现“End Sub 后仅允许 cmets”。无论哪种方式,因为我是一个菜鸟,你能解释一下这里发生了什么吗?谢谢。
  • @MattGriffin - Public Declare 位需要位于模块的最顶部(在Option Explicit 之后)。它所做的只是将浮点数 (IEEE 754 Single) 的精确二进制表示复制到二进制补码变量类型 (Long) 中,而不允许 VBA 对其执行强制转换。这使您可以访问其内存布局。
  • 啊好酷我现在明白了,谢谢!尽管在 SingleToTwosComp 部分上没有任何可选声明,但我收到了一个错误,上面写着“Argument not optional”。
  • @MattGriffin - 你怎么称呼它?你必须给它一个值。
  • 抱歉,我这几天一直不在。我正在尝试将数据表中的一系列单元格传递给它,所以我不确定它是否有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多