Excel: одиночная ошибка #VALUE при использовании UDF - PullRequest
0 голосов
/ 17 марта 2020

Я знаю, что топи c "Формулы Excel не обновляются" часто обсуждались на многих форумах, но я не нашел полезного решения своей проблемы.

В рабочем листе я использую встроенные формулы Excel, а также собственные функции, написанные с помощью VBA в модуле рабочего листа, и я ссылаюсь на них внутри рабочего листа.

РЕДАКТИРОВАТЬ:

Есть двоичный код, который генерируется из шестнадцатеричного кода в ячейке A1. Двоичный код вычисляется в ячейке B1.

Давайте возьмем следующий код в качестве примера: 100001101110

Ячейка C1 содержит следующее:

= DecodeVal (B1; 0 ; 20)

Если я теперь вставлю шестнадцатеричный код в A1, и двоичный код будет создан в B1, ячейка C1 отображает ошибку #VALUE!.

Если I go вернитесь в ячейку 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

Да, параметры расчета установлены автоматически c.

Есть предложения?

Спасибо

1 Ответ

1 голос
/ 19 марта 2020

Я рекомендую правильно объявлять переменные и не использовать Value в качестве имени переменной, так как оно может легко перепутаться с Range().Value. Также я рекомендую всегда использовать Long, поскольку использование Integer в VBA не дает никаких преимуществ.

Наконец, кажется, что с 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...