Excel: странное поведение #VALUE при использовании UDF - PullRequest
2 голосов
/ 19 марта 2020

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

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

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

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

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

= DecodeVal (B1; 0 ; 20)

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

Если I go вернитесь в ячейку A1, щелкните в текстовом поле и снова нажмите enter, отобразится правильное значение (= 2158).

Почему сначала возникает ошибка Value, а не если я нажимаю 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

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

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

Спасибо

Ответы [ 3 ]

2 голосов
/ 19 марта 2020

Использование Range.Text не рекомендуется. Это особенно приведет к ошибкам, когда входной столбец имеет меньшую ширину, чем данные, и в ячейке отображается ######. Если формула рассчитана, она вернет ошибку #VALUE. См. Снимок ниже.

enter image description here

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

enter image description here

Чтобы обойти это, используйте valueText = value.Value2 или valueText = value.Value вместо valueText = value.Text.

Кроме того, я бы предложил использовать что-то вроде RngValue в качестве объявленной переменной / аргумента вместо value, который также является свойством Range (поскольку это может привести к конфликтам).

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

В ваших Do l oop вы используете DecodeVal в расчетах, но никогда не присваиваете ему начальное значение.

( могут быть другие ошибки )

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

Следующие две вещи решат вашу проблему:

  1. Изменить

    Public Function DecodeVal(value, start As Integer, length As Integer) As Long

с

   Public Function DecodeVal(val As Range, start As Integer, length As Integer) As Long

и используйте valueText = val.value

Также убедитесь, что B1 отформатирован как текст. Лучший способ форматирования будет TextToColumns. Вручную (из вкладки данных) или в коде:

Dim sh As Worksheet, rng As Range Set sh = ActiveSheet Set rng = sh.Range("B1:B10") rng.TextToColumns Destination:=rng, fieldInfo:=Array(1, 2)

В противном случае Excel может быть научным c форматом ...

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