Люди, делайте бекапы! Я поменял офисный компьютер и думал, что учел все, но жизнь опять оказалась хитрее. Уже после того, как была дана отмашка на запихивание в шредер предыдущего винчестера, я запустил случайно 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.

***

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

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

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