Люди, делайте бекапы! Я поменял офисный компьютер и думал, что учел все, но жизнь опять оказалась хитрее. Уже после того, как была дана отмашка на запихивание в шредер предыдущего винчестера, я запустил случайно Corel Draw. И тут вспомнил, что без любовно написанных макросов с этим, извините, редактором работать нельзя вообще. А макросы все остались в общей библиотеке. О которой я забыл. Так что приходится теперь потихоньку восстанавливать утраченное. Одно хорошо: есть возможность параллельно и описывать эти скрипты для читателей. Это куда проще, чем пытаться растолковать что-то, написанное год назад.

Итак, первая понадобившаяся мне вчера процедура — умножение. На большой схеме есть множество текстовых объектов, содержащих числа. Эти числа надо домножить на некие коэффициенты. Делать все вручную рехнешься, поэтому и был написан макрос. Мне требовалось также округлять числа до десятков, а вот проверять на ошибки в случае захвата объекта, содержащего текст, который нельзя конвертировать в число, совершенно не требовалось. Кому надо, дополняйте под себя. 

' Процедура Multiplicate
' Домножает значения в нескольких выбранных объектах на заданное число.
' Округляет результат до десятков и форматирует с разделителем тысяч.
' Пропускает нетекстовые объекты, но выдает ошибку, если текст
' не является числом.
'
Sub Multiplicate()
Dim sh As Shape
Dim Multi As Double
Dim UserInput As String
Dim OldVal As String
Dim NewVal As Long
' Спрашиваем у пользователя число, и выходим, если он передумал.
UserInput = InputBox("На что домножить:", "Домножение")
If UserInput = "" Then Exit Sub
' Заменяем в том, что ввел пользователь точку на запятую, чтобы
' не парить его переключением раскладок. Если в системе десятичный
' разделитель - точка, поменяйте в строке ниже точку и запятую местами.
UserInput = Replace(UserInput, ".", ",")
Multi = CDbl(UserInput)
' Перебираем все объекты, которые выделил пользователь перед вызовом
' процедуры
For Each sh In ActiveSelection.Shapes
    With sh
        ' Если имеем дело с текстом...
        If .Type = cdrTextShape Then
            ' Берем старое значение (до 100 символов - для числа хватит)
            OldVal = .Text.Range(0, 100)
            ' Чистим от форматирования пробелами
            OldVal = Replace(OldVal, " ", "")
            ' Умножаем и сразу округляем
            NewVal = Round((CDbl(OldVal) * Multi) / 10) * 10
            ' Форматируем и вставляем обратно
            .Text.Range(0, 100) = Format(NewVal, "### ##0")
        End If
    End With
Next

End Sub

Также читайте всю серию постов по VBA.

***

НКВД — это не только то, что вы подумали, но и то, что вам и в страшном сне не могло присниться. Это хостинг. Кстати, если вы поторопитесь, то успеете на раздачу доменов по смешным ценам.

  

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