【问题标题】:Excel: single #VALUE error when using UDFExcel:使用 UDF 时出现单个 #VALUE 错误
【发布时间】:2020-03-19 20:30:00
【问题描述】:

我知道“Excel 公式未更新”这个话题已经在许多论坛上进行了很多讨论,但我还没有找到有用的解决方案来解决我的问题。

在工作表中,我使用内置 Excel 公式以及在工作表模块中使用 VBA 编写的自己的函数,并在工作表中引用它们。

编辑:

在单元格 A1 中有一个从十六进制代码生成的二进制代码。二进制代码在单元格 B1 中计算。

我们以下面的代码为例:100001101110

单元格 C1 包含以下内容:

=DecodeVal(B1;0;20)

如果我现在将十六进制代码粘贴到 A1 并在 B1 中创建二进制代码,则单元格 C1 将显示 #VALUE! 错误。

如果我返回单元格 A1,单击文本框并再次按 Enter,则会显示正确的值 (= 2158)。

为什么一开始有Value错误,再按回车就没有了?

这是我指的功能:

Public Function DecodeVal(value, start As Integer, length As Integer) As Long
Dim abschnitt As String
Dim i As Integer
Dim valueText As String

    valueText = value.Text
    If (Len(valueText) - start - length + 1 > 0) Then
        abschnitt = Mid(valueText, Len(valueText) - start - length + 1, length)
    Else
        If (Len(valueText) > start) Then
            abschnitt = Left(valueText, Len(valueText) - start)
            length = Len(valueText) - start
        End If
    End If

    Do
        If (Int(Left(abschnitt, 1)) = 1) Then
            DecodeVal = DecodeVal * 2 + 1
        Else
            DecodeVal = DecodeVal * 2
        End If
        abschnitt = Right(abschnitt, length - 1)
        length = length - 1
    Loop While length > 0


End Function

是的,计算选项设置为自动。

有什么建议吗?

谢谢

【问题讨论】:

    标签: excel vba excel-formula updating


    【解决方案1】:

    我建议正确声明变量,不要使用Value 作为变量名,因为它很容易与Range().Value 混淆。另外我推荐always use Long,因为在VBA 中使用Integer 没有任何好处。

    valueText = value.Text 终于出现了一些问题。如果您使用单元格/范围对象的.Text,它可能会干扰设置为该单元格的数字格式。我建议改用ValueText = CStr(ValueCell.Value)

    所以你最终会得到类似的东西:

    Option Explicit
    
    Public Function DecodeVal(ValueCell As Range, Start As Long, Length As Long) As Long
        Dim Abschnitt As String
        Dim i As Long
        Dim ValueText As String
    
        ValueText = CStr(ValueCell.Value)
        If (Len(ValueText) - Start - Length + 1 > 0) Then
            Abschnitt = Mid$(ValueText, Len(ValueText) - Start - Length + 1, Length)
        Else
            If (Len(ValueText) > Start) Then
                Abschnitt = Left$(ValueText, Len(ValueText) - Start)
                Length = Len(ValueText) - Start
            End If
        End If
    
        Do
            If (CLng(Left$(Abschnitt, 1)) = 1) Then
                DecodeVal = DecodeVal * 2 + 1
            Else
                DecodeVal = DecodeVal * 2
            End If
            Abschnitt = Right$(Abschnitt, Length - 1)
            Length = Length - 1
        Loop While Length > 0
    End Function
    

    如果这不能解决问题,那么您的问题与该代码无关,而是与您如何生成二进制文件并将其写入单元格(或者如果它是一个公式,那么问题在于该代码UDF)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多