Продолжим разбирать простенькие примеры скриптов на 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.

Оставить комментарий