Вы также можете создать пользовательскую UDF (определяемую пользователем функцию), которая использует регулярные выражения для выполнения этой задачи. Для этого потребуется скопировать/вставить знание VBA, а также установить ссылку на:
Регулярные выражения Microsoft VBScript 5.5
(что можно сделать, перейдя в VBE (Alt+F11), Инструменты > Ссылки. Затем установите флажок для ссылки, указанной выше)
Вставьте следующую пользовательскую функцию в стандартный модуль кода в VBE:
Public Function SigNum(ByVal InputNumber As Double) As Long
Dim s As SubMatches
With New RegExp
.Pattern = "\.0*([^0])|^([^0])"
If .test(InputNumber) Then
Set s = .Execute(InputNumber)(0).SubMatches
If s(0) > 0 Then ' This is before the period
SigNum = s(0)
Else
SigNum = s(1)
End If
End If
End With
End Function
На своем рабочем листе вы сможете использовать только что созданную формулу как таковую:
=SigNum(A1)
Вы можете увидеть, что он соответствует, в примере на regex101. При просмотре этого сайта выделенные зеленым цветом числа будут возвращены, если значение равно ‹ 0, а красным цветом будут возвращены значения, если значение > 0). Если значение = 0, это вернет 0.
Разрушение шаблона
Вот как работает шаблон \.0*([^0])|^([^0])
. Во-первых, вы можете видеть, что есть оператор |
, который по сути действует как оператор Or
, поэтому мы разделим его на две части.
Первый раздел \.0*([^0])
\.
будет соответствовать буквальному периоду. Это гарантирует, что мы смотрим на значение меньше 0.
0*
соответствует всем нулям, от 0 до неограниченного количества *
раз. Мы используем *
(от нуля до неограниченного) вместо +
(от 1 до неограниченного), потому что ноль не обязательно должен стоять перед значащим числом, но сам ноль не является значащим.
[^0]
Это отрицательный класс символов [^...]
. Это означает, что он будет соответствовать всему, чего нет в этом классе. Поскольку наше значимое число должно быть значением, отличным от нуля, мы не хотим совпадать с нулем. И поскольку он окружен группой захвата (...)
, это то, что возвращается обратно в функцию.
Второй раздел ^([^0])
Мы установили, что поскольку первый раздел не совпал, то значение должно быть больше 0.
^
это точка привязки, соответствующая началу строки. В первом разделе нам это не требовалось, потому что мы фактически использовали период \.
в качестве точки привязки. Поскольку наше значение больше 0, нам нужно убедиться, что мы начинаем с абсолютного левого угла входного числа.
(...)
Группа захвата. Все в этой группе будет возвращено как частичное совпадение и, в конечном счете, обратно в функцию в качестве возвращаемого значения.
[^0]
Отрицательный класс символов. Он будет соответствовать чему угодно, кроме 0.
person
K.Dᴀᴠɪs
schedule
24.07.2019
0.003
, будет ли он по-прежнему3
? - person Scott Craner   schedule 24.07.2019