Откуда берётся пробел перед числом при его присвоении переменной его значения из ячейки?
Мне нужно открывать макросом существующие на жёстком диске файлы по их точным именам, которые состоят из одной постоянной и двух переменных частей. Например, "25-й файл. Срок до 2022.09.25", где "25" - первая переменная часть, "-й файл. Срок до 2022." - постоянная, а "09.25" - вторая переменная. "25" и "09.25" у меня хранится на листе-справочнике, где каждому номеру файла приведён в соответствие свой дедлайн.
Проблема в том, что при присвоении переменной значения из ячейки справочника перед числом появляется пробел. Т.е., вместо "25" я получаю " 25". Наличие этого пробела приводит к тому, что нужный мне файл не может быть найден и открыт.
Вот код, который поможет воспроизвести ситуацию:
Option Explicit
Sub str_test()
Dim str_srt As String
ActiveCell.Value = "25"
str_srt = Str(ActiveCell.Value)
Debug.Print "." & str_srt & "."
End Sub
Видно, что после выполнения кода в окне Immediate появляется " 25" (с пробелом, наличие которого не предполагался), заключённые в точки.
Я пробовал хранить данные в справочнике в форматах String и Integer - никакой разницы.
Вопрос: откуда берётся этот пробел?
Зная ответ на вопрос, я, возможно, смогу бороться с этими пробелами...
Ответы (1 шт):
Пробел появляется на этапе записи значения в переменную. Неявное преобразование типов.
В локализации Excel разделитель целой и дробной части числа - запятая, в VBA - точка.
Давайте поиграемся.
str_srt = ",25"
Debug.Print "." & str_srt & "."
Результат: в сцепке то же значение - .,25.
Теперь пробуем взять значение с листа:
ActiveCell.Value = ",25"
str_srt = Str(ActiveCell.Value)
Debug.Print "." & str_srt & "."
Результат: . .25.. Откуда точка?!
Для VBA значение с запятой - это текст (записать в коде 0,25 или ,25 без кавычек не получится). Но! Умный VBA понимает, что такой текст взят с листа, он видит локализацию и сначала текст ,25 преобразовывает в число 0.25, потом это число насильно пытается запихнуть обратно в текст )
При записи в текстовую переменную в мозгах VBA когнитивный диссонанс :) - текст в число, число в текст... Зачем эти пляски? Число должно быть числом! Числа с текстом нормально сцепляются, ошибки не будет (можно предварительно записать значение в переменную Long):
Sub str_test2()
Dim FirstPart As Long
ActiveCell.Value = 25
FirstPart = ActiveCell.Value
Debug.Print "." & FirstPart & "."
End Sub