Excel:使用 UDF 时出现单个 #VALUE 错误
Excel: single #VALUE error when using UDF
我知道这个话题 "Excel formulas not updating" 已经在很多论坛上进行了很多讨论,但我还没有找到解决我的问题的有用方法。
在工作表中,我使用内置 Excel 公式以及在工作表模块中用 VBA 编写的自己的函数,我在工作表中引用它们。
编辑:
单元格 A1 中有一个从十六进制代码生成的二进制代码。二进制代码在单元格 B1 中计算。
我们以下面的代码为例:100001101110
单元格 C1 包含以下内容:
=DecodeVal(B1;0;20)
如果我现在将十六进制代码粘贴到 A1 中并在 B1 中创建二进制代码,则单元格 C1 会显示 #VALUE!
错误。
如果我返回单元格 A1,单击文本框并再次按回车键,将显示正确的值 (= 2158)。
为什么一开始有值错误,但再按一次回车就没有了?
这是我指的函数:
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
混淆。另外我推荐 always use Long
因为在 VBA.
中使用 Integer
没有任何好处
最后 valueText = value.Text
似乎出现了一些问题。如果您使用 cell/range 对象的 .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 的)。
我知道这个话题 "Excel formulas not updating" 已经在很多论坛上进行了很多讨论,但我还没有找到解决我的问题的有用方法。
在工作表中,我使用内置 Excel 公式以及在工作表模块中用 VBA 编写的自己的函数,我在工作表中引用它们。
编辑:
单元格 A1 中有一个从十六进制代码生成的二进制代码。二进制代码在单元格 B1 中计算。
我们以下面的代码为例:100001101110
单元格 C1 包含以下内容:
=DecodeVal(B1;0;20)
如果我现在将十六进制代码粘贴到 A1 中并在 B1 中创建二进制代码,则单元格 C1 会显示 #VALUE!
错误。
如果我返回单元格 A1,单击文本框并再次按回车键,将显示正确的值 (= 2158)。
为什么一开始有值错误,但再按一次回车就没有了?
这是我指的函数:
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
混淆。另外我推荐 always use Long
因为在 VBA.
Integer
没有任何好处
最后 valueText = value.Text
似乎出现了一些问题。如果您使用 cell/range 对象的 .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 的)。