Продолжим разбирать простенькие примеры скриптов на VBA для Excel. Первая часть.
Иногда возникает надобность добавить одно число к куче разных ячеек, или домножить их на какой-то коэффициент.
' MultiplicateSelection ' домножает выделенные ячейки на число с округлением до десятков Sub MultiplicateSelection() ' объявляем переменные Dim Koef As Variant, cl As Range ' запрашиваем у пользователя число Koef = InputBox("Умножить на", "Домножение выделения") ' если ничего не введено или нажата ОТМЕНА, выходим из процедуры If Koef = "" Then Exit Sub ' Помните о пользователе! ' Простейшей заменой решается проблема с десятичной точкой ' (в системе разделителем установлена запятая, если введена ' точка, здесь она заменяется на запятую) Koef = Replace(Koef, ".", ",") ' опять перебираем выделенные ячейки For Each cl In Selection ' указываем объект, с которым будем работать With cl ' кучка возможно не нужных вам проверок и вычисление If .Value <> "" And .Locked = False And _ CStr(.Formula) = CStr(.Value) Then .Value = Round((.Value * CDbl(Koef)) / 10) * 10 End If ' заканчиваем работу с указанным объектом End With ' закрываем цикл Next ' выходим из процедуры End Sub
InputBox - обычное окошко для вводя текста пользователем. Функция возвращает пустую строку, если была нажата кнопка ОК при пустой строке ввода, или нажата Отмена.
Replace заменяет в строке одну последовательность символов на другую. Здесь используется для того, чтобы пользователю не приходилось думать о раскладке. Неважно, что он напечатает - десятичную точку или запятую, вычисления пройдут без ошибки.
Далее уже знакомый перебор выделенных ячеек.
Для чего нужна конструкция With ... End With? Если в каком-то блоке кода вы активно работаете с одним объектом, есть смысл указать его после слова With, а дальше вместо Объект.Свойство писать просто .Свойство. Это делает код более читаемым, а также, насколько я знаю, несколько ускоряет исполнение.
Я специально оставил свои проверки свойств ячейки, для интереса. В одном из моих шаблонов лист организован таким образом, что я могу выделить несколько строк целиком и запустить эту процедуру. При этом пропускаются пустые ячейки (.Value <> ""), защищенные от изменений (.Locked = False), и содержащие формулы (CStr(.Formula) = CStr(.Value)). Все остальные изменяются.
Round - округление. Поскольку округление происходит только до целых, приходится делить, а потом умножать на 10.
И еще две функции: CStr - конвертация в строку, в данном случае для корректного сравнения. CDbl - приведение к вещественному типу Double, вводит-то пользователь строку, а нам числа умножать надо. Впрочем, Visual Basic редко требует явное преобразование типов, справляется сам, но так - аккуратнее.
Специально не разбираю аргументы функций. Читайте документацию и экспериментируйте, это лучший способ понять.
Также читайте всю серию постов по VBA.
