Excel:使用UDF时出现单值错误

Excel:使用UDF时出现单值错误,excel,vba,excel-formula,updating,Excel,Vba,Excel Formula,Updating,我知道“Excel公式不更新”这个话题在很多论坛上都讨论过很多,但我还没有找到解决问题的有效方法 在工作表中,我在工作表的模块中使用内置Excel公式以及用VBA编写的自己的函数,并在工作表中引用它们 编辑: 单元格A1中有一个由十六进制代码生成的二进制代码。二进制代码在单元格B1中计算 让我们以下面的代码为例:10000101110 单元格C1包含以下内容: =DecodeVal(B1;0;20) 如果我现在将一个十六进制代码粘贴到A1中,并在B1中创建二进制代码,那么单元格C1将显示一个#值

我知道“Excel公式不更新”这个话题在很多论坛上都讨论过很多,但我还没有找到解决问题的有效方法

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

编辑:

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

让我们以下面的代码为例:10000101110

单元格C1包含以下内容:

=DecodeVal(B1;0;20)

如果我现在将一个十六进制代码粘贴到A1中,并在B1中创建二进制代码,那么单元格C1将显示一个
#值错误

如果返回到单元格A1,在文本框中单击并再次按enter键,将显示正确的值(=2158)

为什么一开始会有一个值错误,但如果我再按一次enter键就不会了

这就是我所指的功能:

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
是,计算选项设置为自动

有什么建议吗


谢谢

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

最后,
valueText=value.Text
似乎出现了一些问题。如果使用单元格/区域对象的
.Text
,则可能会干扰设置为该单元格的numberformat。我建议改用
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的代码中)