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