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

  
Электронная книга: как правильно выбрать?
В настоящее время, электронные книги среди многих пользователей становятся всё более и более популяр
Какой правильно выбирать планшетный ПК?
Подобрать планшетный ПК достаточно непросто. Сегодня присутствует множество предложений, среди котор
Влияние музыки на человека трудно переоценить
Лечите душу ощущениями и…музыкой. Влияние музыки на человека поистине значительное, и это факт, о

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