Макросы в excel расчет

На чтение 4 мин. Просмотров 33.2k.

Итог: ознакомьтесь с 3 советами по написанию и созданию формул в макросах VBA с помощью этой статьи и видео.

Уровень мастерства: Средний

Автоматизировать написание формул

Написание формул может быть одной из самых трудоемких частей
вашей еженедельной или ежемесячной задачи Excel. Если вы работаете над
автоматизацией этого процесса с помощью макроса, вы можете попросить VBA
написать формулу и ввести ее в ячейки.

Поначалу написание формул в VBA может быть немного сложнее,
поэтому вот три совета, которые помогут сэкономить время и упростить процесс.

Совет № 1: Свойство Formula

Свойство Formula является членом объекта Range в VBA. Мы можем использовать его для установки / создания формулы для отдельной ячейки или диапазона ячеек.

Есть несколько требований к значению формулы, которые мы устанавливаем с помощью свойства Formula:

  1. Формула представляет собой строку текста, заключенную в кавычки. Значение формулы должно начинаться и заканчиваться кавычками.
  2. Строка формулы должна начинаться со знака равенства = после первой кавычки.

Вот простой пример формулы в макросе.

Sub Formula_Property()

  ' Формула представляет собой строку текста, заключенную в кавычки
  ' Начинается со знака =
  Range("B10").Formula = "=SUM(B4:B9)"

End Sub

Свойство Formula также можно использовать для чтения существующей формулы в ячейке.

Совет № 2: Используйте Macro Recorder

Если ваши формулы более сложные или содержат специальные
символы, их будет сложнее написать в VBA. К счастью, мы можем использовать
рекордер макросов, чтобы создать код для нас.

Create Formula VBA code with the Macro Recorder

Вот шаги по созданию кода свойства формулы с помощью средства записи макросов.

  1. Включите средство записи макросов (вкладка «Разработчик»> «Запись макроса»)
  2. Введите формулу или отредактируйте существующую формулу.
  3. Нажмите Enter, чтобы ввести формулу.
  4. Код создается в макросе.

Если ваша формула содержит кавычки или символы амперсанда, макрос записи будет учитывать это. Он создает все подстроки и правильно упаковывает все в кавычки. Вот пример.

Sub Macro10()
' Используйте средство записи макросов для создания кода для сложных формул с
' специальны символы и относительные ссылки

  ActiveCell.FormulaR1C1 = "=""Total Sales: "" & TEXT(R[-5]C,""$#,###"")"
    
End Sub

Совет № 3: Нотация формулы стиля R1C1

Если вы используете средство записи макросов для формул, вы
заметите, что он создает код со свойством FormulaR1C1.

Нотация стиля R1C1 позволяет нам создавать как относительные (A1), абсолютные ($A$1), так и смешанные ($A1, A$1) ссылки в нашем макрокоде.

R1C1 обозначает строки и столбцы.

Относительные ссылки

Для относительных ссылок мы указываем количество строк и
столбцов, которые мы хотим сместить от ячейки, в которой находится формула.
Количество строк и столбцов указывается в квадратных скобках.

Следующее создаст ссылку на ячейку, которая на 3 строки выше
и на 2 строки справа от ячейки, содержащей формулу.

Отрицательные числа идут вверх по строкам и столбцам слева.

Положительные числа идут вниз по строкам и столбцам справа.

Абсолютные ссылки

Мы также можем использовать нотацию R1C1 для абсолютных ссылок. Обычно это выглядит как $A$2.

Для абсолютных ссылок мы НЕ используем квадратные скобки. Следующее создаст прямую ссылку на ячейку $A$2, строка 2, столбец 1

При создании смешанных ссылок относительный номер строки или
столбца будет зависеть от того, в какой ячейке находится формула.

Проще всего использовать макро-рекордер, чтобы понять это.

Свойство FormulaR1C1 и свойство формулы

Свойство FormulaR1C1 считывает нотацию R1C1 и создает
правильные ссылки в ячейках. Если вы используете обычное свойство Formula с
нотацией R1C1, то VBA попытается вставить эти буквы в формулу, что, вероятно,
приведет к ошибке формулы.

Поэтому используйте свойство Formula, если ваш код содержит
ссылки на ячейки ($ A $ 1), свойство FormulaR1C1, когда вам нужны относительные
ссылки, которые применяются к нескольким ячейкам или зависят от того, где
введена формула.

Если ваша электронная таблица изменяется в зависимости от
условий вне вашего контроля, таких как новые столбцы или строки данных,
импортируемые из источника данных, то относительные ссылки и нотация стиля
R1C1, вероятно, будут наилучшими.

Я надеюсь, что эти советы помогут. Пожалуйста, оставьте
комментарий ниже с вопросами или предложениями.

Решаем счётные задачи с помощью Excel VBA

Visual Basic for Applications (VBA) – диалект языка Visual Basic, включённый в состав пакета Microsoft Office. Программы на VBA, называемые макросами, могут выполняться прямо из документа Word или Excel, используя при этом в качестве интерфейса пользователя стандартные для Windows кнопки, поля ввода, списки, окна диалога или переключатели.

Изучение языка — тема отдельная, хотя он совсем несложен. В этой заметке я покажу лишь самые очевидные вещи — как ввести данные и вывести результаты работы двумя основными способами — с помощью окон диалога и непосредственно в ячейки рабочего листа Excel.

Перед началом работы:

1. Включите настройку Кнопка Office — Параметры Excel (или Word) — Основные — «Показывать вкладку Разработчик на ленте». В последних версиях офиса настройка может называться иначе, но она там есть :)

2. На вкладке Разработчик нажмите кнопку Безопасность макросов и разрешите выполнение макросов:

параметры макросов

параметры макросов

В противном случае придётся каждый раз разрешать выполнение макросов при открытии документа.

Когда цикл разработки окончен, лучше вернуть настройку на место, чтобы не открыть вирусный документ, полученный откуда-нибудь со стороны.

3. Нажмите вкладку Разработчик – Макросы, дайте новой программе имя и нажмите кнопку Создать:

создание макроса

создание макроса

Откроется редактор Visual Basic, в котором можно писать, отлаживать, выполнять и сохранять программы.

На скрине ниже показана программа, позволяющая вычислить, сколько процентов составляет значение A от B.

пример программы

пример программы

Вот листинг почти программки такого же типа, только ещё проще.

Sub Project1()
 Dim A, B, C As Double
 A = Val(InputBox("Ввод A", "Введите A", 0))
 B = Val(InputBox("Ввод B", "Введите B", 0))
 C = Sqr(A ^ 2 + B ^ 2)
 MsgBox "Ответ =" & C
End Sub

В простых случаях нам достаточно с помощью окна InputBox получить значение переменной (третьим аргументом ей можно дать значение по умолчанию),
при необходимости проверить, корректно ли введены данные (так как введённая в InputBox величина возвращается в виде строки, можно получить её числовое значение функцией Val или узнать, введено ли вообще числовое значение функцией IsNumeric), произвести расчёты и
вывести результаты в новом окне сообщения, полученном функцией MsgBox. Её первым аргументом мы передаём строку, выводимую в окне, её можно получить сложением строк в двойных кавычек и/или числовых значений, которые нужно преобразовать к строковым функцией Str.

Теперь можно нажать зелёный треугольничек или клавишу F5 в редакторе VBA, чтобы запустить программу.
Если доступно несколько программ или текстовый курсор не установлен внутри программы, компьютер может попросить выбрать нужную по имени:

запуск программы из редактора Visual Basic

запуск программы из редактора Visual Basic

Чтобы макросы не пропали, при первом сохранении рабочей книги нужно выбрать пункт меню «Сохранить как» и указать в списке «Тип файла» значение «Книга Excel с поддержкой макросов (*.xlsm)».

Обычно мы хотим запускать программу не из Visual Basic, а прямо из документа, например, нажимая кнопку.

Чтобы встроить кнопку непосредственно в документ Word или Excel, действуем так:

1. На вкладке разработчика нажмём кнопку «Режим конструктора» и выберем нужный элемент управления, например, кнопку:

выбор инструмента "Кнопка"

выбор инструмента «Кнопка»

2. Потом курсором-крестиком «нарисуем» кнопку в документе и нажмём «Создать» в окне «Назначить макрос объекту», чтобы кнопке была назначена пустая процедура-обработчик её основного события (то есть, нажатия):

добавление кнопки на лист

добавление кнопки на лист

3. После этого можно запрограммировать процедуру обработки нажатия нашей кнопки.

Обращаться к ячейкам Excel из программы VBA тоже очень легко, вот несколько примеров:

Range("B1").Value = 2018	
'Поместить в ячейку B1 текущего листа значение 2018

Range("A1:A10").Select
Range("A1:A10").Value = "Программа"	
'Выделить и заполнить словом "Программа" ячейки A1:A10

Range("C2").Font.Size = 18	
'В ячейке С2 установить размер шрифта 18

For N = 1 To 10
  Range("D" & N).Value = _
   Range("D" & (N + 1)).Value
 Next	
'Сдвинуть вверх ячейки от D1 до D10 (пропадает первое значение)

Sheets("Лист1").Cells(1, 1) = 13 ^ 64	
'Записать в ячейку A1 листа "Лист1" большое числовое значение

Ну и немного более законченного кода.

Попробуйте скопировать в VBA и выполнить эти 2 несложных программы, и начальный опыт программирования в нём у Вас появится :)

Первая программа может быть назначена кнопке и позволяет ввести из столбца A текущего рабочего листа столько числовых значений, сколько их там набрано, но не больше 100.

Полученные значения заносятся в массив A, заполнение прекращается по достижении пустой ячейки, ячейки, заполненной не числом или когда набрано 100 элементов.

Затем от введённых чисел рассчитывается сумма и записывается в ячейку B6.

Sub Кнопка5_Щелчок() 'Кнопка Массив
 Dim A(100) As Double
 Dim N As Integer
 N = 0
 For I = 1 To 100
  V = Range("A" & I).Value
  If (IsEmpty(V) Or IsNumeric(V) = False Or N > 100) Then
   MsgBox "Введено чисел : " & N
   Exit For
  End If
  A(I) = V
  N = N + 1
 Next I
 Dim S As Double
 S = 0
 For I = 1 To N
  S = S + A(I)
 Next I
 Range("B6").Value = S
End Sub

Вторая программа предполагает, что в ячейках B12 и B13 рабочего листа записаны 2 даты. Это могут быть строки, интерпретируемые Вашим Excel как даты, например, 01.01.2001 или даты, полученные формулой, скажем, =СЕГОДНЯ()

По нажатию кнопки даты проверяются, если двух дат не найдено, выводится сообщение и программа завершается.

В противном случае мы вычисляем и выводим в ячейку B16 количество дней между датами, а в C12 и C13 — дни недели по русски. Добавьте небольшое оформление и получите простейший калькулятор дат:

Sub Кнопка4_Щелчок() 'Кнопка Вычислить
 Dim d1, d2 As Date
 d1 = Range("B12").Value
 d2 = Range("B13").Value
 'Обработка ошибок ввода (IsNumeric для чисел)
 If (IsDate(d1) = False Or IsDate(d2) = False) Then
  MsgBox "Введите 2 даты", vbOKOnly, "Ошибка"
  Exit Sub
 End If
 'Расчёты
 Days = DateDiff("d", d1, d2, vbMonday)
 Range("B16").Value = Days 'Прошло дней
 Dim A(7) As String
 A(1) = "Пн": A(2) = "Вт": A(3) = "Ср"
 A(4) = "Чт": A(5) = "Пт": A(6) = "Сб"
 A(7) = "Вс"
 wd1 = Weekday(d1, vbMonday) 'Дни недели
 Range("C12").Value = A(wd1)
 wd2 = Weekday(d2, vbMonday)
 Range("C13").Value = A(wd2)
End Sub

пример "интерфейса" для макроса VBA

пример «интерфейса» для макроса VBA

09.05.2018, 10:56 [9935 просмотров]


К этой статье пока нет комментариев, Ваш будет первым

Во время работы в Microsoft Excel каждый пользователь сталкивается с необходимостью выполнить определенные математические расчеты. Не всегда удается решить задачу в уме или при помощи простых формул, поэтому требуется обращение к калькулятору. Напрямую через программу можно запустить системное приложение или использовать макрос для вызова графического меню со скриптом.

В этой статье я расскажу о каждом способе более детально.

Способ 1: Запуск системного приложения «Калькулятор»

В операционной системе Windows по умолчанию присутствует калькулятор, найти который можно в меню «Пуск» (еще можно добавить значок на панель задач или создать ярлык на рабочем столе). Иногда это не совсем удобно, когда требуется доступ к расчетам при взаимодействии с электронными таблицами. Разработчики Excel предлагают запускать калькулятор через панель быстрого доступа, расположив там соответствующий значок. Делается это так:

  1. Запустите программу и пока не открывайте книги, а в главном окне выберите пункт «Параметры», отыскав его на панели слева.Переход в Параметры для включения калькулятора в Excel

  2. Перейдите к разделу «Панель быстрого доступа» и отключите фильтрацию, указав вариант «Все команды» из соответствующего выпадающего меню.Открытие настроек кнопок быстрых действий для включения калькулятора в Excel

  3. Найдите там «Калькулятор» (сделать это будет несложно, поскольку все команды расположены в алфавитном порядке), после чего выделите строку и нажмите кнопку «Добавить» или используйте двойной клик левой кнопкой мыши по надписи «Калькулятор».‎‎‎‎‎‎‎Выбор кнопки быстрых действий для включения калькулятора в Excel

  4. Убедитесь в том, что приложение теперь отображается в списке справа, после чего щелкните по «ОК» для сохранения изменений и выхода из параметров.Добавление кнопки для быстрых действий для включения калькулятора в Excel

  5. После запуска любой книги на панели сверху вы увидите значок с калькулятором. Нажмите по нему для запуска соответствующего приложения.Использование кнопки быстрых действий для включения калькулятора в Excel

  6. Откроется новое окно со стандартной программой, где вы можете выполнять любые расчеты.‎Открытие приложения для включения калькулятора в Excel

Комьюнити теперь в Телеграм

Подпишитесь и будьте в курсе последних IT-новостей

Подписаться

Способ 2: Создание макроса для калькулятора (скрипт)

Excel совместим с Visual Basic и позволяет запускать пользовательские скрипты или макросы, используя для этого сохраненный код в редакторе. Сейчас я не хочу детально рассказывать обо всех особенностях этого процесса взаимодействия с программой, поскольку обычными пользователями применяется он редко, а остановлюсь исключительно на реализации калькулятора, приведя простой скрипт.

  1. Сначала откройте «Параметры» точно так же, как это было показано в предыдущем способе, но на этот раз выберите раздел «Настроить ленту». Выберите команды со вкладками и дважды щелкните по строке с надписью «Разработчик».Включение вкладки разработчика для включения калькулятора в Excel

  2. Примените изменения и откройте любой документ, после чего вы увидите, как в главном окне появилась новая вкладка, по умолчанию отсутствующая в программе. Перейдите на нее и запустите средство «Visual Basic».Переход на вкладку разработчика для включения калькулятора в Excel

  3. ‎‎‎‎Перед вами появится окно с формой для записи кода, а если его нет, через меню «File» самостоятельно вызовите его.Открытие окна для написания кода для включения калькулятора в Excel

  4. Вставьте туда следующее содержимое:‎

    Sub Calculator()
    
    Dim strExpr As String
    
    ' Введение данных для расчета
    
    strExpr = InputBox("Введите данные")
    
    ' Вычисление результата
    
    MsgBox strExpr & " = " & Application.Evaluate(strExpr)
    
    End Sub

    Написание кода для включения калькулятора в Excel

  5. Сохраните результат, задав для макроса подходящее название.Сохранение кода для включения калькулятора в Excel

  6. Если текущая книга не поддерживает макросы, все равно продолжите сохранение, ведь это не скажется на дальнейшем запуске скрипта.Подтверждение сохранения кода для включения калькулятора в Excel

  7. Теперь при надобности запуска калькулятора на той же вкладке нажмите кнопку «Макросы».Открытие окна с доступными макросами для включения калькулятора в Excel

  8. Выберите созданный макрос и щелкните по «Выполнить» левой кнопкой мыши.Запуск созданного макроса для включения калькулятора в Excel

  9. Введите любую математическую операцию, которую хотите выполнить, после чего отправьте задачу на подсчет.Ввод операции во встроенном калькуляторе Excel

  10. ‎‎Через несколько секунд на экране появится окно с результатом выполнения. Используйте данный калькулятор в любой удобный момент, точно так же запуская уже существующий макрос и выполняя любые расчеты.Просмотр результата во встроенном калькуляторе Excel

В окне, в котором производится запуск макроса, можно перейти в его параметры и назначить горячую клавишу, отвечающую за быстрый старт. Это позволит сэкономить время и не обращаться к графическому меню каждый раз, когда нужно будет выполнить какие-либо математические операции.

Способ 3: Встроенные в Excel функции

В завершение отмечу, что многие задачи в Excel реализуемы при помощи встроенных функций, и обращение к калькулятору просто не требуется. Вы можете суммировать или умножать ячейки, возводить их в степень, вычислять процент, находить большее или меньшее значение и многое другое. Перейдя по ссылке ниже, вы найдете другую статью, полностью посвященную работе с функциями. Она вам точно пригодится, если вы только начинаете свое знакомство с электронными таблицами.

Использование функций для включения калькулятора в Excel

Читайте также: Работа с формулами в Excel

Теперь вы знаете, что в Экселе калькулятор доступен в виде графического окна, запускаемого скриптом или кнопками быстрых действий, вызывающими стандартное приложение Windows. Используйте любой из этих методов, чтобы обратиться за помощью к калькулятору, когда нужно будет посчитать сложные выражения или удостовериться в правильности собственных расчетов.

Представляю Вашему вниманию огромный сборник макросов и функций, все макросы сгруппированы по главам, для удобства добавил оглавление с гиперссылками.

P.S.: Где скачал не помню.


Запуск макроса с поиском ячейки
Запуск макроса при открытии книги
Запуск макроса при вводе в ячейку «2»
Запуск макроса при нажатии «Ентер»
Добавить в панель свою вкладку «Надстройки» (Формат ячейки)


Проверка наличия файла по указанному пути_1
Проверка наличия файла по указанному пути_2
Проверка наличия файла по указанному пути_3
Поиск нужного файла_1
Поиск нужного файла_2
Поиск нужного файла_3
Поиск нужного файла_4
Автоматизация удаления файлов
Произвольный текст в строке состояния
Восстановление строки состояния
Бегущая строка в строке состояния
Быстрое изменение заголовка окна
Быстрое изменение заголовка окна_2
Изменение заголовка окна (со скрытием названия файла)
Возврат к первоначальному заголовку
Что открыто в данный момент
Работа с текстовыми файлами
Запись и чтение текстового файла
Обработка нескольких текстовых файлов
Определение конца строки текстового файла
Копирование из текстового файла в эксель
Копирование содержимого в текстовый файл_1
Копирование содержимого в текстовый файл_2
Экспорт данных в HТМL
Создание резервных копий ценных файлов
Подсчет количества открытий файла
Вывод пути к файлу в активную ячейку
Копирование содержимого файла RTF в эксель
Копирование данных из закрытой книги
Извлечение данных из закрытого файла
Поиск слова в файлах
Создание текстового файла и ввод текста в файл
Создание текстового файла и ввод текста (определение конца файла)
Создание документов Word на основе таблицы Excel
Команды создания и удаления каталогов
Получение текущего каталога
Посмотреть все файлы в каталоге_1
Посмотреть все файлы в каталоге_2
Посмотреть все файлы в каталоге_3


Количество имен рабочей книги
Защита рабочей книги
Запрет печати книги
Открытие книги (или текстовых файлов)
Открытие книги и добавление в ячейку А1 текста
Сколько книг открыто
Закрытие всех книг
Закрытие рабочей книги только при выполнении условия
Сохранение рабочей книги с именем, представляющим собой текущую дату
Сохранена ли рабочая книга
Создать книгу с одним листом
Удаление ненужных имен
Быстрое размножение рабочей книги
Сортировка листов
Поиск максимального значения на всех листах книги
Проверка наличия защиты рабочего листа
Список отсортированных листов
Создать новый лист_1
Копирование листа в книге
Копирование листа в новую книгу (создается)
Перемещение листа в книге
Перемещение нескольких листов в новую книгу
Заменить существующий файл
Вставка колонтитула с именем книги, листа и текущей датой
Существует ли лист
Существует ли лист_2
Вывод количества листов в активной книге
Вывод количества листов в активной книге в виде гиперссылок
Вывод имен активных листов по очереди
Вывод имени и номеров листов текущей книги
Сделать лист невидимым
Сколько страниц на всех листах?
Копирование строк на другой лист
Копирование столбцов на другой лист
Подсчет количества ячеек, содержащих указанные значения_1
Подсчет количества ячеек в диапазоне, содержащих указанные значения_2
Подсчет количества видимых ячеек в диапазоне
Определение количества ячеек в диапазоне и суммы их значений
Подсчет количества ячеек
Автоматический пересчет данных таблицы при изменении ее значений
Ввод данных в ячейки
Ввод данных с использованием формул
Ввод текстоввых данных в ячейки
Вывод в ячейки названия книги, листа и количества листов
Удаление пустых строк_1
Удаление пустых строк_2
Удаление пустых строк_3
Удаление строки по условию
Удаление используемых скрытых строк или строк с нулевой высотой
Удаление дубликатов по маске
Выделение диапазона над текущей ячейкой
Выделение диапазона над текущей ячейкой_2
Выделение отрицательных значений
Выделение диапазона и использование абсолютных адресов
Выделение ячеек через интервал_2
Движение по ячейкам
Поиск ближайшей пустой ячейки столбца
Поиск максимального значения
Поиск и замена по шаблону
Поиск значения с отображением результата в отдельном окне
Поиск с выделением найденных данных_1
Поиск с выделением найденных данных_2
Поиск по условию в диапазоне
Поиск последней непустой ячейки диапазона
Поиск последней непустой ячейки столбца
Поиск последней непустой ячейки строки
Поиск ячейки синего цвета в диапазоне
Поиск наличия значения в столбце
Поиск совпадений в диапазоне
Поиск ячейки в диапазоне_1
Поиск ячейки в диапазоне_2
Поиск приближенного значения в диапазоне
Поиск начала и окончания диапазона, содержащего данные
Автоматическая замена значений
Быстрое заполнение диапазона (массив)
Заполнение через интервал(массив)
Заполнение указанного диапазона(массив)
Заполнение диапазона(массив)
Расчет суммы первых значений диапазона
Размещение в ячейке электронных часов
«Будильник»
Адрес активной ячейки
Координаты активной ячейки
Формула активной ячейки
Получение из ячейки формулы
Тип данных ячейки
Вывод адреса конца диапазона
Получение информации о выделенном диапазоне
Создание изменяемого списка (таблица)
Умножение выделенного диапазона на 2
Одновременное умножение всех данных диапазона
Деление диапазона на 100
Суммирование данных только видимых ячеек
Сумма ячеек с числовыми значениями
При суммировании — курсор внутри диапазона
Начисление процентов в зависимости от суммы_1
Начисление процентов в зависимости от суммы_2
Начисление процентов в зависимости от суммы_3
Сводный пример расчета комиссионного вознаграждения
Движение по диапазону
Сдвиг от выделенной ячейки
Создание заливки диапазона
Подбор параметра ячейки
Разбиение диапазона
Объединение данных диапазона
Объединение данных диапазона_2
Узнать максимальную колонку или строку.
Ограничение возможных значений диапазона
Тестирование скорости чтения и записи диапазонов
Открыть MsgBox при выборе ячейки
Скрытие строки
Скрытие нескольких строк
Скрытие столбца
Скрытие нескольких столбцов
Скрытие строки по имени ячейки
Скрытие нескольких строк по адресам ячеек
Скрытие столбца по имени ячейки
Скрытие нескольких столбцов по адресам ячеек
Мигание ячейки


Вывод на экран всех примечаний рабочего листа
Функция извлечения комментария
Список примечаний защищенных листов
Перечень примечаний в отдельном списке_1
Перечень примечаний в отдельном списке_2
Перечень примечаний в отдельном списке_3
Подсчет количества примечаний_1
Подсчет примечаний_3
Выделение ячеек с примечаниями
Отображение всех примечаний
Изменение цвета примечаний
Добавление примечаний
Добавление примечаний в диапазон по условию
Перенос комментария в ячейку и обратно
Перенос значений из ячейки в комментарий_1
Перенос значений из ячейки в комментарий_2


Дополнение панели инструментов
Добавление кнопки на панель инструментов
Панель с одной кнопкой
Панель с двумя кнопками
Создание панели справа
Вызов предварительного просмотра
Создание пользовательского меню (вариант 1)
Создание пользовательского меню (вариант 2)
Создание пользовательского меню (вариант 3)
Создание пользовательского меню (вариант 4)
Создание пользовательского меню (вариант 5)
Создание списка пунктов главного меню Excel
Создание списка пунктов контекстных меню
Отображение панели инструментов при определенном условии
Скрытие и отображение панелей инструментов
Создать подсказку к моим кнопкам
Создание меню на основе данных рабочего листа
Создание контекстного меню
Блокировка контекстного меню
Добавление команды в меню Сервис
Добавление команды в меню Вид
Создание панели со списком
Мультфильм с помощником в главной роли
Дополнение помощника текстом, заголовком, кнопкой и значком
Новые параметры помощника
Использование помощника для выбора цвета заливки


Функция INPUTBOX (через ввод значения)
Настройка ввода данных в диалоговом окне
Открытие диалогового окна (“Открыть файл”)_1
Вызов броузера из Экселя
Диалоговое окно ввода данных
Значения по умолчанию


Вывод списка доступных шрифтов
Выбор из текста всех чисел
Прописная буква только в начале текста
Подсчет количества повторов искомого текста
Выделение из текста произвольного элемента
Отображение текста «задом наперед»
Запуск таблицы символов из Excel


Получить имя пользователя
Вывод разрешения монитора
Получение информации об используемом принтере
Просмотр информации о дисках компьютера


Построение диаграммы с помощью макроса
Сохранение диаграммы в отдельном файле
Построение и удаление диаграммы нажатием одной кнопки
Применение случайной цветовой палитры
Эффект прозрачности диаграммы
Построение диаграммы на основе данных нескольких рабочих листов
Создание подписей к данным диаграммы


Программа для составления кроссвордов
Игра «Минное поле»
Игра «Угадай животное»
Расчет на основании ячеек определенного цвета


Вызов функциональных клавиш
Расчет среднего арифметического значения
Перевод чисел в «деньги»
Поиск ближайшего понедельника
Подсчет количества полных лет
Расчет средневзвешенного значения
Преобразование номера месяца в его название
Использование относительных ссылок
Преобразование таблицы Excel в HТМL-формат
Генератор случайных чисел
Случайные числа — на основании диапазона
Применение функции без ввода ее в ячейку
Подсчет именованных объектов
Включение автофильтра с помощью макроса
Создание бегущей строки
Создание бегущей картинки
Вращающиеся автофигуры
Вызов таблицы цветов
Создание калькулятора
Склонение фамилии, имени и отчества


Вывод даты и времени_1
Вывод даты и времени_2
Получение системной даты
Извлечение даты и часов
Функция ДатаПолная

К сообщению приложен файл: macros.rar (83Kb)

ГЛАВА 1. МАКРОСЫ

Запуск макроса с поиском ячейки

Запуск макроса при открытии книги

Запуск макроса при вводе в ячейку «2»

Запуск макроса при нажатии «Ентер»

Добавить в панель свою вкладку «Надстройки» (Формат ячейки)

ГЛАВА 2. РАБОТА С ФАЙЛАМИ (Т.Е.ОБМЕН ДАННЫМИ С ТХТ, RTF, XLS И Т.Д.)

Проверка наличия файла по указанному пути_1

Проверка наличия файла по указанному пути_2

Проверка наличия файла по указанному пути_3

Поиск нужного файла_1

Поиск нужного файла_2

Поиск нужного файла_3

Поиск нужного файла_4

Автоматизация удаления файлов

Произвольный текст в строке состояния

Восстановление строки состояния

Бегущая строка в строке состояния

Быстрое изменение заголовка окна

Быстрое изменение заголовка окна_2

Изменение заголовка окна (со скрытием названия файла)

Возврат к первоначальному заголовку

Что открыто в данный момент

Работа с текстовыми файлами

Запись и чтение текстового файла

Обработка нескольких текстовых файлов

Определение конца строки текстового файла

Копирование из текстового файла в эксель

Копирование содержимого в текстовый файл_1

Копирование содержимого в текстовый файл_2

Экспорт данных в HТМL

Создание резервных копий ценных файлов

Подсчет количества открытий файла

Вывод пути к файлу в активную ячейку

Копирование содержимого файла RTF в эксель

Копирование данных из закрытой книги

Извлечение данных из закрытого файла

Поиск слова в файлах

Создание текстового файла и ввод текста в файл

Создание текстового файла и ввод текста (определение конца файла)

Создание документов Word на основе таблицы Excel

Команды создания и удаления каталогов

Получение  текущего каталога

Посмотреть все файлы в каталоге_1

Посмотреть все файлы в каталоге_2

Посмотреть все файлы в каталоге_3

ГЛАВА 3. РАБОЧАЯ ОБЛАСТЬ MICROSOFT EXCEL

Количество имен рабочей книги

Защита рабочей книги

Запрет печати книги

Открытие книги (или текстовых файлов)

Открытие книги и добавление в ячейку А1 текста

Сколько книг открыто

Закрытие всех книг

Закрытие рабочей книги только при выполнении условия

Сохранение рабочей книги с именем, представляющим собой текущую дату

Сохранена ли рабочая книга

Создать книгу с одним листом

Удаление ненужных имен

Быстрое размножение рабочей книги

Сортировка листов

Поиск максимального значения на всех листах книги

Проверка наличия защиты рабочего листа

Список отсортированных листов

Создать новый лист_1

Копирование листа в книге

Копирование листа в новую книгу (создается)

Перемещение листа в книге

Перемещение нескольких листов в новую книгу

Заменить существующий файл

Вставка колонтитула с именем книги, листа и текущей датой

Существует ли лист

Существует ли лист_2

Вывод количества листов в активной книге

Вывод количества листов в активной книге в виде гиперссылок

Вывод имен активных листов по очереди

Вывод имени и номеров листов текущей книги

Сделать лист невидимым

Сколько страниц на всех листах?

Копирование строк на другой лист

Копирование столбцов на другой лист

Подсчет количества ячеек, содержащих указанные значения_1

Подсчет количества ячеек в диапазоне, содержащих указанные значения_2

Подсчет количества видимых ячеек в диапазоне

Определение количества ячеек в диапазоне и суммы их значений

Подсчет количества ячеек

Автоматический пересчет данных таблицы при изменении ее значений

Ввод данных в ячейки

Ввод данных с использованием формул

Ввод текстоввых данных в ячейки

Вывод в ячейки названия книги, листа и количества листов

Удаление пустых строк_1

Удаление пустых строк_2

Удаление пустых строк_3

Удаление строки по условию

Удаление используемых скрытых строк или строк с нулевой высотой

Удаление дубликатов по маске

Выделение диапазона над текущей ячейкой

Выделение диапазона над текущей ячейкой_2

Выделение отрицательных значений

Выделение диапазона и использование абсолютных адресов

Выделение ячеек через интервал_2

Движение по ячейкам

Поиск ближайшей пустой ячейки столбца

Поиск максимального значения

Поиск и замена по шаблону

Поиск значения с отображением результата в отдельном окне

Поиск с выделением найденных данных_1

Поиск с выделением найденных данных_2

Поиск по условию в диапазоне

Поиск последней непустой ячейки диапазона

Поиск последней непустой ячейки столбца

Поиск последней непустой ячейки строки

Поиск ячейки синего цвета в диапазоне

Поиск наличия значения в столбце

Поиск совпадений в диапазоне

Поиск ячейки в диапазоне_1

Поиск  ячейки в диапазоне_2

Поиск приближенного значения в диапазоне

Поиск начала и окончания диапазона, содержащего данные

Автоматическая замена значений

Быстрое заполнение диапазона (массив)

Заполнение через интервал(массив)

Заполнение указанного диапазона(массив)

Заполнение диапазона(массив)

Расчет суммы первых значений диапазона

Размещение в ячейке электронных часов

«Будильник»

Адрес активной ячейки

Координаты активной ячейки

Формула активной ячейки

Получение из ячейки формулы

Тип данных ячейки

Вывод адреса конца диапазона

Получение информации о выделенном диапазоне

Создание изменяемого списка (таблица)

Умножение выделенного диапазона на 2

Одновременное умножение всех данных диапазона

Деление диапазона на 100

Суммирование данных только видимых ячеек

Сумма ячеек с числовыми значениями

При суммировании — курсор внутри диапазона

Начисление процентов в зависимости от суммы_1

Начисление процентов в зависимости от суммы_2

Начисление процентов в зависимости от суммы_3

Сводный пример расчета комиссионного вознаграждения

Движение по диапазону

Сдвиг от выделенной ячейки

Создание заливки диапазона

Подбор параметра ячейки

Разбиение диапазона

Объединение данных диапазона

Объединение данных диапазона_2

Узнать максимальную колонку или строку.

Ограничение возможных значений диапазона

Тестирование скорости чтения и записи диапазонов

Открыть MsgBox при выборе ячейки

Скрытие строки

Скрытие нескольких строк

Скрытие столбца

Скрытие нескольких столбцов

Скрытие строки по имени ячейки

Скрытие нескольких строк по адресам ячеек

Скрытие столбца по имени ячейки

Скрытие нескольких столбцов по адресам ячеек

Мигание ячейки

ГЛАВА 4. РАБОТА С ПРИМЕЧАНИЯМИ

Вывод на экран всех примечаний рабочего листа

Функция извлечения комментария

Список примечаний защищенных листов

Перечень примечаний в отдельном списке_1

Перечень примечаний в отдельном списке_2

Перечень примечаний в отдельном списке_3

Подсчет количества примечаний_1

Подсчет примечаний_3

Выделение ячеек с примечаниями

Отображение всех примечаний

Изменение цвета примечаний

Добавление примечаний

Добавление примечаний в диапазон по условию

Перенос комментария в ячейку и обратно

Перенос значений из ячейки в комментарий_1

Перенос значений из ячейки в комментарий_2

ГЛАВА 5 . ПОЛЬЗОВАТЕЛЬСКИЕ ВКЛАДКИ НА ЛЕНТЕ

Дополнение панели инструментов

Добавление кнопки на панель инструментов

Панель с одной кнопкой

Панель с двумя кнопками

Создание панели справа

Вызов предварительного просмотра

Создание пользовательского меню (вариант 1)

Создание пользовательского меню (вариант 2)

Создание пользовательского меню (вариант 3)

Создание пользовательского меню (вариант 4)

Создание пользовательского меню (вариант 5)

Создание списка пунктов главного меню Excel

Создание списка пунктов контекстных меню

Отображение панели инструментов при определенном условии

Скрытие и отображение панелей инструментов

Создать подсказку к моим кнопкам

Создание меню на основе данных рабочего листа

Создание контекстного меню

Блокировка контекстного меню

Добавление команды в меню Сервис

Добавление команды в меню Вид

Создание панели со списком

Мультфильм с помощником в главной роли

Дополнение помощника текстом, заголовком, кнопкой и значком

Новые параметры помощника

Использование помощника для выбора цвета заливки

ГЛАВА 6. ДИАЛОГОВЫЕ ОКНА

Функция INPUTBOX (через ввод значения)

Настройка ввода данных в диалоговом окне

Открытие диалогового окна (“Открыть файл”)_1

Вызов броузера из Экселя

Диалоговое окно ввода данных

Значения по умолчанию

ГЛАВА 7.ФОРМАТИРОВАНИЕ ТЕКСТА. ТАБЛИЦЫ. ГРАНИЦЫ И ЗАЛИВКА.

Вывод списка доступных шрифтов

Выбор из текста всех чисел

Прописная буква только в начале текста

Подсчет количества повторов искомого текста

Выделение из текста произвольного элемента

Отображение текста «задом наперед»

Запуск таблицы символов из Excel

ГЛАВА 8 ИНФОРМАЦИЯ О ПОЛЬЗОВАТЕЛЕ, КОМПЬЮТЕРЕ, ПРИНТЕРЕ И Т.Д.

Получить имя пользователя

Вывод разрешения монитора

Получение информации об используемом принтере

Просмотр информации о дисках компьютера

ГЛАВА 9. ДИАГРАММЫ

Построение диаграммы с помощью макроса

Сохранение диаграммы в отдельном файле

Построение и удаление диаграммы нажатием одной кнопки

Применение случайной цветовой палитры

Эффект прозрачности диаграммы

Построение диаграммы на основе данных нескольких рабочих листов

Создание подписей к данным диаграммы

ГЛАВА 10. РАЗНЫЕ ПРОГРАММЫ.

Программа для составления кроссвордов

Игра «Минное поле»

Игра «Угадай животное»

Расчет на основании ячеек определенного цвета

ГЛАВА 11. ДРУГИЕ ФУНКЦИИ И МАКРОСЫ

Вызов функциональных клавиш

Расчет среднего арифметического значения

Перевод чисел в «деньги»

Поиск ближайшего понедельника

Подсчет количества полных лет

Расчет средневзвешенного значения

Преобразование номера месяца в его название

Использование относительных ссылок

Преобразование таблицы Excel в HТМL-формат

Генератор случайных чисел

Случайные числа — на основании диапазона

Применение функции без ввода ее в ячейку

Подсчет именованных объектов

Включение автофильтра с помощью макроса

Создание бегущей строки

Создание бегущей картинки

Вращающиеся автофигуры

Вызов таблицы цветов

Создание калькулятора

Склонение фамилии, имени и отчества

ГЛАВА 12. ДАТА И ВРЕМЯ

Вывод даты и времени_1

Вывод даты и времени_2

Получение системной даты

Извлечение даты и часов

Функция ДатаПолная

ГЛАВА 1. МАКРОСЫ

Запуск макроса с поиском ячейки

‘ Sub  GotoFixedCell:

‘ Делает активной ячейку, содержащую значение vVariant на

‘ рабочем листе sSheetName в активной рабочей книге.

‘ Note: Содержимое ячеек интерпретируется как ‘значение’!

Public Sub GotoFixedCell(vValue As Variant, sSheetName As String)

  Dim c As Range, cStart As Range, cForFind As Range

  Dim i As Integer

  On Error GoTo errhandle:

  Set cForFind = Worksheets(sSheetName).Cells   ‘ Диапазон поиска

     With cForFind

       Set c = .Find(What:=vValue, After:=ActiveCell, LookIn:=xlValues, _

                LookAt:= xlРart, SearchOrder:=xlByRows,_

                SearchDirection:=xlNext, MatchCase:=False)

       Set cStart = c

       While Not c Is Nothing

         Set c = .FindNext(c)

         If c.Address = cStart.Address Then

           c.Select

           Exit Sub

         End If

       Wend

     End With

  Exit Sub

  errНandle:

    MsgBox Err.Descriрtion, vbExclamation, «Error #» & Err.Number

End Sub

Запуск макроса при открытии книги

Sub Auto_Oрen()

Запуск макроса при вводе в ячейку «2»

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim w As Object

    ‘On Error Resume Next

    If Range(«A1»).Value = 2 Then

        MsgBox «Ох! Значение ячейки стало равным 2-м!»

        MsgBox «Я попробую сейчас открыть модуль с процедурой, которая все это делает!»

        Application.VBE.MainWindow.SetFocus

        Application.VBE.Windows(1).SetFocus

        SendKeys «{F7}», True

    End If

End Sub

Запуск макроса при нажатии «Ентер»

в модуле листа

Private Sub Worksheet_Selectiоnchange(ByVal Target As Range)

Application.OnKey «{~}», «StartEnter»

End Sub

в модуле книги

Sub StartEnter()

MsgBox («sadfsdfsf»)

End Sub

Добавить в панель свою вкладку «Надстройки» (Формат ячейки)

Код в модуле рабочего листа

Sub Worksheet_Change(ByVal Target As Excel.Range)

   Call updаtеToolbar

End Sub

Sub Worksheet_Selectiоnchange(ByVal Target As Excel.Range)

   Call updаtеToolbar

End Sub

Листинг 2.43. Код в стандартном модуле

Sub FastChangeNumberFormat()

   Dim bar As CommandBar

   Dim button As CommandBarButton

   ‘ Удаление существующей панели инструментов (если она есть)

   On Error Resume Next

   CommandBars(«Числовой формат»).Delete

   On Error GoTo 0

   ‘ Формирование новой панели

   Set bar = CommandBars.Add

   With bar

      .Name = «Числовой формат»

      .Visible = True

   End With

   ‘ Создание кнопки

   Set button = CommandBars(«Числовой формат»).Controls.Add _

    (Type:=msoControlButton)

   With button

      .Caption = «»

      .OnAction = «ChangeNumFormat»

      .TooltipText = «Щелкните для изменения числового формата»

      .Style = msoButtonCaption

   End With

   ‘ Обновление созданной панели инструментов

   Call updаtеToolbar

End Sub

Sub updаtеToolbar()

   ‘ Обновление панели инструментов (если она создана)

   On Error Resume Next

   ‘ Изменение заголовка кнопки (на название формата выделенной ячейки)

   CommandBars(«Числовой формат»).Controls(1).Caption = _

    ActiveCell.NumberFormat

End Sub

Sub ChangeNumFormat()

   ‘ Отображение диалогового окна изменения формата ячейки

   Application.Dialogs(xlDialogFormatNumber).Show

   Call updаtеToolbar

End Sub

ГЛАВА 2. РАБОТА С ФАЙЛАМИ (Т.Е.ОБМЕН ДАННЫМИ С ТХТ, RTF, XLS И Т.Д.)

Проверка наличия файла по указанному пути_1

Sub VerifyFileLocation()

   Dim strFileName As String

   Dim strFileTitle As String

   ‘ Имя и путь искомого файла

   strFileTitle = «primer.xls»

   strFileName = «C:Документыprimer.xls»

   ‘ Проверка наличия файла (функция Dir возвращает пустую _

    строку, если по указанному пути файл обнаружить не удалось)

   If Dir(strFileName) <> «» Then

      MsgBox «Файл » & strFileTitle & » найден»

   Else

      MsgBox «Файл » & strFileTitle & » не найден»

   End If

End Sub

Проверка наличия файла по указанному пути_2

Sub VerifyFileLocation1()

   Dim strFileName As String

   ‘ Имя искомого файла

   strFileName = «C:Документыprimer.xls»

   ‘ Проверка наличия файла (функция Dir возвращает пустую _

    строку, если по указанному пути файл обнаружить не удалось)

   If Dir(strFileName) <> «» Then

      MsgBox «Файл » & strFileName & » найден»

   Else

      MsgBox «Файл » & strFileName & » не найден»

   End If

End Sub

Проверка наличия файла по указанному пути_3

Sub Check_Disk()

On Error Resume Next

If Dir(«\192.168.1.200c», vbSystem) <> «» Then

If Err = 52 Then

Err.Clear

MsgBox «Диска нет!», 48, «Ошибка»

Exit Sub

End If

If Err <> 0 Then

MsgBox «Произошло ошибка!», 48, «Ошибка»

Exit Sub

Else

On Error GoTo 0

MsgBox «Диск есть!», 64, «»

End If

End If

End Sub

Поиск нужного файла_1

Sub FileSearch()

   Dim strFileName As String

   Dim strFolder As String

   Dim strFullPath As String

   ‘ Задание имени папки для поиска

   strFolder = InputBox(«Определите папку:»)

   If strFolder = «» Then Exit Sub

   ‘ Задание имени файла для поиска

   strFileName = Application.InputBox(«Введите имя файла:»)

   If strFileName = «» Then Exit Sub

   ‘ При необходимости дополняем имя папки «»

   If Right(strFolder, 1) <> «» Then strFolder = strFolder & «»

   ‘ Полный путь файла

   strFullPath = strFolder & strFileName

   ‘ Вывод окна с отчетом о поиске средствами VBA

   MsgBox «Использование команды VBA…» & vbCrLf & vbCrLf & _

    dhSearchVBA(strFullPath), vbInformation, strFullPath

   ‘ Вывод окна с отчетом о поиске средствами объекта FileSearch

   MsgBox «Использование объекта FileSearch…» & vbCrLf & _

    vbCrLf & dhSearchFileSearch(strFolder, strFileName), vbInformation, _

    strFullPath

   ‘ Вывод окна с отчетом о поиске средствами объекта _

    FileSystemObject

   MsgBox «Использование объекта FileSystemObject…» & vbCrLf & _

    vbCrLf & dhSearchFileSystemObject(strFullPath), vbInformation, _

    strFullPath

End Sub

Поиск нужного файла_2

Function dhSearchVBA(varFullPath As Variant) As Boolean

   ‘ Использование команды VBA

   dhSearchVBA = Dir(varFullPath) <> «»

End Function

Поиск нужного файла_3

Function dhSearchFileSearch(varFolder As Variant, varFileName _

 As Variant) As Boolean

   ‘ Использование объекта FileSearch

   With Application.FileSearch

      ‘ Создание нового поиска

      .NewSearch

      ‘ Имя для поиска

      .FileName = varFileName

      ‘ Папка поиска

      .LookIn = varFolder

      ‘ Собственно поиск

      .Execute

      dhSearchFileSearch = .FoundFiles.Count <> 0

   End With

End Function

Поиск нужного файла_4

Function dhSearchFileSystemObject(varFullPath As Variant) As Boolean

   Dim objFSObject As Object

   ‘ Использование объекта FileSystemObject

   Set objFSObject = CreateObject(«sсriрting.FileSystemObject»)

   dhSearchFileSystemObject = objFSObject.FileExists(varFullPath)

End Function

Автоматизация удаления файлов

Листинг 3.51. Удаление файла

Sub DeleteFile()

   Kill «C:Документыprimer.xls»

End Sub

Листинг 3.52. Удаление группы файлов

Sub DeleteFiles()

   ‘ Удаление всех файлов с расширением XLS из заданной папки

   Kill «C:Документы» & «*.xls»

End Sub

Произвольный текст в строке состояния

Sub ChangeStatusBarText()

   Application.StatusBar = «Как надоело работать!!!»

End Sub

Восстановление строки состояния

Sub ReturnStatusBarText()

   Application.StatusBar = False

End Sub

Бегущая строка в строке состояния

Sub MovingTextInStatusBar()

   Dim intSpaces As Integer

   ‘ Изменение количества пробелов в начале строки (от 20 до 0) — _

    строка бежит (скорее, ползет) влево

   For intSpaces = 20 To 0 Step -1

      ‘ Запись текста в строку состояния

      Application.StatusBar = Space(intSpaces) & «Как надоело работать!!!»

      ‘ Выдерживаем паузу

      Application.Wait Now + TimeValue(«00:00:01»)

      ‘ Дадим Excel обработать пользовательский ввод

      DoEvents

   Next

   Application.StatusBar = False

End Sub

Быстрое изменение заголовка окна

Sub NewTitle()

   Application.Caption = «Какая хорошая погода»

End Sub

Быстрое изменение заголовка окна_2

Sub NewTitle()

   Application.Caption = «Какая хорошая погода»

   ActiveWindow.Caption = «А завтра будет дождь»

End Sub

Изменение заголовка окна (со скрытием названия файла)

Sub NewTitle()

   Application.Caption = «Какая хорошая погода»

   ActiveWindow.Caption = «»

End Sub

Возврат к первоначальному заголовку

Sub ReturnTitle()

   ‘ Возвращение заголовка приложения (то есть Excel)

   Application.Caption = Empty

   ‘ Указание правильного названия открытого файла (книги)

   ActiveWindow.Caption = ThisWorkbook.Name

End Sub

Что открыто в данный момент

Sub WorkBooksList()

   Dim book As Object

   ‘ Вывод имени каждой рабочей книги

   For Each book In Workbooks

      MsgBox (book.Name)

   Next

End Sub

Работа с текстовыми файлами

Открываются файлы командой Open, а закрываются — командой Close.

Sub Test()

   Open «file.txt» For Input As #1

   Close #1

End Sub

Запись и чтение текстового файла

Sub Test()

   Open «file.txt» For Output As #1

   Print #1, «Этот текст будет записан в файл»

   Close #1

   Open «file.txt» For Input As #1

   Dim s As String

   Input #1, s

   MsgBox s

   Close #1

End Sub

Для записи используется оператор Print, а для чтения — Input. У этих операторов есть свои особенности.

Print #1, «Hello , File»

Оператор Input #1 прочитает только Hello и все. Запятая воспринимается как разделитеть. Чтобы прочитать строку целиком, используется оператор Line Input.

Sub Test()

   Open «file.txt» For Output As #1

   Print #1, «Hello , File»

   Close #1

   Open «file.txt» For Input As #1

   Dim s As String

   Line Input #1, s

   MsgBox s

   Close #1

End Sub

Обработка нескольких текстовых файлов

Sub ImportTextFiles()

   Dim fsSearch As FileSearch

   Dim strFileName As String

   Dim strPath As String

   Dim i As Integer

   ‘ Задание пути и возможного имени файла

   strFileName = ThisWorkbook.path & «»

   strPath = «text??.txt»

   ‘ Создание объекта FileSearch

   Set fsSearch = Application.FileSearch

   ‘ Настройка объекта для поиска

   With fsSearch

      ‘ Маска для поиска

      .LookIn = strFileName

      ‘ Путь для поиска

      .FileName = strPath

      ‘ Поиск всех файлов, удовлетворяющих маске

      .Execute

      ‘ Выход, если файлы не существуют

      If .FoundFiles.Count = 0 Then

         MsgBox «Файлы не обнаружены»

         Exit Sub

      End If

   End With

   ‘ Обработка найденных файлов

   For i = 1 To fsSearch.FoundFiles.Count

      Call ImportTextFile(fsSearch.FoundFiles(i))

   Next i

End Sub

Sub ImportTextFile(FileName As String)

   ‘ Импорт файла

   Workbooks.OpenText FileName:=FileName, _

    Origin:=xlWindows, _

    StartRow:=1, _

    DataType:=xlFixedWidth, _

    FieldInfo:= _

    Array(Array(0, 1), Array(3, 1), Array(12, 1))

   ‘ Ввод формул суммирования

   Range(«D1»).Value = «A»

   Range(«D2»).Value = «B»

   Range(«D3»).Value = «C»

   Range(«E1:E3»).Formula = «=COUNTIF(B:B,D1)»

   Range(«F1:F3»).Formula = «=SUMIF(B:B,D1,C:C)»

End Sub

Определение конца строки текстового файла

Sub Test()

   Open «file.txt» For Output As #1

   Print #1, «Hello , File»

   Close #1

   Open «file.txt» For Input As #1

   Dim s As String

   While Not EOF(1)

     Input #1, s

     MsgBox s

   Wend

   Close #1

End Sub

Копирование из текстового файла в эксель

Dim TextLine

i = 1

Open «C:MyFile.txt» For Input As #1

Do While Not EOF(1)

Line Input #1, TextLine

ThisWorkbook.Worksheets(«Лист1»).Cells(i, 1).Value = TextLine

i = i + 1

Loop

Close #1

Копирование содержимого в текстовый файл_1

Sub Range2TXT()

  MyFile = «C:File.txt» ‘путь к файлу

  Open MyFile For Output As #1 ‘открыли для записи

  For Each i In Selection ‘листаем ячейки выделенного диапазона

    Print #1, i ‘пишем (с начала)

  Next

  Close #1 ‘закрываем

End Sub

Копирование содержимого в текстовый файл_2

Sub SaveAsText()

   Dim cell As Range

   ‘ Открытие файла для сохранения (имя файла соответствует имени _

    рабочей книги, но отличается расширением — TXT)

   Open ThisWorkbook.Path & «» & ThisWorkbook.Name & «.txt» _

    For Output As #1

   ‘ Запись содержимого заполненных ячеек таблицы в файл

   For Each cell In ActiveSheet.UsedRange

      If Not IsEmpty(cell) Then

         Print #1, cell.Address, cell.Formula

      End If

   Next

   ‘ Не забываем закрывать файл

   Close #1

End Sub

Экспорт данных в txt

Sub ExportAsText()

   Dim lngRow As ****

   Dim intCol As Integer

   ‘ Открытие файла для сохранения

   Open «C:primer.txt» For Output As #1

   ‘ Запись выделенной части таблицы в файл (построчно)

   For lngRow = 1 To Selection.Rows.Count

      ‘ Запись содержимого всех столбцов строки lngRow

      For intCol = 1 To Selection.Columns.Count

         Write #1, Selection.Cells(lngRow, intCol).Value;

      Next intCol

      ‘ Начнем новую строку в файле

      Print #1, «»

   Next lngRow

   ‘ Не забываем закрыть файл

   Close #1

End Sub

Sub ImportText()

   Dim strLine As String         ‘ Одна строка файла

   Dim strCurChar As String * 1  ‘ Анализируемый символ строки файла

   Dim strValue As String        ‘ Значение для записи в ячейку

   Dim lngRow As ****            ‘ Номер текущей строки

   Dim intCol As Integer         ‘ Номер текущего столбца

   Dim i As Integer

   ‘ Открытие импортируемого файла

   Open «C:primer.txt» For Input As #1

   ‘ Считываем все строки файла и записываем данные, разделенные _

    запятой, в ячейки таблицы (начиная с текущей ячейки)

   Do Until EOF(1)

      ‘ Считываем строку из файла

      Line Input #1, strLine

      ‘ Разбираем считанную строку

      For i = 1 To Len(strLine)

         strCurChar = Mid(strLine, i, 1)

         If strCurChar = «,» Then

            ‘ Найден разделитель столбцов — запятая. Запишем _

             сформированное значение в ячейку

            ActiveCell.Offset(lngRow, intCol) = strValue

            intCol = intCol + 1

            strValue = «»

         ElseIf i = Len(strLine) Then

            ‘ Конец строки — запишем в таблицу последнее _

             значение в строке (перед этим дополним его последним _

             символом строки, кроме кавычки)

            If strCurChar <> Chr(34) Then

               strValue = strValue & strCurChar

            End If

            ‘ Запись в таблицу

            ActiveCell.Offset(lngRow, intCol) = strValue

            strValue = «»

         ElseIf strCurChar <> Chr(34) Then

            ‘ Добавление символа в формируемое значение ячейки _

             (кавычки игнорируются)

            strValue = strValue & strCurChar

         End If

      Next i

      ‘ Переход к новой строке таблицы

      intCol = 0

      lngRow = lngRow + 1

   Loop

   ‘ Закрываем файл

   Close #1

End Sub

Экспорт данных в HТМL

Sub ExportAsHТМLFile()

   Dim strStyle As String     ‘ Параметры стиля отображения ячейки

   Dim strAlign As String     ‘ Параметры выравнивания ячейки

   Dim strOut As String       ‘ Выходная строка с HТМL-кодом

   Dim cell As Object         ‘ Обрабатываемая ячейка

   Dim strCellText As String  ‘ Текст обрабатываемой ячейки

   Dim lngRow As ****         ‘ Номер строки обрабатываемой ячейки

   Dim lngLastRow As ****     ‘ Номер строки предыдущей ячейки

   Dim strTemp As String

   Dim strFileName As String  ‘ Имя файла для сохранения HТМL-кода

   Dim i As ****

   ‘ Запрос у пользователя имени файла для сохранения

   strFileName = Application.GetSaveAsFilename( _

    InitialFileName:=»Primer.htm», _

    fileFilter:=»HТМL Files(*.htm), *.htm»)

   ‘ Проверка, задал ли пользователь имя файла (если нет, _

    то можно выходить)

   If strFileName = «» Then Exit Sub

   lngLastRow = Selection.Row

   ‘ Просмотр всех выделенных ячеек

   For Each cell In Selection

      ‘ Значение строки для рассматриваемой ячейки

      lngRow = cell.Row

      ‘ Если перешли на другую строку, то вставляем <tr>

      If lngRow <> lngLastRow Then

         strOut = strOut & vbTab & «</tr>» & vbCrLf & vbTab & _

          «<tr>» & vbCrLf

         ‘ Переход на следующую сроку

         lngLastRow = lngRow

      End If

      ‘ Задание шрифта ячейки

      If Not IsNull(cell.Font.Size) Then

         strStyle = » style=» & «font-size: » & Int(100 * _

          cell.Font.Size / 19) & «%;»

      End If

      ‘ Для полужирного шрифта вставляем <b>

      If cell.Font.Bold Then

         strCellText = «<b>» & strCellText & «</b>»

      End If

      ‘ Задание выравнивания

      If cell.HorizontalAlignment = xlRight Then

         ‘ По правому краю

         strAlign = » align=» & «right»

      ElseIf cell.HorizontalAlignment = xlCenter Then

         ‘ По центру

         strAlign = » align=» & «center»

      Else

         ‘ По левому краю (по умолчанию)

         strAlign = «»

      End If

      ‘ Чтение текста в ячейке

      strCellText = cell.Text

      ‘ Если нужно, то вертикальный вывод текста (в строку strTemp _

       с последующим перенесением обратно в strCellText)

      If cell.Orientation <> xlHorizontal Then

         strTemp = «»

         ‘ Печать после каждого символа специального _

          разделителя — <br>

         For i = 1 To Len(strCellText)

            strTemp = strTemp & Mid$(strCellText, i, 1) & «<br>»

         Next i

         strCellText = strTemp

         strStyle = «»

      End If

      strOut = strOut & vbTab & vbTab & «<td» & strStyle & _

       strAlign & «>» & strCellText & «</td>» & vbCrLf

   Next

   ‘ Вставка <tr> для первой строки и </tr> — для последней

   strOut = vbTab & «<tr>» & vbCrLf & strOut & vbTab & «</tr>» & vbCrLf

   ‘ Вставка дескриптора <table>

   strOut = «<table border=1 cellpadding=3 cellspacing=1>» _

    & vbCrLf & strOut & vbCrLf & «</table>»

   ‘ Сохранение HТМL-кода в файл

   Open strFileName For Output As 1

   Print #1, strOut

   Close 1

   ‘ Вывод окна с информационным сообщением о результатах работы

   MsgBox Selection.Count & » ячеек экспортировано в файл » & _

    strFileName

End Sub

Импорт данных, для которых нужно более 256 столбцов

Sub ImportWideSheet()

   Dim rgRange As Range              ‘ Хранит заполняемую ячейку

   Dim lngRow As ****                ‘ Хранит номер текущей строки

   Dim intCol As Integer             ‘ Хранит номер текущего столбца

   Dim i As Integer

   Dim strLine As String             ‘ Обрабатываемая строка (из файла)

   Dim strCurChar As String * 1

   Dim strCellValue As String        ‘ В этой строке формируется значение _

                                       заполняемой ячейки таблицы

   Dim wshtCurrentSheet As Worksheet ‘ Лист, на котором находится _

                                       заполняемая ячейка

   ‘ Отключение обновления изображения

   Application.ScreenUpdating = False

   ‘ Создание книги с одним листом

   Workbooks.Add xlWorksheet

   Set rgRange = ActiveWorkbook.Sheets(1).Range(«A1»)

   ‘ Чтение первой строки из файла (по этой строке определяется _

    ширина таблицы)

    Open ThisWorkbook.Path & «Primer.txt» For Input As #1

   Line Input #1, strLine

   ‘ Обработка первой строки с добавлением новых листов по мере _

    необходимости

   For i = 1 To Len(strLine)

      strCurChar = Mid(strLine, i, 1)

      ‘ Проверка — закончились столбцы или нет

      If intCol <> 0 And intCol Mod 256 = 0 Then

         ‘ Столбцы текущего листа закончились — добавим новый лист _

          и перейдем к его первому столбцу

         Set wshtCurrentSheet = ActiveWorkbook.Sheets.Add(, _

          ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count))

         Set rgRange = wshtCurrentSheet.Range(«A1»)

         intCol = 0

      End If

      ‘ Проверка — закончилось поле или нет

      If strCurChar = «,» Then

         ‘ Запишем данные в таблицу

         rgRange.Offset(lngRow, intCol) = strCellValue

         intCol = intCol + 1

         strCellValue = «»

      Else

         ‘ Добавляем очередной символ в строку со значением текущей _

          ячейки

         strCellValue = strCellValue & Mid(strLine, i, 1)

         ‘ Проверка — конец строки или нет

         If i = Len(strLine) Then

            ‘ Дошли до конца строки — запишем значение последней ячейки

            rgRange.Offset(lngRow, intCol) = strCellValue

            intCol = 0

            strCellValue = «»

         End If

      End If

   Next i

   ‘ Чтение остальных строк файла

   Do Until EOF(1)

      Set rgRange = ActiveWorkbook.Sheets(1).Range(«A1»)

      lngRow = lngRow + 1

      intCol = 0

      Line Input #1, strLine

      ‘ Обработка считанной строки

      For i = 1 To Len(strLine)

         strCurChar = Mid(strLine, i, 1)

         ‘ Проверка — закончились столбцы или нет

         If intCol <> 0 And intCol Mod 256 = 0 Then

            ‘ Столбцы текущего листа закончились — добавим новый лист _

             и перейдем к его первому столбцу

            Set wshtCurrentSheet = ActiveWorkbook.Sheets.Add(, _

             ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count))

            Set rgRange = wshtCurrentSheet.Range(«A1»)

            intCol = 0

         End If

         ‘ Проверка — закончилось поле или нет

         If strCurChar = «,» Then

            ‘ Запишем данные в таблицу

            rgRange.Offset(lngRow, intCol) = strCellValue

            intCol = intCol + 1

            strCellValue = «»

         Else

            ‘ Добавляем очередной символ в строку со значением текущей _

             ячейки

            strCellValue = strCellValue & Mid(strLine, i, 1)

            ‘ Проверка — конец строки или нет

            If i = Len(strLine) Then

               ‘ Дошли до конца строки — запишем значение последней _

                ячейки

               rgRange.Offset(lngRow, intCol) = strCellValue

               strCellValue = «»

            End If

         End If

      Next i

   Loop

   ‘ Не забываем закрыть входной файл

   Close #1

   ‘ и разрешить обновление изображения

   Application.ScreenUpdating = True

End Sub

Создание резервных копий ценных файлов

 Этот макрос сохраняет текущую книгу в папку C:TEMP, добавляя к имени книги текущее время и дату.

Sub Backup_Active_Workbook()

    Dim x As String

    strPath = «c:TEMP»

    On Error Resume Next

    x = GetAttr(strPath) And 0

    If Err = 0 Then ‘ если путь существует — сохраняем копию книги

        strDate = Format(Now, «dd/mm/yy hh-mm»)

        FileNameXls = strPath & «» & Left(ActiveWorkbook.Name,  _

             Len(ActiveWorkbook.Name) — 4) & » » & strDate & «.xls»

        ActiveWorkbook.SaveCopyAs Filename:=FileNameXls

    Else ‘если путь не существует — выводим сообщение

        MsgBox «Папка » & strPath & » недоступна или не существует!», vbCritical

    End If

End Sub

При желании можно заменить первую строку на:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

и поместить этот макрос не в Module1 как обычно, а в модуль ЭтаКнига (ThisWorkbook) — тогда автоматическое сохранение резервной копии будет происходить каждый раз перед закрытием файла.

Подсчет количества открытий файла

Количество открытий файла (вариант 1)

Sub Auto_Open()

   Worksheets(1).Cells(1) = Worksheets(1).Cells(1) + 1

End Sub

Количество открытий файла (вариант 2)

Sub Auto_Open()

   Worksheets(1).Cells(1, 1) = Worksheets(1).Cells(1, 1) + 1

End Sub

Количество открытий файла (вариант 3)

Sub Auto_Open()

   Worksheets(1).Range(«A1») = Worksheets(1).Range(«A1») + 1

End Sub

Вывод пути к файлу в активную ячейку

Sub ExcelSearch()

Dim fname As String

Dim result As Integer

With Application.FileDialog(1) ‘ ?????? : With Application.FileDialog(msoFileDialogOpen) ‘

.Title = «Select Excel file»

.InitialFileName = «C:» ‘default path’

.AllowMultiSelect = False

.Filters.Clear

.Filters.Add «Pack files», «*.xls», 1

result = .Show

If result = 0 Then Exit Sub

fname = Trim(.SelectedItems.Item(1))

End With

‘On Error Resume Next

ActiveCell = fname

End Sub

Копирование содержимого файла RTF в эксель

Sub OpenRtfAndPasteToSheets()

Dim wd As Object

Dim ns As Worksheet

On Error Resume Next

‘запустим Ворд

Set wd = GetObject(«», «Word.Application»)

If Err.Number <> 0 Then

Err.Clear

Set wd = CreateObject(«Word.Application»)

If Err.Number <> 0 Then Exit Sub

End If

On Error GoTo BAD

Do

‘получим имя очередного файла

f = Application.GetOpenFilename(«Файлы RTF, *.rtf,Все файлы, *.*»)

If TypeName(f) = «Boolean» Then Exit Do ‘если Отмена — выход

‘откроем выбранный очередной файл

Set wdd = wd.Documents.Open(f)

‘ wd.Visible = True

‘скопируем содержимое документа

t = wdd.Content.Copy

‘создадим лист для этого документа

Set ns = ActiveWorkbook.Worksheets.Add

‘вставим скопированное в новый лист

ns.Paste Destination:=ns.Cells(1, 1)

‘немного выравним вид

ns.Cells.WrapText = False

ns.Columns.AutoFit

ns.Rows.AutoFit

wdd.Close

Loop

wd.Quit

Set wd = Nothing

Exit Sub

BAD:

MsgBox Err.Desсriрtion

On Error Resume Next

wd.Quit

Set wd = Nothing

End

End Sub

Копирование данных из закрытой книги

ActiveCell.FormulaR1C1 = «=’D:contactszakaz[zakaz.xls]Лист1′!R1C1»

Извлечение данных из закрытого файла

Sub GetDataFromFile()

   Range(«A1»).Formula = «=’C:[Example.xls]Лист1′!A1»

End Sub

Поиск слова в файлах

Option Explicit

Sub Поиск_во_всех_файлах()

Dim iShtName$, iPath$, iFileName$, firstAddress$

Dim iSheet As Worksheet, iFoundSht As Worksheet

Dim iTempWB As Workbook, iBazaWB As Workbook

Dim TextToFind As Variant, iFoundRng As Range

Dim FD As FileDialog, iLastRow&

Dim FoundAny As Boolean

    TextToFind = Application.InputBox(«Введите текст для поиска:», «Поиск»)

    If TextToFind = «» Or TextToFind = False Then Exit Sub

    TextToFind = Trim(TextToFind)

    Set FD = Application.FileDialog(msoFileDialogFilePicker)

    With FD

        .AllowMultiSelect = False

        .Title = «Укажите любой файл в папке»

        .ButtonName = «Выбрать папку»

        If .Show = False Then Exit Sub Else iPath = Mid(.SelectedItems(1), 1, InStrRev(.SelectedItems(1), «»))

    End With

    Set FD = Nothing

    Workbooks.Add

    Sheets.Add.Name = «Поиск»

    Set iFoundSht = ActiveSheet

    iFoundSht.Cells(1, 1) = «Ищем: » & TextToFind

    iFoundSht.Cells(1, 1).Font.Bold = True

    With Application

        .ScreenUpdating = False

        .Calculation = xlManual

        .StatusBar = «Идёт поиск…»

        .ShowWindowsInTaskbar = False

        iFileName = Dir(iPath & «*.xls»)

        Do While iFileName$ <> «»

            Set iTempWB = Workbooks.Open(Filename:=iPath & iFileName, updаtеLinks:=False, ReadOnly:=True)

            For Each iSheet In iTempWB.Sheets

                If iSheet.FilterMode = True Then iSheet.ShowAllData

                Set iFoundRng = iSheet.Cells.Find(What:=TextToFind, LookIn:=xlFormulas, LookAt:=xlPart)

                If Not iFoundRng Is Nothing Then

                    FoundAny = True

                    firstAddress = iFoundRng.Address

                    Do

                        With iFoundSht

                            iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row

                            If iLastRow = 1 Then iLastRow = 2

                            If iShtName <> iSheet.Name Then    ‘если новый файл

                                With .Cells(iLastRow + 2, 1)

                                    .Value = «Файл: » & iTempWB.Name & «, Лист: » & iSheet.Name

                                    .Font.Bold = True

                                End With

                            End If

                            iFoundRng.EntireRow.Copy Destination:=.Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1)    ‘копируем всю строку

                            iShtName = iSheet.Name

                        End With

                        Set iFoundRng = iSheet.Cells.FindNext(iFoundRng)

                    Loop While iFoundRng.Address <> firstAddress

                Else

                End If

            Next

            iTempWB.Close SaveChanges:=False

            iFileName = Dir

        Loop

        .StatusBar = False

        .ShowWindowsInTaskbar = True

        .EnableEvents = True

        .Calculation = xlCalculationAutomatic

        .ScreenUpdating = True

    End With

    If FoundAny = False Then

        MsgBox «Текст ‘» & TextToFind & «‘ ни в одном из файлов в папке:» & Chr(10) & iPath & Chr(10) & » не был найден!», 48, «Отчёт»

        iFoundSht.Parent.Close SaveChanges:=False

        Exit Sub

    End If

    MsgBox «Поиск » & TextToFind & » завершён!», 64, «Поиск»

End Sub

Создание текстового файла и ввод текста в файл

Sub Test()

 Open «c:2.txt» For Output As #1

 Print #1, «Hello File»

 Close #1

 Open «c:1.txt» For Input As #1

 Dim s As String

 Input #1, s

 MsgBox s

 Close #1

End Sub

Создание текстового файла и ввод текста (определение конца файла)

Sub Test()

Open «c:1.txt» For Output As #1

 Print #1, «Hello , File»

Close #1

Open «c:1.txt» For Input As #1

 Dim s As String

 While Not EOF(1)

  Input #1, s

  MsgBox s

 Wend

Close #1

End Sub

Создание документов Word на основе таблицы Excel

Sub ReportToWord()

   Dim intReportCount As Integer  ‘ Количество сообщений

   Dim strForWho As String        ‘ Получатель сообщения

   Dim strSum As String           ‘ Сумма за товар

   Dim strProduct As String       ‘ Название товара

   Dim strOutFileName As String   ‘ Имя файла для сохранения сообщения

   Dim strMessage As String       ‘ Текст дополнительного сообщения

   Dim rgData As Range            ‘ Обрабатываемые ячейки

   Dim objWord As Object

   Dim i As Integer

   ‘ Создание объекта Word

   Set objWord = CreateObject(«Word.Application»)

   ‘ Информация с рабочего листа

   Set rgData = Range(«A1»)

   strMessage = Range(«E6»)

   ‘ Просмотр записей на листе Лист1

   intReportCount = Application.CountA(Range(«A:A»))

   For i = 1 To intReportCount

      ‘ Динамические сообщения в строке состояния

      Application.StatusBar = «Создание сообщения » & i

      ‘ Назначение данных переменным

      strForWho = rgData.Cells(i, 1).Value

      strProduct = rgData.Cells(i, 2).Value

      strSum = Format(rgData.Cells(i, 3).Value, «#,000»)

      ‘ Имя файла для сохранения отчета

      strOutFileName = ThisWorkbook.path & «» & strForWho & «.doc»

      ‘ Передача команд в Word

      With objWord

         .Documents.Add

         With .Selection

            ‘ Заголовок сообщения

            .Font.Size = 14

            .Font.Bold = True

            .ParagraphFormat.Alignment = 1

            .TypeText Text:=»О Т Ч Е Т»

            ‘ Дата

            .TypeParagraph

            .TypeParagraph

            .Font.Size = 12

            .ParagraphFormat.Alignment = 0

            .Font.Bold = False

            .TypeText Text:=»Дата:» & vbTab & _

             Format(Date, «mmmm d, yyyy»)

            ‘ Получатель сообщения

            .TypeParagraph

            .TypeText Text:=»Кому: менеджеру » & vbTab & strForWho

            ‘ Отправитель

            .TypeParagraph

            .TypeText Text:=»От:» & vbTab & Application.UserName

            ‘ Сообщение

            .TypeParagraph

            .TypeParagraph

            .TypeText strMessage

            .TypeParagraph

            .TypeParagraph

            ‘ Название товара

            .TypeText Text:=»Продано товара:» & vbTab & strProduct

            .TypeParagraph

            ‘ Сумма за товар

            .TypeText Text:=»На сумму:» & vbTab & _

             Format(strSum, «$#,##0»)

         End With

         ‘ Сохранение документа

         .ActiveDocument.SaveAs FileName:=strOutFileName

      End With

   Next i

   ‘ Удаление объекта Word

   objWord.Quit

   Set objWord = Nothing

   ‘ Обновление строки состояния

   Application.StatusBar = False

   ‘ Вывод на экран информационного сообщения

   MsgBox intReportCount & » заметки создано и сохранено в папке » _

    & ThisWorkbook.path

End Sub

Команды создания и удаления каталогов

Sub Test()

 MkDir («c:test»)

End Sub

И удаляем.

Sub Test()

 RmDir («c:test»)

End Sub

Получение  текущего каталога

Sub Test()

 MsgBox (CurDir)

End Sub

Смена каталога

Sub Test()

 ChDir («c:windows»)

 MsgBox (CurDir)

End Sub

Посмотреть все файлы в каталоге_1

Sub Test()

 Dim s As String

 s = Dir(«c:windowsinf*.*»)

 Debug.Print s

 Do While s <> «»

   s = Dir

   Debug.Print s

 Loop

End Sub

Посмотреть все файлы в каталоге_2

‘ Объявление API-функции для отображения стандартного окна _

 просмотра папок

Declare Function SHBrowseForFolder Lib «shell32.dll» _

 Alias «SHBrowseForFolderA» (lpBrowseInfo As BROWSEINFO) As ****

‘ Объявление API-функции для преобразования данных, возвращаемых _

 функцией SHBrowseForFolder, в строку

Declare Function SHGetPathFromIDList Lib «shell32.dll» _

 Alias «SHGetPathFromIDListA» (ByVal pidl As ****, ByVal _

 pszPath As String) As ****

‘ Структура используется функцией SHBrowseForFolder

Type BROWSEINFO

   hwndOwner As ****     ‘ Родительское окно (для диалога)

   pidlRoot As ****      ‘ Корневая папка для просмотра

   strDisplayName As String

   strTitle As String    ‘ Заголовок окна

   ulFlags As ****       ‘ Флаги для окна

   ‘ Следующие три параметра в VBA не используются

   lpfn As ****

   lParam As ****

   iImage As ****

End Type

Sub BrowseFolder()

   Dim strPath As String  ‘ Папка, список файлов которой выводится

   Dim strFile As String

   Dim intRow As ****     ‘ Текущая строка таблицы

   ‘ Выбор папки

   strPath = dhBrowseForFolder()

   If strPath = «» Then Exit Sub

   If Right(strPath, 1) <> «» Then strPath = strPath & «»

   ‘ Оформление заголовка отчета

   ActiveSheet.Cells.ClearContents

   ActiveSheet.Cells(1, 1) = «Имя файла»

   ActiveSheet.Cells(1, 2) = «Размер»

   ActiveSheet.Cells(1, 3) = «Дата/время»

   ActiveSheet.Range(«A1:C1»).Font.Bold = True

   ‘ Просмотр объектов в папке…

   ‘ Первый объект папки

   strFile = Dir(strPath, 7)

   intRow = 2

   Do While strFile <> «»

      ‘ Запись в столбец «A» имени файла

      ActiveSheet.Cells(intRow, 1) = strFile

      ‘ Запись в столбец «B» размера файла

      ActiveSheet.Cells(intRow, 2) = FileLen(strPath & strFile)

      ‘ Запись в столбец «C» времени изменения файла

      ActiveSheet.Cells(intRow, 3) = FileDateTime(strPath & strFile)

      ‘ Следующий объект папки

      strFile = Dir

      intRow = intRow + 1

   Loop

End Sub

Function dhBrowseForFolder() As String

   Dim biBrowse As BROWSEINFO

   Dim strPath As String

   Dim lngResult As ****

   Dim intLen As Integer

   ‘ Заполнение полей структуры BROWSEINFO

   ‘ Корневая папка — Рабочий стол

   biBrowse.pidlRoot = 0&

   ‘ Заголовок окна

   biBrowse.strTitle = «Выбор папки»

   ‘ Тип возвращаемой папки

   biBrowse.ulFlags = &H1

   ‘ Вывод стандартного окна просмотра папок

   lngResult = SHBrowseForFolder(biBrowse)

   ‘ Обработка результата работы окна

   If lngResult Then

      ‘ Получение пути (по возвращенным данным)

      strPath = Space$(512)

      If SHGetPathFromIDList(ByVal lngResult, ByVal strPath) Then

         ‘ Строка пути заканчивается символом Chr(0)

         intLen = InStr(strPath, Chr$(0))

         ‘ Выделение и возврат пути

         dhBrowseForFolder = Left(strPath, intLen — 1)

      Else

         ‘ Не удалось получить путь

         dhBrowseForFolder = «»

      End If

   Else

      ‘ Пользователь нажал кнопку «Отмена»

      dhBrowseForFolder = «»

   End If

End Function

Посмотреть все файлы в каталоге_3

‘ Объявление API-функции для отображения стандартного окна _

 просмотра папок

Declare Function SHBrowseForFolder Lib «shell32.dll» _

 Alias «SHBrowseForFolderA» (lpBrowseInfo As BROWSEINFO) As ****

‘ Объявление API-функции для преобразования данных, возвращаемых _

 функцией SHBrowseForFolder, в строку

Declare Function SHGetPathFromIDList Lib «shell32.dll» _

 Alias «SHGetPathFromIDListA» (ByVal pidl As ****, ByVal _

 pszPath As String) As ****

‘ Структура используется функцией SHBrowseForFolder

Type BROWSEINFO

   hwndOwner As ****     ‘ Родительское окно (для диалога)

   pidlRoot As ****      ‘ Корневая папка для просмотра

   strDisplayName As String

   strTitle As String    ‘ Заголовок окна

   ulFlags As ****       ‘ Флаги для окна

   ‘ Следующие три параметра в VBA не используются

   lpfn As ****

   lParam As ****

   iImage As ****

End Type

Sub BrowseFolder1()

   Dim strPath As String  ‘ Папка, список файлов которой выводится

   Dim strFile As String

   Dim intRow As ****     ‘ Текущая строка таблицы

   ‘ Выбор папки

   strPath = dhBrowseForFolder()

   If strPath = «» Then Exit Sub

   If Right(strPath, 1) <> «» Then strPath = strPath & «»

   ‘ Оформление заголовка отчета

   ActiveSheet.Cells.ClearContents

   ActiveSheet.Cells(1, 1) = «Имя файла»

   ActiveSheet.Cells(1, 2) = «Размер»

   ActiveSheet.Cells(1, 3) = «Дата/время»

   ActiveSheet.Range(«A1:C1»).Font.Bold = True

   ‘ Просмотр объектов в папке…

   ‘ Первый объект папки

   strFile = Dir(strPath, 7)

   intRow = 2

   Do While strFile <> «»

      ‘ Запись в столбец «A» имени файла

      ActiveSheet.Cells(intRow, 1) = strPath & strFile

      ‘ Запись в столбец «B» размера файла

      ActiveSheet.Cells(intRow, 2) = FileLen(strPath & strFile)

      ‘ Запись в столбец «C» времени изменения файла

      ActiveSheet.Cells(intRow, 3) = FileDateTime(strPath & strFile)

      ‘ Следующий объект папки

      strFile = Dir

      intRow = intRow + 1

   Loop

End Sub

Function dhBrowseForFolder() As String

   Dim biBrowse As BROWSEINFO

   Dim strPath As String

   Dim lngResult As ****

   Dim intLen As Integer

   ‘ Заполнение полей структуры BROWSEINFO

   ‘ Корневая папка — Рабочий стол

   biBrowse.pidlRoot = 0&

   ‘ Заголовок окна

   biBrowse.strTitle = «Выбор папки»

   ‘ Тип возвращаемой папки

   biBrowse.ulFlags = &H1

   ‘ Выводим стандартное окно просмотра папок

   lngResult = SHBrowseForFolder(biBrowse)

   ‘ Обработка результата работы окна

   If lngResult Then

      ‘ Получение пути (по возвращенным данным)

      strPath = Space$(512)

      If SHGetPathFromIDList(ByVal lngResult, ByVal strPath) Then

         ‘ Строка пути заканчивается символом Chr(0)

         intLen = InStr(strPath, Chr$(0))

         ‘ Выделение и возврат пути

         dhBrowseForFolder = Left(strPath, intLen — 1)

      Else

         ‘ Не удалось получить путь

         dhBrowseForFolder = «»

      End If

   Else

      ‘ Пользователь нажал кнопку «Отмена» в окне

      dhBrowseForFolder = «»

   End If

End Function

ГЛАВА 3. РАБОЧАЯ ОБЛАСТЬ MICROSOFT EXCEL

Рабочая книга

Количество имен рабочей книги

Sub CountNames()

   Dim intNamesCount As Integer

   ‘ Получаем и отображаем количество имен на активном _

    листе рабочей книги

   intNamesCount = Names.Count

   If intNamesCount = 0 Then

      MsgBox «Имен нет»

   Else

      MsgBox «Имен: » & intNamesCount & » шт.»

   End If

End Sub

Защита рабочей книги

Sub Worksheet_BeforeRightClick(ByVal Target As Range, _

 Cancel As Boolean)

   If Target.Address = «$D$2» Then

      ‘ Установка защиты рабочей книги (с паролем «123», _

       включенной защитой структуры книги и защитой расположения _

       окон)

      ThisWorkbook.Protect «123», True, True

      ‘ Указание не обрабатывать нажатие кнопки мыши _

       в этой ячейке

      Cancel = True

   ElseIf Target.Address = «$E$5» Then

      ‘ Снятие защиты с книги (необходимо указать ранее установленный _

       пароль)

      ThisWorkbook.Unprotect «123»

      Cancel = True

   End If

End Sub

Запрет печати книги

Sub Workbook_BeforePrint(Cancel As Boolean)

   ‘ Установка флага в True заставляет Exсel игнорировать команду _

    отправки книги на печать

   Cancel = True

End Sub

Открытие книги (или текстовых файлов)

Sub Test()

 Application.Workbooks.Open («c:file_03.txt»)

End Sub

Открытие книги и добавление в ячейку А1 текста

Dim Ex As New Excel.Application

Ex.Workbooks.Open «Путь к Файлу»

Ex.Visible = False

‘В ячейку «A2» добавляем «Visual Basic»

Ex.ActiveWorkbook.Sheets.Application.Range(«A2») = «Visual Basic»

Ex.ActiveWorkbook.Save

Ex.ActiveWorkbook.Close

Сколько книг открыто

Sub Test()

 MsgBox (Str(Application.Workbooks.Count))

End Sub

Закрытие всех книг

Sub Test()

 Application.Workbooks.Item(1).Close  ‘(еxprеssion.Close(SaveChanges, FileName, RouteWorkbook)

End Sub

Закрытие рабочей книги только при выполнении условия

Sub Workbook_BeforeClose(Cancel As Boolean)

   If Range(«A1»).Value <> «Можно закрывать» Then

      ‘ Условие закрытия не выполнено. Укажем Exсel игнорировать _

       команду

      Cancel = True

   End If

End Sub

Сохранение рабочей книги с именем, представляющим собой текущую дату

Sub SaveAsDate()

   Dim strDate As String

   ‘ Получение текущей даты и представление ее в формате «ддммгг»

   strDate = Format(Now(), «ddmmyy»)

   ‘ Сохранение книги в текущую папку под новым именем

   ActiveWorkbook.SaveAs ActiveWorkbook.Path & «» & strDate

End Sub

Сохранена ли рабочая книга

Function dhBookIsSaved() As Boolean

   ‘ Если путь файла рабочей книги не задан, то она _

    не сохранена (ThisWorkbook.path равняется «»)

   dhBookIsSaved = ThisWorkbook.path <> «»

End Function

Создать книгу с одним листом

Sub NewOneSheetBook()

   Workbooks.Add xlWBATWorksheet

End Sub

Создать книгу

Sub Test()

 Application.Workbooks.Add («Êíèãà»)

End Sub

Удаление ненужных имен

Sub EraseNames()

   Dim nmName As Name

   Dim strMessage As String

   ‘ Проверка наличия в книге определенных имен

   If ThisWorkbook.Names.Count = 0 Then

      ‘ В книге нет определенных имен

      MsgBox «Имена не определены»

      Exit Sub

   End If

   ‘ Просмотр всей коллекции определенных имен и удаление тех, _

    которые пользователю не нужны

   For Each nmName In ThisWorkbook.Names

      With nmName

         ‘ Спрашиваем пользователя о необходимости удалить _

          найденное имя

         strMessage = «Удалить имя » & .Name & » ? » & vbCr & _

          «относящееся к » & .RefersTo

         If MsgBox(strMessage, vbYesNo + vbQuestion) = vbYes Then

            ‘ Имя можно удалить

            .Delete

         End If

      End With

   Next

End Sub

Быстрое размножение рабочей книги

Sub DuplicateBook()

   Dim avarFileNames As Variant

   ‘ Формирование массива из путей для копий книги

   avarFileNames = Array(«C:» & _

   ActiveWorkbook.Name, «D:» & ActiveWorkbook.Name)

   ‘ Сохранение книги

   ActiveWorkbook.SaveAs avarFileNames

End Sub

Сортировка листов

Sub SortSheets()

    Dim astrSheetNames() As String ‘ Массив для хранения имен листов

    Dim intSheetCount As Integer

    Dim i As Integer

    Dim objActiveSheet As Object

    ‘ Если нет активной рабочей книги — закрыть процедуру

    If ActiveWorkbook Is Nothing Then Exit Sub

    ‘ Проверка защищенности структуры рабочей книги

    If ActiveWorkbook.ProtectStructure Then

        ‘ Сортировка листов защищенной рабочей книги невозможна

        MsgBox «Структура книги » & ActiveWorkbook.Name & _

         » защищена. Сортировка листов невозможна.», _

         vbCritical

        Exit Sub

    End If

    ‘ Сохраняем ссылку на активный лист книги

    Set objActiveSheet = ActiveSheet

    ‘ Отключение сочетания клавиш Ctrl+Pause Break

    Application.EnableCancelKey = xlDisabled

    ‘ Отключение обновления экрана

    Application.ScreenUpdating = False

    intSheetCount = ActiveWorkbook.Sheets.Count

    ‘ Заполнение массива astrSheetNames именами листов книги

    ReDim astrSheetNames(1 To intSheetCount)

    For i = 1 To intSheetCount

        astrSheetNames(i) = ActiveWorkbook.Sheets(i).Name

    Next i

    ‘ Сортировка массива имен в порядке возрастания

    Call Sort(astrSheetNames)

    ‘ Перемещение листов книги

    For i = 1 To intSheetCount

        ActiveWorkbook.Sheets(astrSheetNames(i)).Move _

         ActiveWorkbook.Sheets(i)

    Next i

    ‘ Переход на исходный рабочий лист

    objActiveSheet.Activate

    ‘ Включение обновления экрана

    Application.ScreenUpdating = True

    ‘ Включение сочетания клавиш Ctrl+Pause Break

    Application.EnableCancelKey = xlInterrupt

End Sub

Sub Sort(astrNames() As String)

    ‘ Сортировка массива строк по алфавиту (в порядке возрастания)

    Dim i As Integer, j As Integer

    Dim strBuffer As String

    Dim fBuffer As Boolean

    For i = LBound(astrNames) To UBound(astrNames) — 1

        For j = i + 1 To UBound(astrNames)

            If astrNames(i) > astrNames(j) Then

                ‘ Меняем i-й и j-й элементы массива местами

                strBuffer = astrNames(i)

                astrNames(i) = astrNames(j)

                astrNames(j) = strBuffer

            End If

        Next j

    Next i

End Sub

Поиск максимального значения на всех листах книги

Function dhMaxInBook(cell As Range) As Double

   Dim sheet As Worksheet

   Dim dblMax As Double

   Dim dblResult As Double

   Dim fFirst As Boolean

   fFirst = True

   ‘ Расчет максимальных значений на всех листах рабочей книги _

    и выбор наибольшего из них

   For Each sheet In cell.Parent.Parent.Worksheets

      ‘ Расчет максимального значения на листе

      dblResult = Application.WorksheetFunction.Max(sheet.UsedRange)

      If fFirst Then

         ‘ Найдено первое значение — его не с чем сравнивать

         dblMax = dblResult

         fFirst = False

      End If

      ‘ Выбираем большее из dblMax и dbmResult

      If dblResult > dblMax Then

         dblMax = dblResult

      End If

   Next sheet

   ‘ Возврат результата

   dhMaxInBook = dblMax

End Function

РАБОЧИЙ ЛИСТ

Проверка наличия защиты рабочего листа

Sub IsSheetProtected()

   ‘ Проверка, установлена ли защита на содержимое листа

   If Worksheets(1).ProtectContents Then

      MsgBox «Защита листа включена»

   Else

      MsgBox «Защита листа не включена»

   End If

End Sub

Список отсортированных листов

Sub SortSheets2()

   Dim astrSheetNames() As String ‘ Массив для хранения имен листов

   Dim intSheetCount As Integer

   Dim i As Integer

   Dim objActiveSheet As Object

   ‘ Если нет активной рабочей книги — закрыть процедуру

   If ActiveWorkbook Is Nothing Then Exit Sub

   ‘ Проверка защищенности структуры рабочей книги

   If ActiveWorkbook.ProtectStructure Then

      ‘ Сортировка листов защищенной рабочей книги невозможна

      MsgBox «Структура книги » & ActiveWorkbook.Name & _

       » защищена. Сортировка листов невозможна.», _

       vbCritical

      Exit Sub

   End If

   ‘ Сохраняем ссылку на активный лист книги

   Set objActiveSheet = ActiveSheet

   ‘ Отключение сочетания клавиш Ctrl+Pause Break

   Application.EnableCancelKey = xlDisabled

   ‘ Функция обновления экрана отключается

   Application.ScreenUpdating = False

   With ActiveWorkbook

      ‘ Cоздаем новый лист «Сортировка» (если он еще не создан)

      On Error Resume Next

      If .Sheets(«Сортировка») Is Nothing Then

         .Sheets.Add.Name = «Сортировка»

      End If

      On Error GoTo 0

      ‘ Размещение данных на листе «Сортировка» (в столбец «A»)

      intSheetCount = .Sheets.Count

      For i = 1 To intSheetCount

         .Sheets(«Сортировка»).Cells(i, 1) = .Sheets(i).Name

      Next i

      ‘ Сортировка данных в ячейках листа «Сортировка» по содержимому _

       столбца A

      .Sheets(«Сортировка»).Range(«A1»).Sort _

       Key1:=.Sheets(«Сортировка»).Range(«A1»), _

       Order1:=xlAscending

      ‘ Заполнение массива имен отсортированными строками

      ReDim astrSheetNames(1 To intSheetCount)

      For i = 1 To intSheetCount

         astrSheetNames(i) = .Sheets(«Сортировка»).Cells(i, 1)

      Next i

      ‘ Перемещение листов

      For i = 1 To intSheetCount

         .Sheets(astrSheetNames(i)).Move .Sheets(i)

      Next i

   End With

   ‘ Переход на исходный рабочий лист

   objActiveSheet.Activate

   ‘ Включаем обновление экрана

   Application.ScreenUpdating = True

   ‘ Включение сочетания клавиш Ctrl+Pause Break

   Application.EnableCancelKey = xlInterrupt

End Sub

Создать новый лист_1

Sub NewSheet()

   Worksheets.Add

End Sub

‘Sub Tes2t()

‘With Application.Workbooks.Item(ActiveWorkbook.Name)

 ‘Sheets.Add

 ‘End With

‘End Sub

‘Dim ExNew As Worksheet

 ‘Set ExNew = ActiveWorkbook.Worksheets.Add

‘ExNew.Name = «Имя Листа»

Создать новый лист_2

Worksheets.Add.Name = «List12345.xls»

Удаление листов в зависимости от даты

‘ Function DelSheetByDate

‘ Удаляет рабочий лист sSheetName в активной рабочей книге,

‘ если дата dDelDate уже наступила

‘ В случае успеха возвращает True, иначе — False

Public Function DelSheetByDate(sSheetName As String, _

                               dDelDate As Date) As Boolean

On Error GoTo errHandle

  DelSheetByDate = False

  ‘ Проверка даты

  If dDelDate <= Date Then

   ‘ Не выводить подтверждение на удаление

   Application.DisplayAlerts = False

   ActiveWorkbook.Worksheets(sSheetName).Delete

   DelSheetByDate = True

   Application.DisplayAlerts = True

 End If

Exit Function

errHandle:

  MsgBox Err.Desсriрtion, vbCritical, «Ошибка №» & Err.Number

End Function

Копирование листа в книге

Sub Test()

 With Application.Workbooks.Item(«Test.xls»)

 Sheets(«Test»).Copy , after:=Sheets(«Лист3»)

 End With

End Sub

Копирование листа в новую книгу (создается)

Sub Test()

  With Application.Workbooks.Item(«Test.xls»)

  Sheets(«Test»).Copy

  End With

End Sub

Перемещение листа в книге

Sub Test()

 With Application.Workbooks.Item(«Test.xls»)

 Sheets(«Test»).Move , after:=Sheets(«Лист3»)

 End With

End Sub

Перемещение нескольких листов в новую книгу

Sheets(Array(«Лист1», «Лист2», «Лист3»)).Select

Sheets(«Лист3»).Activate

Sheets(Array(«Лист1», «Лист2», «Лист3»)).Copy

Заменить существующий файл

Sub copy_sheet()

ShName = ActiveSheet.Name

Sheets(ShName).Copy

ActiveWorkbook.SaveAs «c:» & ShName & «.xls»

End Sub

Чтобы не вылезало диалоговое окно надо добавить

Application.DisplayAlerts = False ‘ вылючаем все предупреждения

ActiveWorkbook.SaveAs «c:» & ShName & «.xls»

Application.DisplayAlerts = True ‘обратно включаем предупреждения.

«Перелистывание» книги

Sub SheetsOfBook()

   Dim sheet As Object

   ‘ Отображение имен всех листов активной рабочей книги

   For Each sheet In ActiveWorkbook.Sheets

      MsgBox (sheet.Name)

   Next

End Sub

Вставка колонтитула с именем книги, листа и текущей датой

Sub AddPageHeader()

   Dim i As Integer

   With ThisWorkbook

      ‘ Вставка колонтитулов на все листы рабочей книги

      For i = 1 To .Worksheets.Count — 1

         .Worksheets(i).PageSetup.LeftHeader = .FullName

         .Worksheets(i).PageSetup.CenterHeader = Worksheets(i).Name

         .Worksheets(i).PageSetup.RightHeader = Now()

      Next

   End With

End Sub

Существует ли лист

Function dhSheetExist(strSheetName As String) As Boolean

   Dim objSheet As Object

   On Error GoTo HandleError ‘ При ошибке перейти на HandleError

   ‘ Пытаемся получить ссылку на заданный лист

   objSheet = ActiveWorkbook.Sheets(strSheetName)

   ‘ Ошибки не возникло — лист существует

   dhSheetExist = True

   Exit Function

HandleError:

   ‘ При попытке получить доступ к листу с заданным именем _

    возникла ошибка, значит, такого листа не существует

   dhSheetExist = False

End Function

Существует ли лист_2

   L = 0

For Each Sheet In Worksheets

If Sheet.Name = «List12» Then

L = 1

MsgBox «List12 совпадает с расчетным листом. Переименуйте свой List12 на какое нибудь другое имя!»

End If

Next

If L = 0 Then

Worksheets.Add.Name = «List12»

Worksheets(1).Visible = True

Worksheets(«List12»).Visible = True

Worksheets(«List12»).Activate

End If

Вывод количества листов в активной книге

Sub Test()

 MsgBox (Str(Application.Workbooks.Item(ActiveWorkbook.Name).Sheets.Count))

End Sub

Вывод количества листов в активной книге в виде гиперссылок

Sub SheetNamesAsHyperLinks()

   Dim sheet As Worksheet

   Dim cell As Range

   With ActiveWorkbook

      ‘ Просмотр всех листов книги и создание гиперссылок на них _

       на первом листе

      For Each sheet In ActiveWorkbook.Worksheets

         Set cell = Worksheets(1).Cells(sheet.Index, 1)

         .Worksheets(1).Hyperlinks.Add Anchor:=cell, Address:=»», _

          SubAddress:=»‘» & sheet.Name & «‘» & «!A1»

         cell.Formula = sheet.Name

      Next

   End With

End Sub

Вывод имен активных листов по очереди

Sub Test()

With Application.Workbooks.Item(ActiveWorkbook.Name)

For x = 1 To .Sheets.Count

 MsgBox (Sheets.Item(x).Name)

Next x

End With

End Sub

Вывод имени и номеров листов текущей книги

Sub ShowInfo()

   Dim i As Integer

   ‘ Выводим имя файла рабочей книги

   Range(«A1») = ActiveWorkbook.Name

   ‘ Выводим имя текущего листа

   Range(«B1») = ActiveSheet.Name

   ‘ Выводим номера листов

   For i = 1 To ActiveWorkbook.Sheets.Count

      ActiveSheet.Cells(i, 3) = i

   Next i

End Sub

Сделать лист невидимым

Sub Test()

With Application.Workbooks.Item(«Test.xls»)

 .Sheets.Item(«Лист5»).Visible = False

End With

End Sub

Сколько страниц на всех листах?

Sub GetPrintPagesCount()

   Dim wshtSheet As Worksheet

   Dim intPagesCount As Integer

   ‘ Суммирование количества страниц, необходимых для печати всех _

    листов книги

   For Each wshtSheet In Worksheets

      intPagesCount = intPagesCount + (wshtSheet.HPageBreaks.Count + 1) * _

       (wshtSheet.VPageBreaks.Count + 1)

   Next

   MsgBox «Всего страниц: » & intPagesCount

End Sub

Ячейка и диапазон (столбцы и строки)

Копирование строк на другой лист

Sub CopyRows2()

Dim iCells As Range

For Each iCells In Range(«A2:A5»)

Range(iCells, iCells.Offset(, 7)).Copy

Workbooks.Add

ActiveSheet.Paste

ActiveWorkbook.SaveAs Filename:=»C:Temp» & iCells & «.xls»

Next iCells

End Sub

Копирование столбцов на другой лист

On Error Resume Next

s = Names(«sourcefilename»).Value

On Error GoTo 0

If s = «» Then

sfile = «progcall234_56g»

Call get_file

s = sfile

Else

s = Mid(s, 3, Len(s) — 3)

End If

If s = «» Then Exit Sub

Workbooks.Open (s)

Dim snm As String

snm = ActiveWorkbook.Name

ncol = WorksheetFunction.CountA(Range(«1:1»)) ‘ Range(«a1»).SpecialCells(xlLastCell).Column

nrow = WorksheetFunction.CountA(Range(«a:a»)) ‘Range(«a1»).SpecialCells(xlLastCell).Row

Range(Cells(1, 1), Cells(nrow, ncol)).Copy

Workbooks(s1).Activate

Range(«a1»).Activate

ActiveSheet.Paste

Application.DisplayAlerts = False

Workbooks(snm).Close

Подсчет количества ячеек, содержащих указанные значения_1

Function dhCount(rgn As Range, LowBound As Double, _

                UpperBound As Double) As ****

   Dim cell As Range

   Dim lngCount As ****

   ‘ Проходим по всем ячейкам диапазона rgn и подсчитываем значения, _

    попадающие в интервал от LowBound до UpperBound

   For Each cell In rgn

      If cell.Value >= LowBound And cell.Value <= UpperBound Then

         ‘ Значение попадает в заданный интервал

         lngCount = lngCount + 1

      End If

   Next

   dhCount = lngCount

End Function

Подсчет количества ячеек в диапазоне, содержащих указанные значения_2

Function dhCountSomeCells(rgRange As Range, dblMin As Double, _

 dblMax As Double) As ****

   ‘ Расчет количества ячеек со значениями от dblMin до dblMax _

    с использованием стандартной функции CountIf

   With Application.WorksheetFunction

      dhCountSomeCells = .CountIf(rgRange, «>=» & dblMin) — _

       .CountIf(rgRange, «>» & dblMax)

   End With

End Function

Подсчет количества видимых ячеек в диапазоне

Function dhCountVisibleCells(rgRange As Range)

   Dim lngCount As ****

   Dim cell As Range

   ‘ Проходим по всему диапазону и подсчитываем непустые _

    видимые ячейки

   For Each cell In rgRange

      ‘ Проверка, есть ли данные в ячейке

      If Not IsEmpty(cell) Then

         ‘ Проверка, видима ли ячейка

         If Not cell.EntireRow.Hidden And Not _

          cell.EntireColumn.Hidden Then

            ‘ Еще одна видимая ячейка

            lngCount = lngCount + 1

         End If

      End If

   Next cell

   dhCountVisibleCells = lngCount

End Function

Определение количества ячеек в диапазоне и суммы их значений

Sub CalculateSum()

   Dim i As Integer

   Dim intSum As Integer

   ‘ Расчет суммы ячеек столбца «A» (с первой по пятую)

   For i = 1 To 5

      intSum = intSum + Cells(i, 1)

   Next

   MsgBox «Сумма ячеек: » & intSum

End Sub

Подсчет количества ячеек

Sub CountOfCells()

   MsgBox (Range(«A1:A20, D1:D20»).Count)

End Sub

Автоматический пересчет данных таблицы при изменении ее значений

Sub Worksheet_Change(ByVal Target As Range)

   Dim rgData As Range

   Dim cell As Range

   Dim dblMax As Double, dblMin As Double, dblAverage As Double

   ‘ Получение контролируемого диапазона ячеек

   Set rgData = Range(«B2:B11»)

   ‘ Проверка, не входит ли измененная ячейка в контролируемый _

    диапазон

   If Not (Application.Intersect(Target, rgData) Is Nothing) Then

      If Application.WorksheetFunction.CountA(rgData) > 0 Then

         ‘ Изменена ячейка из контролируемого диапазона

         ‘ Заново рассчитываем минимальное, максимальное и среднее _

          значения в контролируемом диапазоне ячеек

         dblMin = Application.WorksheetFunction.Min(rgData)

         dblMax = Application.WorksheetFunction.Max(rgData)

         dblAverage = Application.WorksheetFunction.Average(rgData)

         ‘ Проверяем каждую ячейку из контролируемого диапазона _

          и изменяем цвет шрифта ячеек с минимальным и максимальным _

          значениями, а также помечаем желтым цветом ячейки _

          со значениями больше среднего

         For Each cell In rgData

            If cell.Value = dblMax Then

               ‘ Ячейку с максимальным значением выделим красным цветом

               cell.Font.Bold = True

               cell.Font.Color = RGB(255, 0, 0)

            ElseIf cell.Value = dblMin Then

               ‘ Ячейку с минимальным значением выделим синим цветом

               cell.Font.Bold = False

               cell.Font.Color = RGB(0, 0, 255)

            Else

               cell.Font.Bold = False

               cell.Font.Color = RGB(0, 0, 0)

            End If

            If cell.Value > dblAverage Then

               ‘ Значение в ячейке больше среднего — выделим ее _

                желтым цветом

               cell.Interior.Color = RGB(255, 255, 0)

            Else

               cell.Interior.ColorIndex = xlNone

            End If

         Next

      Else

         rgData.Interior.ColorIndex = xlNone

      End If

   End If

End Sub

Ввод данных в ячейки

Sub SetCellData()

   ‘ Заполнение значениями ячеек А3 и В4

   Range(«A3») = «Данные для ячейки A3»

   Range(«B4») = «Данные для ячейки B4»

End Sub

Ввод данных с использованием формул

Sub SetCellFormula()

   ‘ Запись в ячейку А6 формулы «=A5+B5»

   Range(«A6») = «=A5+B5»

End Sub

Последовательный ввод данных

Sub StreamInput()

   Dim strDate As String

   Dim strSum As String

   Dim lngRow As ****

   ‘ Ввод данных в цикле (повторяется до тех пор, пока пользователь _

    не введет пустую строку или не нажмет «Отмена» в окне ввода)

   Do

      lngRow = Range(«A65536»).End(xlUp).Row + 1

      ‘ Ввод даты

      strDate = InputBox(«Вводим дату»)

      If strDate = «» Then Exit Sub

      ‘ Ввод выручки

      strSum = InputBox(«Вводим выручку»)

      If strSum = «» Then Exit Sub

      ‘ Запись данных в ячейки

      Cells(lngRow, 1) = strDate

      Cells(lngRow, 2) = strSum

   Loop

End Sub

Ввод текстоввых данных в ячейки

Sub insеrtCustomText()

   ‘ Заполнение текущей ячейки

   ActiveCell = «Генеральный директор»

   Selection.Font.Bold = True

   ‘ Фамилия на три столбца правее должности

   Cells(ActiveCell.Row, ActiveCell.Column + 3).Select

   ActiveCell.FormulaR1C1 = «А. Б. Рублев»

   Selection.Font.Bold = True

   ‘ Ячейка с «Главный бухгалтер» на три столбца левее _

    и на три строки ниже ячейки с фамилией директора

   Cells(ActiveCell.Row + 3, ActiveCell.Column — 3).Select

   ActiveCell = «Главный бухгалтер»

   Selection.Font.Bold = True

   ‘ Фамилия на три столбца правее должности

   Cells(ActiveCell.Row, ActiveCell.Column + 3).Select

   ActiveCell = «Т. С. Копейкин»

   Selection.Font.Bold = True

End Sub

Вывод в ячейки названия книги, листа и количества листов

Sub Test()

 Dim book As String

 Dim sheet As String

 Dim addr As String

 addr = «C»

 book = Application.ActiveWorkbook.Name

 sheet = Application.ActiveSheet.Name

 Workbooks(book).Activate

 Worksheets(sheet).Activate

 Range(«A1») = book

 Range(«B1») = sheet

 Dim xList As Integer

 xList = Application.Sheets.Count

 For x = 1 To xList

   Dim s As String

   s = addr + LTrim(Str(x))

   Range(s) = x

 Next x

End Sub

Удаление пустых строк_1

Selection.SpecialCells(xlCellTypeBlanks).Select

Selection.Delete Shift:=xlUp

Удаление пустых строк_2

Sub DeleteEmptyStrings()

   Dim intLastRow As Integer  ‘ Номер последней используемой строки

   Dim intRow As Integer      ‘ Номер проверяемой строки

   ‘ Получение номера последней используемой строки

   intLastRow = Worksheets(ActiveSheet.Index).UsedRange.Row + _

    Worksheets(ActiveSheet.Index).UsedRange.Rows.Count — 1

   ‘ Счетчик устанавливается на используемую первую строку

   intRow = Worksheets(ActiveSheet.Index).UsedRange.Row

   ‘ Удаление пустых строк

   Do While intRow <= intLastRow

      If ActiveSheet.Rows(intRow).Text = «» Then

         ‘ Удаление строки

         ActiveSheet.Rows(intRow).Delete

         ‘ Данные сдвинулись вверх, поэтому номер последней _

          строки уменьшился, а текущей — не изменился

         intLastRow = intLastRow — 1

      Else

         ‘ Текущая строка заполнена — переходим к следующей

         intRow = intRow + 1

      End If

   Loop

End Sub

Удаление пустых строк_3

Sub DeleteEmptyStrings1()

   Dim intRow As Integer

   Dim intLastRow As Integer

   ‘ Получение номера последней используемой строки

   intLastRow = ActiveSheet.UsedRange.Row + _

    ActiveSheet.UsedRange.Rows.Count — 1

   ‘ Удаление пустых строк

   For intRow = intLastRow To 1 Step -1

      If ActiveSheet.Rows(intRow).Text = «» Then

         ActiveSheet.Rows(intRow).Delete

      End If

   Next intRow

End Sub

Удаление строки по условию

Sub Макрос1()

Dim iRange As Range

Dim TextToFindArray As Variant

Dim i As ****

TextToFindArray = Array(«Toyota», «ВАЗ»)

With Application

.ScreenUpdating = False

.Calculation = xlCalculationManual

For i = 0 To 1

With ActiveSheet.Cells

Set iRange = .Find(What:=TextToFindArray(i), LookIn:=xlFormulas, LookAt:=xlPart)

If Not iRange Is Nothing Then

Do

iRange.EntireRow.Delete

Set iRange = .Find(What:=TextToFindArray(i), LookIn:=xlFormulas, LookAt:=xlPart)

Loop While Not iRange Is Nothing

End If

End With

Next i

.Calculation = xlCalculationAutomatic

.ScreenUpdating = True

End With

MsgBox «Строки с текстом » & TextToFindArray(0) & » и » & TextToFindArray(1) & » удалены!», 64, «Конец»

End Sub

Удаление скрытых строк

Sub KillHiddenRows()

For Each x In ActiveSheet.Rows

If x.Hidden Then x.Delete

Next

End Sub

Удаление используемых скрытых строк или строк с нулевой высотой

Sub KillUsedHiddenThinRows()

Dim x

For Each x In ActiveSheet.UsedRange.Rows

If x.Hidden Or x.Height = 0 Then x.EntireRow.Delete

Next

End Sub

Удаление дубликатов по маске

Function Two2One(Text As String) As String

Dim Polki, i As Byte, tmp As String

Application.Volatile

Polki = Split(Text, «@»)

For i = 1 To UBound(Polki)

If InStr(1, Polki(i), «:») > 0 Then

If Polki(i) <> Polki(i — 1) Then tmp = tmp & «@» & Polki(i)

Else: tmp = tmp & «@» & Polki(i)

End If

Next

Two2One = Polki(0) & tmp

End Function

Выделение диапазона над текущей ячейкой

Sub SelectCellRange()

   Dim strSelTop As String, strSelBottom As String

   ‘ Получение адресов нижней и верхней ячеек диапазона для выделения

   strSelBottom = ActiveCell.Address

   strSelTop = Cells(1, ActiveCell.Column).Address

   ‘ Выделяем все ячейки выше текущей (вместе с текущей ячейкой)

   Range(strSelTop & «:» & strSelBottom).Select

End Sub

Выделение диапазона над текущей ячейкой_2

Sub SelectColumnData()

‘ что делать при ошибке

On Error GoTo errors

‘ нижний адрес

Dim a1 As String

‘ верхний адрес

Dim a2 As String

‘ диапазое

Dim ran As Range

‘ если не верхнея ячейка

If (ActiveCell.Row <> 1) Then

‘ пойти вверх

ActiveCell.Offset(-1, 0).Select

‘ взять адрес ячейки

a1 = ActiveCell.Address

‘ будем подниматься

For x = 1 To (ActiveCell.Row — 1)

‘ на одну вверх

ActiveCell.Offset(-1, 0).Select

‘ если не число выход

If IsNumeric(ActiveCell.Value) <> True Then

‘ на одну вниз

ActiveCell.Offset(1, 0).Select

‘ выход

GoTo nexts

End If

‘ если пустая

If IsEmpty(ActiveCell.Value) = True Then

‘ на одну вниз

ActiveCell.Offset(1, 0).Select

‘ выход

GoTo nexts

End If

Next x

nexts:

‘ получаем адрес вырехней

a2 = ActiveCell.Address

‘ строим диапазон

Set ran = Range(a1 + «:» + a2)

‘ выбеляем

ran.Select

End If

‘ выходим из процедуры

Exit Sub

‘ ошибка зовем на помощь

errors:

MsgBox «Ошибка сообщите разработчику»

End Sub

Выделить ячейку и поместить туда число

Sub Test()

 With Application.Workbooks.Item(«Test.xls»)

 Worksheets(«Лист2»).Activate

 Range(«A2») = 2

 Range(«A3») = 3

 End With

End Sub

Выделение отрицательных значений

Sub NegSelect()

   Dim cell As Range

   ‘ Просмотр всех ячеек выделенного диапазона и пометка тех, _

    которые содержат отрицательные значения

   For Each cell In Selection

      If cell.Value < 0 Then

         cell.Interior.Color = RGB(255, 0, 0)

      Else

         cell.Interior.ColorIndex = xlNone

      End If

   Next cell

End Sub

Выделение диапазона и использование абсолютных адресов

Sub Test()

 With Application.Workbooks.Item(«Test.xls»)

  Worksheets(«Лист2»).Activate

  Dim HelloRange As Range

  Set HelloRange = Range(«D3:D10») ‘можно через запятую выделять несколько интервалов или яче

  HelloRange.Range(«A1») = 3

 End With

End Sub

Выделение ячеек через интервал_1

Sub IntervalCellSelect()

   Dim intFirstRow As Integer  ‘ Первая строка для выделения

   Dim intLastRow As Integer   ‘ Последняя строка для выделения

   Dim rgCells As Range        ‘ Объединение выделяемых ячеек

   Dim intRow As Integer

   intFirstRow = 3

   intLastRow = 300

   ‘ Формирование объединения ячеек в столбце «B» от строки _

    intFirstRow до строки intLastRow с шагом 3

   For intRow = intFirstRow To intLastRow Step 3

      If rgCells Is Nothing Then

         ‘ Первая ячейка в объединении

         Set rgCells = Cells(intRow, 1)

      Else

         ‘ Добавление очередной ячейки в объединение

         Set rgCells = Union(rgCells, Cells(intRow, 1))

      End If

   Next

   ‘ Выделение всех ячеек в объединении

   rgCells.Select

End Sub

Выделение ячеек через интервал_2

Sub IntervalCellSelect()

   Dim intFirstRow As Integer  ‘ Первая строка для выделения

   Dim intLastRow As Integer   ‘ Последняя строка для выделения

   Dim rgCells As Range        ‘ Объединение выделяемых ячеек

   Dim cell As Range           ‘ Текущая ячейка

   Dim intRow As Integer

   intFirstRow = 3

   intLastRow = 300

   ‘ Формирование объединения ячеек в столбце «B» от строки _

    intFirstRow до строки intLastRow с шагом 3

   For intRow = intFirstRow To intLastRow Step 3

      Set cell = Cells(intRow, 1)

      Set rgCells = Union(cell, _

      IIf(intRow = intFirstRow, cell, rgCells))

   Next

   ‘ Выделение всех ячеек в объединении

   rgCells.Select

End Sub

Выделение нескольких диапазонов

Sub SelectRange()

   Range(«D3:D10, A3:A10 , F3»).Select

End Sub

Движение по ячейкам

переменная.Offset(RowOffset, ColumnOffset)

В качестве переменных может выступать как ячейка так и диапазон (Range) удобно пользоваться этой функцией для смещения относительно текущей ячейки.

Например, смещение ввниз на одну ячейку и выделение ее:

ActiveCell.Offset(1, 0).Select

Если нужно двигаться вверх, то нужно использовать отрицательное число:

ActiveCell.Offset(-1, 0).Select

Функция ниже использует эту возможность для того, чтобы пробежаться вниз до первой пустой ячейки.

Sub beg()

            Dim a As Boolean

            Dim d As Double

            Dim c As Range

            a = True

            Set c = Range(ActiveCell.address)

            c.Select

            d = c.Value

            c.Value = d

            While (a = True)

                        ActiveCell.Offset(1, 0).Select

                        If (IsEmpty(ActiveCell.Value) = False) Then

                                   Set c = Range(ActiveCell.address)

                                   c.Select

                                   d = c.Value

                                   c.Value = d

                        Else

                                   a = False

                        End If

            Wend

End Sub

Поиск ближайшей пустой ячейки столбца

Sub FindEmptyCell()

   ‘ Поиск ближайшей пустой ячейки в текущем столбце

   Do While Not IsEmpty(ActiveCell.Value)

      ActiveCell.Offset(1, 0).Select

   Loop

End Sub

Поиск максимального значения

Sub FindMaxValue()

   On Error Goto NoCell

   If Selection.Count > 1 Then

      ‘ Поиск максимального значения в выделенных ячейках

      Selection.Find(Application.Max(Selection)).Select

   Else

      ‘ Поиск максимального значения во всех ячейках листа

      ActiveSheet.Cells.Find(Application.Max(ActiveSheet.Cells)).Select

   End If

   Exit Sub

NoCell:

   MsgBox «Максимальное значение не найдено»

End Sub

Поиск и замена по шаблону

Sub ReplaceCellsData()

   Dim cell As Range

   ‘ Просмотр всех ячеек диапазона G1:K20 и замена искомого текста

   For Each cell In [G1:K20]

      If cell.Value Like «*Доход*» Then

         cell.Value = «Выручка»

         cell.Interior.Color = RGB(255, 255, 0)

      Else

         cell.Interior.Color = RGB(255, 255, 255)

      End If

   Next

End Sub

Поиск значения с отображением результата в отдельном окне

Sub Search()

   Dim rgResult As Range

   ‘ Поиск заданного значения в диапазоне B1:B20 и вывод результата

   Set rgResult = Range(«B1:B20»).Find(9999, , xlValues)

   If rgResult Is Nothing Then

      MsgBox «Поиск не дал результатов»

   Else

      MsgBox rgResult.Address

   End If

End Sub

Поиск с выделением найденных данных_1

Sub FindAndSelect()

   Dim strStartAddr As String ‘ Хранит координаты первого найденного _

                               значения

   Dim rgResult As Range

   ‘ Поиск первого входжения искомого слова

   Set rgResult = Range(«B1:B10»).Find(«Прибыль», , xlValues)

   If Not rgResult Is Nothing Then

      ‘ Сохраним адрес найденной ячейки (чтобы контролировать _

       зацикливание поиска)

      strStartAddr = rgResult.Address

   End If

   Do While Not rgResult Is Nothing

      ‘ Обработка результата поиска

      rgResult.Interior.Color = RGB(255, 255, 0)

      ‘ Новый поиск

      Set rgResult = Range(«B1:B10»).FindNext(rgResult)

      If rgResult.Address = strStartAddr Then

         ‘ Поиск завершен

         Exit Do

      End If

   Loop

End Sub

Поиск с выделением найденных данных_2

Sub CustomSearch()

   Dim strFindData As String

   Dim rgFound As Range

   Dim i As Integer

   ‘ Ввод строки для поиска

   strFindData = InputBox(«Введите данные для поиска»)

   ‘ Просмотр всех рабочих листов книги

   For i = 1 To Worksheets.Count

      With Worksheets(i).Cells

         ‘ Поиск на i-м листе

         Set rgFound = .Find(strFindData, LookIn:=xlValues)

         If Not rgFound Is Nothing Then

            ‘ Ячейка с заданным значением найдена — выделим ее

            Sheets(i).Select

            rgFound.Select

            Exit Sub

         End If

      End With

   Next

   ‘ Поиск завершен. Ячейка не найдена

   MsgBox («Поиск не дал результатов»)

End Sub

Поиск по условию в диапазоне

Option Explicit

Sub Поиск()

Dim iFoundRng As Range

Dim AutoNum As String

Dim firstAddress As String

Dim LastFoundRng As String

    AutoNum = Range(«E5»)

    If AutoNum = «» Then

        MsgBox «Вы не указали номер авто в ячейке Е5!», 48, «Ошибка»

        Exit Sub

    End If

    On Error Resume Next

    LastFoundRng = ActiveWorkbook.Names(«LastFoundRngName»).RefersToRange.Address

    If LastFoundRng = «» Then LastFoundRng = «$C$1»

    With Columns(«C»)

        Set iFoundRng = .Find(What:=AutoNum, After:=Range(LastFoundRng), LookIn:=xlFormulas, LookAt:=xlWhole)

        If iFoundRng Is Nothing Then

            MsgBox «Авто с номером » & AutoNum & » не найдено в столбце С!», «48», «Ошибка»

            Exit Sub

        End If

        ActiveWorkbook.Names.Add Name:=»LastFoundRngName», RefersTo:=»=» & ActiveSheet.Name & «!» & iFoundRng.Address, Visible:=False

    End With

    [E7] = iFoundRng.Offset(0, 1)

    [F7] = iFoundRng.Offset(0, 2)

End Sub

Поиск последней непустой ячейки диапазона

Function dhLastUsedCell(rgRange As Range) As ****

   Dim lngCell As ****

   ‘ Пойдем по диапазону с конца (тогда первая попавшаяся _

    заполненная ячейка и будет искомой)

   For lngCell = rgRange.Count To 1 Step -1

      If Not IsEmpty(rgRange(lngCell)) Then

         ‘ Нашли непустую ячейку

         dhLastUsedCell = lngCell

         Exit Function

      End If

   Next lngCell

   ‘ Непустую ячейку не нашли

   dhLastUsedCell = 0

End Function

Поиск последней непустой ячейки столбца

Function dhLastColUsedCell(rgColumn As Range) As Variant

   ‘ Вывод значения последней непустой ячейки столбца

   dhLastColUsedCell = rgColumn.Parent.Cells(Rows.Count, _

    rgColumn.Column).End(xlUp).Value

End Function

Поиск последней непустой ячейки строки

Function dhLastRowUsedCell(rgRow As Range) As Variant

   ‘ Вывод значения последней непустой ячейки строки

   dhLastRowUsedCell = rgRow.Parent.Cells(rgRow.Row, 256). _

    End(xlToLeft).Address

End Function

Поиск ячейки синего цвета в диапазоне

Sub Макрос1()

Dim myRange As Range ‘диапазон для поиска

Dim FoundRng As Range ‘найденная ячейка

Dim iRow As ****

Dim iColumn As ****

Set myRange = Range(«B1:B100»)

Application.FindFormat.Interior.ColorIndex = 5 ‘будем искать синий цвет

Set FoundRng = myRange.Find(What:=»», SearchFormat:=True)

If Not FoundRng Is Nothing Then

iRow = FoundRng.Row

iColumn = FoundRng.Column

MsgBox «Ячейка найдена по адресу: » & Chr(13) & «Ряд: » & iRow & Chr(13) & «Столбец: » & iColumn, vbInformation, «»

Else

MsgBox «Ячейка не найдена!», vbExclamation, «»

End If

End Sub

Поиск наличия значения в столбце

Sub Макрос1()

Dim iCell As Range

Set iCell = Columns(1).Find(What:=»*», LookIn:=xlFormulas, SearchDirection:=xlPrevious)

If Not iCell Is Nothing Then

MsgBox «Номер последней заполненной строки в столбце A: » & iCell.Row, , «»

Else

MsgBox «Столбец «»A»» не содержит данных», vbExclamation, «»

End If

End Sub

Поиск совпадений в диапазоне

Option Explicit

Sub compare_areas()

Dim r As Range, ar As Range, nm As String, col As Range

Set r = Selection

If r.Count < 2 Then Exit Sub

‘Dim r_prog As Integer

‘r_prog = prog

‘prog = 1

Application.ScreenUpdating = False

nm = ActiveSheet.Name

Sheets.Add

For Each ar In r.Areas

   For Each col In ar.Columns

      col.Copy

      ActiveSheet.Paste

      ActiveCell.SpecialCells(xlLastCell).Offset(1, 0).Select

   Next

Next

Range(Cells(1, 1), Cells(r.Cells.Count, 2)).Select

Selection.Sort Key1:=Range(«A1»), Order1:=xlAscending, Header:=xlGuess, _

    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _

    DataOption1:=xlSortTextAsNumbers

Rows(«1:1»).Select

Selection.insеrt Shift:=xlDown

Cells(2, 2).FormulaR1C1 = «=IF((RC[-1]=R[-1]C[-1])+(RC[-1]=R[1]C[-1]),1,0)»

Range(«b2»).Select

Selection.AutoFill Destination:=Range(Cells(2, 2), Cells(r.Cells.Count + 1, 2)), Type:=xlFillDefault

Range(Cells(2, 2), Cells(r.Cells.Count + 1, 2)).Copy

Cells(2, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

    :=False, Transpose:=False

Application.CutCopyMode = False

For Each ar In r.Cells

    If ar.Value <> Empty Then

        If WorksheetFunction.VLookup(ar.Value, Range(Cells(2, 1), Cells(r.Count + 1, 2)), 2, 0) Then

            ar.Interior.ColorIndex = 3

        End If

    End If

Next

Application.DisplayAlerts = False

ActiveSheet.Delete

Sheets(nm).Select

ActiveCell.Select

Application.DisplayAlerts = True

Application.ScreenUpdating = True

‘prog = r_prog

End Sub

Sub uncolor()

    Selection.Interior.ColorIndex = xlNone

End Sub

Поиск ячейки в диапазоне_1

Dim r As Range

Dim foundCell As Range

Set r = ActiveSheet.Range(«A1:A6»)

Set foundCell = r.Find(«Ichiro», LookIn:=xlValues)

If Not foundCell Is Nothing Then

    foundCell.Select

Else

    MsgBox «String not found.»

End If

Поиск  ячейки в диапазоне_2

Sub findtekst()

Dim c As Range

Set c = Range(«c3:c98»).Find(«*ГКИ*», , , xlWhole)

If Not c Is Nothing Then c.Select

MsgBox (c)

End Sub

Также для финда по xlWhole вариации:

«*a» — заканчивается на a

«?a*» — 2-я буква a

«??a*» — 3-я буква а

«a?» — начинается на a и содержит ещё 1 любую букву

«a?*» — 2+ буквы минимум и начинается на a (например a1, a10, a12, a55, a55dd56 всё посчитается)

«*слово*» — находит слова содержащие «слово» в любой части строки (включая начало и конец)

«слово*» — находит ячейки начинающиеся со «слово» или просто ячейку «слово» без дополнительных букв

Поиск приближенного значения в диапазоне

Sub wwe()

Dim foundCell As Range

    ActiveWorkbook.Names.Add Name:=»ev», RefersToR1C1:= _

        «=INDEX(Лист1!R11C2:R34C2,MATCH(MIN(ABS(Лист1!R36C2:R234C2-Лист1!R28C1)),ABS(Лист1!R36C2:R234C2-Лист1!R28C1),0))»

Set foundCell = [ev]

Names(«ev»).Delete

If Not foundCell Is Nothing Then

foundCell.Select

Else

MsgBox «String not found.»

End If

End Sub

Поиск начала и окончания диапазона, содержащего данные

Sub FindSheetData()

   ‘ Выводим диапазон используемых ячеек листа

   MsgBox ActiveSheet.UsedRange.Address

End Sub

Поиск начала данных

Sub FindStartOfData()

   With ActiveSheet

      ‘ Заносим текст в ячейку, являющуюся левой верхней _

       ячейкой используемого диапазона

      .Cells(.UsedRange.Row, .UsedRange.Column).Value = _

       «Начало данных»

   End With

End Sub

Автоматическая замена значений

Sub ReplaceValues()

   Dim cell As Range

   ‘ Проверка каждой ячейки диапазона на возможность замены _

    значения в ней (отрицательные значения заменяются на -1, _

    положительные — на 1)

   For Each cell In Range(«C1:C3»).Cells

      If cell.Value < 0 Then

         cell.Value = -1

      ElseIf cell.Value > 0 Then

         cell.Value = 1

      End If

   Next

End Sub

Быстрое заполнение диапазона (массив)

Sub FillCells()

   Dim intStartVal As Integer   ‘ Начальное значение

   Dim intStep As Integer       ‘ Шаг при изменении значения

   Dim intEndVal As Integer     ‘ Конечное значение

   Dim intVal As Integer        ‘ Текущее значение

   Dim intCellOffset As Integer ‘ Смещение от начальной ячейки

   ‘ Установка параметров заполнения

   intStartVal = 1

   intStep = 1

   intEndVal = 100

   ‘ Заполнение ячеек текущего столбца значениями от 1 до 100

   For intVal = intStartVal To intEndVal Step intStep

      ActiveCell.Offset(intCellOffset, 0).Value = intVal

      intCellOffset = intCellOffset + 1

   Next intVal

End Sub

Заполнение через интервал(массив)

Sub FillCells()

   Dim intStartVal As Integer   ‘ Начальное значение

   Dim intStep As Integer       ‘ Шаг при изменении значения

   Dim intEndVal As Integer     ‘ Конечное значение

   Dim intVal As Integer        ‘ Текущее значение

   Dim intCellOffset As Integer ‘ Смещение от начальной ячейки

   Dim intCellStep As Integer   ‘ Шаг при перемещении между _

                                 заполняемыми ячейками

   ‘ Установка параметров заполнения

   intStartVal = 3

   intStep = 3

   intEndVal = 30

   intCellStep = 3

   ‘ Заполнение ячеек текущего столбца значениями от 3 до 30

   For intVal = intStartVal To intEndVal Step intStep

      ActiveCell.Offset(intCellOffset, 0).Value = intVal

      intCellOffset = intCellOffset + intCellStep

   Next intVal

End Sub

Заполнение указанного диапазона(массив)

Sub FillCellRect()

   Dim lngRows As ****, intCols As Integer ‘ Количество ячеек по _

                                            горизонтали и вертикали

   Dim lngRow As ****, intCol As Integer   ‘ Координаты текущей ячейки

   Dim lngStep As ****, lngVal As ****

   ‘ Установка начального значения и шага заполнения

   lngVal = 1

   lngStep = 1

   ‘ Ввод количества ячеек по горизонтали и вертикали, которое _

    необходимо заполнить

   lngRows = Val(InputBox(«Количество ячеек в высоту»))

   intCols = Val(InputBox(«Количество ячеек в ширину»))

   ‘ Отключение обновления экрана

   Application.ScreenUpdating = False

   ‘ Заполнение ячеек значениями

   For lngRow = 1 To lngRows

      For intCol = 1 To intCols

         ActiveCell.Offset(lngRow, intCol).Value = lngVal

         lngVal = lngVal + lngStep

      Next intCol

   Next lngRow

   ‘ Включение обновления экрана

   Application.ScreenUpdating = True

End Sub

Заполнение диапазона(массив)

Sub FillCellRect1()

   Dim lngRows As ****, intCols As Integer

   Dim lngRow As ****, intCol As Integer

   Dim lngStep As ****, lngVal As ****

   Dim alngValues() As ****

   Dim rgRange As Range

   ‘ Установка начального значения и шага заполнения

   lngVal = 1

   lngStep = 1

   ‘ Ввод количества ячеек по горизонтали и вертикали, которое _

    необходимо заполнить

   lngRows = Val(InputBox(«Количество ячеек в высоту»))

   intCols = Val(InputBox(«Количество ячеек в ширину»))

   ReDim alngValues(1 To lngRows, 1 To intCols)

   Set rgRange = ActiveCell.Range(Cells(1, 1), _

    Cells(lngRows, intCols))

   ‘ Заполнение массива alngValues значениями

   For lngRow = 1 To lngRows

      For intCol = 1 To intCols

         alngValues(lngRow, intCol) = lngVal

         lngVal = lngVal + lngStep

      Next intCol

   Next lngRow

   ‘ Перенос значений из массива в таблицу

   rgRange.Value = alngValues

End Sub

Расчет суммы первых значений диапазона

Листинг 2.65. Функция dhNSum

Function dhNSum(ByVal intCount As Integer, _

 rgValues As Range) As Double

   Dim i As Integer

   Dim dblSum As Double

   If intCount > rgValues.Count Then

      ‘ Задано количество элементов большее, чем есть _

       в переданном диапазоне

      intCount = rgValues.Count

   End If

   ‘ Расчет суммы первых intCount элементов

   For i = 1 To intCount

      dblSum = dblSum + rgValues(i)

   Next i

   ‘ Возврат результата

   dhNSum = dblSum

End Function

Размещение в ячейке электронных часов

Sub updаtеTime()

   Dim varNextCall As Variant

   ‘ Записываем в ячейку текущее время

   Cells(1, 1).Value = Now

   ‘ Записываем в varNextCall время, когда вызвать этот макрос _

    в следующий раз (через 1 секунду)

   varNextCall = TimeSerial(Hour(Now), Minute(Now), Second(Now) + 1)

   ‘ Уведомляем Excel в необходимости вызова макроса

   Application.OnTime varNextCall, «updаtеTime»

End Sub

 «Будильник»

Sub Clock()

   ‘ Уведомляем Excel, что процедуру Alarm нужно вызвать в 20:55

   Application.OnTime TimeValue(«20:55:00»), «Alarm»

End Sub

Sub Alarm()

   MsgBox «Пора ужинать!!!»

End Sub

Оформление верхней и нижней границ диапазона

Sub RangeBorder()

   Dim rgRange As Range

   Set rgRange = Range(«B2:D5»)

   ‘ Оформление верхней границы диапазона

   With rgRange.Borders(xlEdgeTop)

      .Weight = xlThick

      .LineStyle = xlContinuous

      .Color = RGB(0, 0, 255)

   End With

   ‘ Оформление нижней границы диапазона

   With rgRange.Borders(xlEdgeBottom)

      .Weight = xlMedium

      .LineStyle = xlDash

      .Color = RGB(255, 0, 255)

   End With

End Sub

Адрес активной ячейки

Sub Worksheet_Selectiоnchange(ByVal Target As Range)

   ‘ Вывод адреса ячейки в различных форматах

   MsgBox Target.Address() & vbCr & _

    Target.Address(RowAbsolute:=False) & vbCr & _

    Target.Address(ReferenceStyle:=xlR1C1) & vbCr & _

    Target.Address(ReferenceStyle:=xlR1C1, _

     RowAbsolute:=False, ColumnAbsolute:=False, _

     RelativeTo:=Worksheets(1).Cells(2, 2))

End Sub

Координаты активной ячейки

ActiveCell.Row и ActiveCell.Column — покажут координаты активной ячейки.

Формула активной ячейки

s = Range(«A3»).Formula

Получение из ячейки формулы

Sub Test()

 With Application.Workbooks.Item(«Test.xls»)

  Worksheets(«Лист2»).Activate

  Range(«A2») = 2

  Range(«A3») = «=A2+2»

  MsgBox Range(«A3″).Formula + »  — » + Str(Range(«A3»).Value)

 End With

End Sub

Тип данных ячейки

Function dhCellType(rgRange As Range) As String

   ‘ Переходим к левой верхней ячейке, если rgRange — диапазон, _

    а не одна ячейка

   Set rgRange = rgRange.Range(«A1»)

   ‘ Определение типа значения в ячейке

   Select Case True

      Case IsEmpty(rgRange)

         ‘ Ячейка пуста

         dhCellType = «Пусто»

      Case Application.IsText(rgRange)

         ‘ В ячейке текст

         dhCellType = «Текст»

      Case Application.IsLogical(rgRange)

         ‘ В ячейке логическое значение (True или False)

         dhCellType = «Булево выражение»

      Case Application.IsErr(rgRange)

         ‘ При вычислении значения в ячейке произошла ошибка

         dhCellType = «Ошибка»

      Case IsDate(rgRange)

         ‘ В ячейке дата

         dhCellType = «Дата»

      Case InStr(1, rgRange.Text, «:») <> 0

         ‘ В ячейке время

         dhCellType = «Время»

      Case IsNumeric(rgRange)

         ‘ В ячейке числовое значение

         dhCellType = «Число»

   End Select

End Function

Вывод адреса конца диапазона

Sub TestRange()

            Dim r As Range

            Set r = Range(«rrrrr»)

            MsgBox (r.Columns.End(xlUp).Address)

            MsgBox (r.Columns.End(xlDown).Address)

End Sub

Получение информации о выделенном диапазоне

Sub TypeOfSelection()

   Dim rgSelUnion As Range         ‘ Объединение выделенных областей

   Dim strTitle As String          ‘ Заголовок сообщения

   Dim strMessage As String        ‘ Текст сообщения

   Dim strSelType As String        ‘ Тип выделения (простой или _

                                    множественный)

   Dim intBlockCount As Integer    ‘ Количество блоков в выделении

   Dim intCellCount As ****        ‘ Общее количество выделенных ячеек

   Dim intColCount As Integer      ‘ Количество выделенных столбцов

   Dim intRowCount As ****         ‘ Количество выделенных строк

   Dim intAreasCount As Integer    ‘ Количество выделенных областей

   Dim strCurSelType  As String

   Dim rgArea As Range

   ‘ Подсчет количества выделенных областей и определение типа выделения: _

    простое (одна область) или сложное(несколько областей)

   intAreasCount = Selection.Areas.Count

   If intAreasCount = 1 Then

      strTitle = «Простое выделение»

   Else

      strTitle = «Множественное выделение»

   End If

   ‘ Определение типа выделения первой области

   strSelType = dhGetAreaType(Selection.Areas(1))

   ‘ Создание объединения во избежание повторного учета _

    пересекающихся участков выделенных диапазонов

   Set rgSelUnion = Selection.Areas(1)

   For Each rgArea In Selection.Areas

      strCurSelType = dhGetAreaType(rgArea)

      ‘ Изменение надписи о типе всего выделения, если _

       есть выделения различного типа

      If strCurSelType <> strSelType Then

         strSelType = «Множественный»

      End If

      ‘ Определение количества блоков перед их добавлением в объединение

      If strCurSelType = «Block» Then

         intBlockCount = intBlockCount + 1

      End If

      ‘ Добавление в объединение

      Set rgSelUnion = Union(rgSelUnion, rgArea)

   Next rgArea

   ‘ Просматриваются элементы созданного объединения

   For Each rgArea In rgSelUnion.Areas

      Select Case dhGetAreaType(rgArea)

         Case «Строка»

            intRowCount = intRowCount + rgArea.Rows.Count

         Case «Столбец»

            intColCount = intColCount + rgArea.Columns.Count

         Case «Лист»

            intColCount = intColCount + rgArea.Columns.Count

            intRowCount = intRowCount + rgArea.Rows.Count

      End Select

   Next rgArea

   ‘ Определение количества неперекрывающихся ячеек

   intCellCount = rgSelUnion.Count

   ‘ Формирование и вывод итогового сообщения

   strMessage = «Тип выделения:» & vbTab & strSelType & vbCrLf & _

    «Количество областей:      » & vbTab & intAreasCount & vbCrLf & _

    «Полных столбцов:          » & vbTab & intColCount & vbCrLf & _

    «Полных строк:             » & vbTab & intRowCount & vbCrLf & _

    «Блоков ячеек:             » & vbTab & intBlockCount & vbCrLf & _

    «Всего ячеек:              » & vbTab & Format(intCellCount, «#,###»)

   MsgBox strMessage, vbInformation, strTitle

End Sub

Function dhGetAreaType(rgRangeArea As Range) As String

   ‘ Определение типа диапазона

   If rgRangeArea.Count = Cells.Count Then

      ‘ Все ячейки рабочего листа

      dhGetAreaType = «Лист»

   ElseIf rgRangeArea.Cells.Count = 1 Then

      ‘ Одна ячейка

      dhGetAreaType = «Ячейка»

   ElseIf rgRangeArea.Rows.Count = Cells.Rows.Count Then

      ‘ Весь столбец

      dhGetAreaType = «Столбец»

   ElseIf rgRangeArea.Columns.Count = Cells.Columns.Count Then

      ‘ Вся строка

      dhGetAreaType = «Строка»

   Else

      ‘ Блок ячеек

      dhGetAreaType = «Блок»

   End If

End Function

Взять слово с 13 символа в ячейке

‘берём значение ячейка А4 из Отчёта

iMonth = «за период с Июль 2 008 по Июль 2 008 »

‘берём слово начиная с 13-го символа

iMonth = Evaluate(«MID(TRIM(» & «»»» & iMonth & «»»» & «),13,(SEARCH(«» «»,TRIM(» & «»»» & iMonth & «»»» & «),13)-13))»)

‘вставляем это слово в книгу Ведомость

AddressSht.Range(«A1») = iMonth

Создание изменяемого списка (таблица)

Sub Макрос2()

With ActiveSheet

.ListObjects.Add(xlSrcRange, .Range(«$A$8:$AR$» & .Cells(Rows.Count, 1).End(xlUp).Row), , xlYes).Name = _

«Список1»

End With

End Sub

Проверка на пустое значение

IsNull(выражение) — проверка на пустое значение

Пересечение ячеек

Sub Test()

  With ActiveWorkbook

   Worksheets(«Лист1»).Activate

   Dim Range1 As Range

   Set Range1 = Range(«A1:A8 A8:D8»)

   Range1.Value = «test»

  End With

End Sub

Умножение выделенного диапазона на 2

Sub Test()

Dim cur_range As Range

 With ActiveSheet

 Set cur_range = Selection

 cur_range.Activate

 For x = 1 To cur_range.Rows.Count

  For y = 1 To cur_range.Columns.Count

  ‘ значению ячейки присвоить значение умноженно на 2

  cur_range(x, y) = cur_range(x, y).Value * 2

  Next y

 Next x

 End With

End Sub

Одновременное умножение всех данных диапазона

Sub MultAllCells()

   Dim dblMult As Double

   Dim cell As Range

   ‘ Ввод коэффициента для умножения

   dblMult = InputBox(«Введите коэффициент, на который следует умножать»)

   ‘ Умножение содержимого на введенный коэффициент

   For Each cell In Selection

      If IsNumeric(cell.Value) And cell.Value <> «» Then

         ‘ Умножаются только ячейки, содержащие числовые данные

         cell.Value = cell.Value * dblMult

      Else

         MsgBox «В ячейке » & cell.Address & » нечисловое значение»

      End If

   Next

End Sub

Деление диапазона на 100

Sub Test23()

Dim iRange As Range

Dim kRange As Range

i = 1

j = 1

m = 5

n = 2

Set iRange = Range(Cells(i, j), Cells(m, n))

For Each kRange In iRange

kRange.Value = kRange.Value / 100

Next

End Sub

Возведение каждой ячейки диапазона в квадрат

Суммирование данных только видимых ячеек

Function СуммаВид(Диапазон) As Double

   ‘ Просмотр всех ячеек заданного диапазона

   For Each Ячейка In Диапазон

      ‘ Анализ только видимых ячеек

      If Not Ячейка.EntireRow.Hidden And Not _

       Ячейка.EntireColumn.Hidden Then

         ‘ При расчете учитываются только ячейки _

          с численными значениями

         If IsNumeric(Ячейка) = True Then

            СуммаВид = СуммаВид + Ячейка

         End If

      End If

   Next

End Function

Сумма ячеек с числовыми значениями

Sub CalculateSum()

   Dim i As Integer

   Dim intSum As Integer

   ‘ Расчет суммы ячеек столбца «A» (с первой по пятую)

   For i = 1 To 5

      If IsNumeric(Cells(i, 1)) Then

         intSum = intSum + Cells(i, 1)

      End If

   Next

   MsgBox «Сумма ячеек: » & intSum

End Sub

При суммировании — курсор внутри диапазона

Function Сумма(Диапазон, АдресЯчейки) As Double

   ‘ Просмотр всех ячеек диапазона

   For Each Ячейка In Диапазон

      ‘ Проверка, чтобы в суммировании не участвовала _

       ячейка с формулой

      If АдресЯчейки.Address <> Ячейка.Address Then

         ‘ В суммировании участвуют только ячейки _

          с численными значениями

         If IsNumeric(Ячейка) = True Then

            Сумма = Сумма + Ячейка

         End If

      End If

   Next

End Function

Начисление процентов в зависимости от суммы_1

Function dhCalculatePercent(lngSum As ****) As Double

   ‘ Процентные ставки (декларация констант)

   Const dblRate1 As Double = 0.09

   Const dblRate2 As Double = 0.11

   Const dblRate3 As Double = 0.15

   ‘ Граничные суммы вкладов (декларация констант)

   Const intSum1 As **** = 5000

   Const intSum2 As **** = 10000

   ‘ Возвращаем сумму, умноженную на соответствующую ставку

   If lngSum < intSum1 Then

      dhCalculatePercent = lngSum * dblRate1

   ElseIf lngSum < intSum2 Then

      dhCalculatePercent = lngSum * dblRate2

   Else

      dhCalculatePercent = lngSum * dblRate3

   End If

End Function

Начисление процентов в зависимости от суммы_2

Function dhCalculatePercent(lngSum As ****) As Double

   ‘ Процентные ставки (декларация констант)

   Const dblRate1 As Double = 0.09

   Const dblRate2 As Double = 0.11

   Const dblRate3 As Double = 0.15

   ‘ Граничные суммы вкладов (декларация констант)

   Const intSum1 As **** = 5000

   Const intSum2 As **** = 10000

   ‘ Возвращаем сумму, умноженную на соответствующую ставку

   Select Case lngSum

      Case Is < intSum1

         dhCalculatePercent = lngSum * dblRate1

      Case Is < intSum2

         dhCalculatePercent = lngSum * dblRate2

      Case Else

         dhCalculatePercent = lngSum * dblRate3

   End Select

End Function

Начисление процентов в зависимости от суммы_3

Function dhCalculatePercent(Sales As ****, IsTemporal As Boolean) As Double

   ‘ Процентные ставки (декларация констант)

   Const dblRate1 As Double = 0.09

   Const dblRate2 As Double = 0.11

   Const dblRate3 As Double = 0.15

   Const dblAdd As Double = 1.1

   ‘ Граничные суммы

   Const lngSum1 As **** = 5000

   Const lngSum2 As **** = 10000

   ‘ Расчет суммы для выплаты (как обычно)

   If Sales < lngSum1 Then

      dhCalculatePercent = Sales * dblRate1

   ElseIf Sales < lngSum2 Then

      dhCalculatePercent = Sales * dblRate2

   Else

      dhCalculatePercent = Sales * dblRate3

   End If

   If IsTemporal Then

      ‘ Для сторонних вкладчиков — надбавка

      dhCalculatePercent = dblAdd * dhCalculatePercent

   End If

End Function

Сводный пример расчета комиссионного вознаграждения

Function dhCalculateCom(dblSales As Double) As Double

   Const dblRate1 = 0.09

   Const dblRate2 = 0.11

   Const dblRate3 = 0.15

   ‘ Расчет комиссионных с продаж (без выслуги) в зависимости _

    от суммы

   Select Case dblSales

      Case 0 To 4999.99: dhCalculateCom = dblSales * dblRate1

      Case 5000 To 9999.99: dhCalculateCom = dblSales * dblRate2

      Case Is >= 10000: dhCalculateCom = dblSales * dblRate3

   End Select

End Function

Function dhCalculateCom2(dblSales As Double, intYears As Double) _

 As Double

   Const dblRate1 = 0.09

   Const dblRate2 = 0.11

   Const dblRate3 = 0.15

   ‘ Расчет комиссионных с продаж (без учета выслуги лет) _

    в зависимости от суммы

   Select Case dblSales

      Case 0 To 4999.99: dhCalculateCom2 = dblSales * dblRate1

      Case 5000 To 9999.99: dhCalculateCom2 = dblSales * dblRate2

      Case Is >= 10000: dhCalculateCom2 = dblSales * dblRate3

   End Select

   ‘ Надбавка за выслугу лет

   dhCalculateCom2 = dhCalculateCom2 + _

    (dhCalculateCom2 * intYears / 100)

End Function

Sub ComCalculator()

   Dim strMessage As String

   Dim dblSales As Double

   Dim ан As Integer

Calc:

   ‘ Отображение окна для ввода данных

   dblSales = Val(InputBox(«Сумма реализации:», _

    «Расчет комиссионного вознаграждения»))

   ‘ Формирование сообщения (с одновременным расчетом _

    вознаграждения)

   strMessage = «Объем продаж:» & vbTab & Format(dblSales, «$#,##0») & _

    vbCrLf & «Сумма вознаграждения:» & vbTab & _

    Format(dhCalculateCom(dblSales), «$#,##0») & _

    vbCrLf & vbCrLf & «Считаем дальше?»

   ‘ Вывод окна с сообщением (о рассчитанной сумме и вопросом _

    о продолжении расчетов)

   If MsgBox(strMessage, vbYesNo, _

    «Расчет комиссионного вознаграждения») = vbYes Then

      ‘ Продолжение расчетов

      GoTo Calc

   End If

End Sub

Движение по диапазону

Sub FullShach()

For Each c In Range(addressdiap)

    If c.Value > yr1 Then

       c.Select

        With Selection.Interior

          .ColorIndex = 6

          .Pattern = xlSolid

        End With

       Selection.Font.ColorIndex = yrcolor1

       If c.Value > yr2 Then

       c.Select

       Selection.Font.ColorIndex = yrcolor2

            If c.Value > yr3 Then

            c.Select

            Selection.Font.ColorIndex = yrcolor3

            End If

       End If

    End If

Next c

End Sub

Сдвиг от выделенной ячейки

Sub Test()

 Dim cur_range As Range

 Set cur_range = Range(«A1»)

 Set cur_range = cur_range.Offset(1, 0)

 Debug.Print cur_range.Address

End Sub

Перебор ячеек вниз по колонне

Sub beg()

Dim a As Boolean

Dim d As Double

Dim c As Range

a = False

Set c = Range(ActiveCell.Address)

c.Select

d = c.Value

c.Value = d

While (a = False)

ActiveCell.Offset(1, 0).Select

If (IsEmpty(ActiveCell.Value) = False) Then

Set c = Range(ActiveCell.Address)

c.Select

d = c.Value

c.Value = d

Else

a = False

End If

Wend

End Sub

Создание заливки диапазона

Sub FillRange()

   ‘ Заливка диапазона

   With Range(«B1:E10»)

      ‘ Задаем узор — сетчатый

      .Interior.Pattern = xlPatternChecker

      ‘ Цвет узора — синий

      .Interior.PatternColor = RGB(0, 0, 255)

      ‘ Цвет ячейки — красный

      .Interior.Color = RGB(255, 0, 0)

   End With

End Sub

Подбор параметра ячейки

Sub Макрос1()

‘ Сочетание клавиш: Ctrl+ф

    Range(«G5»).GoalSeek Goal:=4, ChangingCell:=Range(«G4»)

End Sub

Разбиение диапазона

Function ExtractElement(Txt, n, Separator) As String

‘   Функция выдает n-ый элемент текстовой строки Txt, где

‘   символ Separator используется как разделитель

    Dim Txt1 As String, TempElement As String

    Dim ElementCount As Integer, i As Integer

    Txt1 = Txt

‘   Если в качестве разделителя используется пробел, то убираем лишние

‘   и двойные пробелы

    If Separator = Chr(32) Then Txt1 = Application.Trim(Txt1)

‘   Добавляем разделитель в конец строки (если необходимо)

    If Right(Txt1, 1) <> Separator Then Txt1 = Txt1 & Separator

‘   Начальные значения

    ElementCount = 0

    TempElement = «»

‘   Извлекаем элемент

    For i = 1 To Len(Txt1)

        If Mid(Txt1, i, 1) = Separator Then

            ElementCount = ElementCount + 1

            If ElementCount = n Then

‘               Found it, so exit

                ExtractElement = TempElement

                Exit Function

            Else

                TempElement = «»

            End If

        Else

            TempElement = TempElement & Mid(Txt1, i, 1)

        End If

    Next i

    ExtractElement = «»

End Function

Закройте редактор и вернитесь в Excel командой File — Close and return to Microsoft Excel.

Теперь в любой ячейке листа Вы можете использовать эту функцию через меню Вставка — Функция — категория Определенные пользователем, где в аргументах:

•          Txt — ячейка с текстом, который надо разделить,

•          n — порядковый номер извлекаемого элемента,

•          Separator — символ-разделитель.

Объединение данных диапазона

Function Couple(Diapazon)

   ‘ Объединение данных, содержащихся в ячейках диапазона _

    Diapazon (разделитель между значениями — пробел)

   ‘ iCell — текущая ячейка

   For Each iCell In Diapazon

      ‘ Сцепляются данные только заполненных ячеек

      If IsEmpty(iCell) <> True Then

         ‘ Добавление значения ячейки в выходную строку

         If Couple = «» Then

            Couple = iCell

         Else

            Couple = Couple & » » & iCell

         End If

      End If

   Next

End Function

Объединение данных диапазона_2

Function CoupleFormat(Diapazon)

   ‘ Объединение текстовых данных, содержащихся в ячейках _

    диапазона Diapazon (разделитель между значениями — пробел)

   ‘ iCell — текущая ячейка

   For Each iCell In Diapazon

      ‘ Сцепляются данные только заполненных ячеек

      If IsEmpty(iCell) <> True Then

         ‘ Добавление текста ячейки в выходную строку

         If CoupleFormat = «» Then

            CoupleFormat = iCell.Text

         Else

            CoupleFormat = CoupleFormat & » » & iCell.Text

         End If

      End If

   Next

End Function

Узнать максимальную колонку или строку.

Sub Test()

 With ActiveSheet

  Dim cur_range As Range

  Set cur_range = .UsedRange

  Debug.Print cur_range.Address

 End With

End Sub

Ограничение возможных значений диапазона

Sub Worksheet_Change(ByVal Target As Excel.Range)

   Dim rgInputRange As Range

   Dim cell As Range

   Dim strMessage As String

   Dim varResult As Variant

   ‘ Диапазон, в котором контролируется ввод

   Set rgInputRange = Range(«A1:E10»)

   ‘ Просмотр всех измененных ячеек и контроль ввода в тех, которые _

    принадлежат заданному диапазону

   For Each cell In Target

      ‘ Проверка принадлежности диапазону

      If Union(cell, rgInputRange).Address = rgInputRange.Address Then

         ‘ Контроль правильности ввода

         varResult = IsCellDataValid(cell)

         If varResult = True Then

            ‘ Введено корректное значение

            Exit Sub

         Else

         ‘ Формирование и вывод сообщения об ошибке

         strMessage = «Ячейка » & cell.Address(False, False) & «:» _

          & vbCrLf & vbCrLf & varResult

         MsgBox strMessage, vbCritical, «Неправильное значение»

         ‘ Очистка ввода

         Application.EnableEvents = False

         cell.ClearContents

         cell.Activate

         Application.EnableEvents = True

         End If

      End If

   Next cell

End Sub

Function IsCellDataValid(cell As Range) As Variant

   ‘ Возвращает True, если в ячейку вводится целое число _

    в диапазоне от 1 до 12. В противном случае выдается _

    соответствующее сообщение

   ‘ Проверка, является ли содержимое ячейки числом

   If Not WorksheetFunction.IsNumber(cell.Value) Then

      IsCellDataValid = «Нечисловое значение»

      Exit Function

   End If

   ‘ Проверка, является ли введенное число целым

   If Int(cell.Value) <> cell.Value Then

      IsCellDataValid = «Введите целое число»

      Exit Function

   End If

   ‘ Проверка соответствия числа диапазону

   If cell.Value < 1 Or cell.Value > 12 Then

      IsCellDataValid = «Значение должно быть от 1 до 12»

      Exit Function

   End If

   ‘ В ячейку введено допустимое значение

   IsCellDataValid = True

End Function

Тестирование скорости чтения и записи диапазонов

Sub TableSpeedTest()

   Dim alngData() As ****        ‘ Массив с числами

   Dim lngCount As ****          ‘ Количество элементов в массиве

   Dim dtStart As Date           ‘ Хранит время (и даже дату) начала _

                                  тестирования

   Dim strArrayToTable As String ‘ Время записи в таблицу

   Dim strTableToArray As String ‘ Время чтения из таблицы

   Dim strMessage As String

   Dim i As ****

   ‘ Подготовка диапазона ячеек

   Range(«A:A»).ClearContents

   ‘ Ввод размера массива, формирование массива заданного размера

   lngCount = InputBox(«Введите количество элементов»)

   ReDim alngData(1 To lngCount)

   ‘ Заполнение массива данными

   For i = 1 To lngCount

      alngData(i) = i

   Next i

   ‘ Перенос массива в таблицу

   Application.ScreenUpdating = False

   dtStart = Timer

   For i = 1 To lngCount

      Cells(i, 1) = i

   Next i

   strArrayToTable = Format(Timer — dtStart, «00:00»)

   ‘ Чтение данных из таблицы обратно в массив

   dtStart = Timer

   For i = 1 To lngCount

      alngData(i) = Cells(i, 1)

   Next i

   strTableToArray = Format(Timer — dtStart, «00:00»)

   Application.ScreenUpdating = True

   ‘ Вывод на экран результатов тестирования

   strMessage = «Запись: » & strArrayToTable & vbCrLf & _

    «Чтение: » & strTableToArray

   MsgBox strMessage, , lngCount & » элементов»

End Sub

Открыть MsgBox при выборе ячейки

Private Sub Worksheet_Selectiоnchange(ByVal Target As Range)

If Target.Address = «$A$1» Then MsgBox «Hello world»

End Sub

Скрытие строки

Sub HideString()

   Rows(2).Hidden = True

End Sub

Скрытие нескольких строк

Sub HideStrings()

   Rows(«3:5»).Hidden = True

End Sub

Скрытие столбца

Sub HideCollumn()

   Columns(2).Hidden = True

End Sub

Скрытие нескольких столбцов

Sub HideCollumns()

   Columns(«E:F»).Hidden = True

End Sub

Скрытие строки по имени ячейки

Sub HideCell()

   Range(«Секрет»).EntireRow.Hidden = True

End Sub

Скрытие нескольких строк по адресам ячеек

Sub HideCell()

   Range(«B3:D4»).EntireRow.Hidden = True

End Sub

Скрытие столбца по имени ячейки

Sub HideCell()

   Range(«Секрет»).EntireColumn.Hidden = True

End Sub

Скрытие нескольких столбцов по адресам ячеек

Sub HideCell()

   Range(«C2:D5»).EntireColumn.Hidden = True

End Sub

Мигание ячейки

Sub BlinkingCell()

   Static intCalls As Integer  ‘ Счетчик количества миганий

   ‘ Если ячейка мигала менее 10 раз, то изменим _

    в очередной раз ее цвет

   If intCalls < 10 Then

      intCalls = intCalls + 1

      ‘ Определение, какой цвет необходимо установить

      If Range(«A1»).Interior.Color <> RGB(255, 0, 0) Then

         ‘ Цвет ячейки не красный, так что теперь назначим _

          именно красный цвет

         Range(«A1»).Interior.Color = RGB(255, 0, 0)

      Else

         ‘ Назначим ячейке зеленый цвет

         Range(«A1»).Interior.Color = RGB(0, 255, 0)

      End If

      ‘ Эту процедуру необходимо вызвать через 5 секунд

      Application.OnTime Now + TimeValue(«00:00:05»), «BlinkingCell»

   Else

      ‘ Хватит мигать

      Range(«A1»).Interior.ColorIndex = xlNone

      intCalls = 0

   End If

End Sub

ГЛАВА 4. РАБОТА С ПРИМЕЧАНИЯМИ

Вывод на экран всех примечаний рабочего листа

Sub ShowComments()

   Dim cell As Range

   Dim rgCells As Range

   ‘ Получение всех ячеек с примечаниями

   Set rgCells = Selection.SpecialCells(xlComments)

   If rgCells Is Nothing Then

      ‘ Примечаний нет

      Exit Sub

   End If

   ‘ Проходим по всем ячейкам диапазона

   For Each cell In rgCells

      ‘ Вывод примечаний в соседнюю ячейку

      cell.Next.Value = cell.Comment.Text

   Next

End Sub

Функция извлечения комментария

Function GetCommentText(rCommentCell As Range)

Dim strGotIt As String

On Error Resume Next

strGotIt = WorksheetFunction.Clean _

(rCommentCell.Comment.Text)

GetCommentText = strGotIt

On Error GoTo 0

End Function

вставить в модуль эксель

Список примечаний защищенных листов

Sub ShowComments1()

   Dim cell As Range

   Dim strFirstAddress As String

   Dim strComments As String

   ‘ Получаем все ячейки выделения, в которых есть комментарий

   Set cell = Selection.Find(«*», LookIn:=xlComments)

   If Not cell Is Nothing Then

      ‘ Сохранение адреса первой найденной ячейки _

       (для предотвращения зацикливания поиска)

      strFirstAddress = cell.Address

      Do

         ‘ Добавление текста примечания в выходную строку

         strComments = strComments & «Комментарий: » & _

          cell.Comment.Text & Chr(13)

         ‘ Продолжение поиска

         Set cell = Selection.FindNext(cell)

      Loop While Not cell Is Nothing And _

       cell.Address <> strFirstAddress

   End If

   If strComments <> «» Then

      ‘ Отображение окна с текстом примечаний

      MsgBox strComments

   Else

      MsgBox «В выделенной ячейке/ячейках комментариев нет»

   End If

End Sub

Перечень примечаний в отдельном списке_1

Sub ListOfComments()

   Dim cell As Range

   Dim rgCells As Range

   Dim intRow As Integer

   ‘ Получение всех ячеек с примечаниями

   On Error Resume Next

   Set rgCells = Selection.SpecialCells(xlComments)

   If rgCells Is Nothing Then

      ‘ Примечаний нет

      Exit Sub

   End If

   ‘ Проходим по всем ячейкам диапазона

   For Each cell In rgCells

      ‘ Вывод примечаний в ячейку столбца «C»

      intRow = intRow + 1

      Cells(intRow, 3) = cell.Comment.Text

   Next

End Sub

Перечень примечаний в отдельном списке_2

Sub ListOfComments1()

   Dim cell As Range

   Dim strFirstAddress As String

   Dim intRow As Integer

   ‘ Получение всех ячеек выделения, в которых есть примечания

   Set cell = Cells.Find(«*», LookIn:=xlComments)

   If Not cell Is Nothing Then

      ‘ Сохранение адреса первой найденной ячейки _

       (для предотвращения зацикливания поиска)

      strFirstAddress = cell.Address

      Do

         ‘ Вывод текста в столбец «C»

         intRow = intRow + 1

         Cells(intRow, 3) = cell.Comment.Text

         ‘ Продолжение поиска

         Set cell = Cells.FindNext(cell)

         Loop While Not cell Is Nothing And _

          cell.Address <> strFirstAddress

   End If

End Sub

Перечень примечаний в отдельном списке_3

Sub ListOfCommentsToFile()

   Dim rgCells As Range            ‘ Ячейки с примечаниями

   Dim intDefListCount As Integer  ‘ Используется для временного _

                   хранения количества листов в книге по умолчанию

   Dim strSheet As String          ‘ Имя анализируемого листа

   Dim strWorkBook As String       ‘ Имя книги с анализируемым листом

   Dim intRow As Integer

   Dim cell As Range

   ‘ Получение ячеек с примечаниями

   On Error Resume Next

   Set rgCells = ActiveSheet.Cells.SpecialCells(xlComments)

   On Error GoTo 0

   ‘ Если примечаний нет, то можно не продолжать

   If rgCells Is Nothing Then

      MsgBox «Текущая рабочая книга не содержит примечаний.», _

       vbInformation

      Exit Sub

   End If

   ‘ Сохранение имен анализируемого листа и книги

   strSheet = ActiveSheet.Name

   strWorkBook = ActiveWorkbook.Name

   ‘ Создание отдельной книги с одним листом _

    для отображения результатов

   intDefListCount = Application.SheetsInNewWorkbook

   Application.SheetsInNewWorkbook = 1

   Workbooks.Add

   Application.SheetsInNewWorkbook = intDefListCount

   ActiveWorkbook.Windows(1).Caption = «Comments for » & strSheet & _

    » in » & strWorkBook

   ‘ Создание списка примечаний

   Cells(1, 1) = «Адрес»

   Cells(1, 2) = «Содержимое»

   Cells(1, 3) = «Комментарий»

   Range(Cells(1, 1), Cells(1, 3)).Font.Bold = True

   intRow = 2  ‘ Данные начинаются со второй строки

   For Each cell In rgCells

      Cells(intRow, 1) = cell.Address(rowabsolute:=False, _

       columnabsolute:=False)

      Cells(intRow, 2) = » » & cell.Formula

      Cells(intRow, 3) = cell.comment.Text

      intRow = intRow + 1

   Next

End Sub

Подсчет количества примечаний_1

Sub CountOfComments()

   Dim intCommentCount As Integer

   ‘ Получение и отображение количества примечаний

   intCommentCount = ActiveSheet.Comments.Count

   If intCommentCount = 0 Then

      MsgBox «Текущая рабочая книга не содержит примечаний.», _

       vbInformation

   Else

      MsgBox «В текущей рабочей книге содержится » & intCommentCount _

       & » комментариев.», vbInformation

   End If

End Sub

Подсчет количества примечаний_2

‘ Function IsCommentsPresent

 ‘ Возвращает TRUE, если на активном рабочем листе имеется хотя бы

 ‘ одна ячейка с комментарием, иначе возвращает FALSE

 ‘

 Public Function IsCommentsPresent() As Boolean

   IsCommentsPresent = ( ActiveSheet.Comments.Count <> 0 )

 End Function

Подсчет примечаний_3

Sub CountOfComment()

   Dim intCommentCount As Integer

   ‘ Получение и отображение количества примечаний _

    на текущем листе

   intCommentCount = ActiveSheet.Comments.Count

   If intCommentCount = 0 Then

      MsgBox «Примечаний нет»

   Else

      MsgBox «Примечаний: » & intCommentCount & » шт.»

   End If

End Sub

Выделение ячеек с примечаниями

Sub SelectComments()

   ‘ Выделение всех ячеек с примечаниями

   Cells.SpecialCells(xlCellTypeComments).Select

End Sub

Отображение всех примечаний

Sub ShowComments()

   ‘ Отображение всех примечаний

   If Application.DisplayCommentIndicator = xlCommentAndIndicator Then

      Application.DisplayCommentIndicator = xlCommentIndicatorOnly

   Else

      Application.DisplayCommentIndicator = xlCommentAndIndicator

   End If

End Sub

Изменение цвета примечаний

Sub ChangeCommentColor()

   ‘ Автоматическое изменение цвета комментариев

   Dim comment As comment

   For Each comment In ActiveSheet.Comments

      ‘ Задаем случайные цвета заливки и шрифта комментариев

      comment.Shape.Fill.ForeColor.SchemeColor = Int((80) * Rnd + 1)

      comment.Shape.TextFrame.Characters.Font.ColorIndex = Int((56 _

       ) * Rnd + 1)

   Next

End Sub

Добавление примечаний

Dim r As Range

Dim rwIndex As Integer

For rwIndex = 1 To 3

    Set r = Worksheets(«WombatBattingAverages»).Cells(rwIndex, 2)

    With r

         If .Value >= 0.3 Then

              .AddComment «All Star!»

         End If

    End With

Next rwIndex

Добавление примечаний в диапазон по условию

Sub CreateComments()

   Dim cell As Range

   ‘ Производим поиск по всем ячейкам диапазона и добавляем примечания _

    ко всем ячейкам, содержащим слово «Выручка»

   For Each cell In Range(«B1:B100»)

      If cell.Value Like «*Выручка*» Then

         cell.ClearComments

         cell.AddComment «Неучтенная наличка»

      End If

   Next

End Sub

Перенос комментария в ячейку и обратно

Sub Комментарий_в_ячейку_в_диапазоне()

‘переносит комментарий в ячейку

Dim i As ****

Dim c As Range, cc As Range

Dim iCommment As Comments

Application.DisplayCommentIndicator = xlCommentIndicatorOnly

Application.ScreenUpdating = False

Application.Calculation = xlCalculationManual

Set cc = Selection

‘если выделили 1 ячейку, то выход

If cc.Rows.Count = 1 And cc.Columns.Count = 1 Then

MsgBox «Выделено слишком мало ячеек!», , «Ошибка»

End

End If

Set cc = Selection.SpecialCells(xlCellTypeVisible)

For Each c In cc

If Not c.Comment Is Nothing Then

c.Value = c.Comment.Text

‘c.ClearComments ‘если надо удалить комментарий

i = i + 1

End If

End If

Next

Application.Calculation = xlCalculationAutomatic

Application.ScreenUpdating = True

MsgBox «Перенесено » & i & » комментариев!»

Exit Sub

End Sub

Перенос значений из ячейки в комментарий_1

Sub Добавить_комментарий_в_диапазоне()

‘копирует значение ячейки в комментарий в видемом диапазоне

Dim c As Range, cc As Range

Dim i As ****

On Error GoTo ErrorHandler

Application.DisplayCommentIndicator = xlCommentIndicatorOnly

Set cc = Selection

‘если выделили 1 ячейку, то выход

If cc.Rows.Count = 1 And cc.Columns.Count = 1 Then

MsgBox «Выделено слишком мало ячеек!», , «Ошибка»

End

End If

Set cc = Selection.SpecialCells(xlCellTypeVisible)

For Each c In cc

If c.Value <> Empty Then

c.AddComment CStr(c.Value)

i = i + 1

End If

Next

MsgBox «Добавлено » & i & » комментарий!»

Exit Sub

End Sub

Перенос значений из ячейки в комментарий_2

Sub Comment_in_Cell()

Dim c As Range

Dim r As Range

If ActiveSheet.Comments.Count = 0 Then MsgBox «Без комментариев!»: Exit Sub

Set sh = ActiveSheet

Set shnew = Sheets.Add

sh.Select

Set r = Range(Cells(1, 1), Cells(Cells.Find(«*», [A1], xlComments, , xlByRows, _

xlPrevious).Row, Cells.Find(«*», [A1], xlComments, , xlColumns, _

xlPrevious).Column))

For Each c In r

If Not c.Comment Is Nothing Then

shnew.Range(c.Address) = c.Comment.Text

End If

Next

End Sub

ГЛАВА 5 . ПОЛЬЗОВАТЕЛЬСКИЕ ВКЛАДКИ НА ЛЕНТЕ

Дополнение панели инструментов

Sub AddCustomCommandBar()

   ‘ Добавление кнопки на панель инструментов

   With Application.CommandBars(3).Controls.Add(Type:=msoControlButton)

      .FaceId = 42            ‘ Значок Word

      .Caption = «Кнопка»

      .OnAction = «Макрос»

   End With

End Sub

Добавление кнопки на панель инструментов

Sub AddCustomButton()

   ‘ Добавление кнопки на панель инструментов

   With Application.Toolbars(1).ToolbarButtons.Add(button:=222)

      .Name = «Кнопка»

      .OnAction = «Макрос»

   End With

End Sub

Панель с одной кнопкой

Sub CreateCustomControlBar()

   ‘ Создание панели инструментов

   With Application.CommandBars.Add(Name:=»Панель», Temporary:=True)

      ‘ Создание и настройка кнопки

      With .Controls.Add(Type:=msoControlButton)

         .Style = msoButtonIconAndCaption

         .FaceId = 66

         .Caption = «Просто кнопка»

      End With

      ‘ Покажем панель

      .Visible = True

   End With

End Sub

Панель с двумя кнопками

Sub CreateCustomControlBar()

   ‘ Создание панели инструментов

   With Application.CommandBars.Add(Name:=»Панель», Temporary:=True, _

    Position:=msoBarLeft)

      ‘ Создание и настройка первой кнопки

      With .Controls.Add(Type:=msoControlButton)

         .Style = msoButtonWrapCaption

         .Caption = «Просто кнопка»

      End With

      ‘ Создание и настройка второй кнопки

      With .Controls.Add(Type:=msoControlButton)

         .Style = msoButtonIconAndWrapCaption

         .Caption = «Кнопка»

         .FaceId = 225

      End With

      ‘ Покажем панель

      .Visible = True

   End With

End Sub

Создание панели справа

Sub CreateCustomControlBar()

   ‘ Создание панели инструментов

   With Application.CommandBars.Add(Name:=»Правая панель», _

    Temporary:=True)

      ‘ Создание и настройка кнопки

      With .Controls.Add(Type:=msoControlButton)

         .Style = msoButtonWrapCaption

         .Caption = «Кнопка»

      End With

      ‘ Задание позиции — справа

      .Position = msoBarRight

      ‘ Покажем панель

      .Visible = True

   End With

End Sub

Вызов предварительного просмотра

Sub Test()

 With Application.Workbooks.Item(«Test.xls»)

 Sheets(«Test»).PrintPreview

 End With

End Sub

Создание пользовательского меню (вариант 1)

Sub AddCustomMenu()

   ‘ Добавление меню

   With Application.CommandBars(1).Controls.Add(Type:=msoControlPopup, _

    Temporary:=True)

      .Caption = «Архив»

      With .Controls

         ‘ Добавление и настройка первого пункта

         With .Add(Type:=msoControlButton)

            .FaceId = 280

            .Caption = «Просмотр»

            .OnAction = «Макрос1»

         End With

         ‘ Добавление вложенного меню

         With .Add(Type:=msoControlPopup)

            .Caption = «База данных»

            With .Controls

               ‘ Добавление и настройка первого пункта _

                вложенного меню

               With .Add(Type:=msoControlButton)

                  .FaceId = 1643

                  .Caption = «Поставщики»

                  .OnAction = «Макрос2»

               End With

               ‘ Добавление и настройка второго пункта _

                вложенного меню

               With .Add(Type:=msoControlButton)

                  .FaceId = 1000

                  .Caption = «Покупатели»

                  .OnAction = «Макрос3»

               End With

            End With

         End With

      End With

   End With

End Sub

Создание пользовательского меню (вариант 2)

Sub AddCustomMenu1()

   ‘ Добавление меню с названием «Архив» в часть меню, _

    относящуюся к рабочей книге

   With MenuBars(«Worksheet»).Menus.Add(Caption:=»Архив»)

      ‘ Добавление кнопки

      .MenuItems.Add Caption:=»Просмотр», OnAction:=»Макрос1″

      ‘ Добавление подменю

      With .MenuItems.AddMenu(Caption:=»База данных»)

         ‘ Добавление пунктов подменю

         .MenuItems.Add Caption:=»Поставщики», OnAction:=»Макрос2″

         .MenuItems.Add Caption:=»Покупатели», OnAction:=»Макрос3″

      End With

   End With

End Sub

Создание пользовательского меню (вариант 3)

Sub AddCustomMenu2()

   ‘ Добавление меню с названием «Архив» в часть меню, _

    относящуюся к рабочей книге

   With MenuBars(«Worksheet»).Menus.Add(Caption:=»Архив»)

      ‘ Добавление кнопки

      .MenuItems.Add Caption:=»Просмотр», OnAction:=»Макрос1″

      ‘ Добавление подменю

      With .MenuItems.AddMenu(Caption:=»База данных»)

         ‘ Добавление первого пункта подменю

         With .MenuItems.Add(Caption:=»Поставщики»)

            ‘ Настройка кнопки

            .OnAction = «Макрос2»

         End With

         ‘ Добавление второго пункта подменю

         With .MenuItems.Add(Caption:=»Покупатели»)

            ‘ Настройка кнопки

            .OnAction = «Макрос3»

         End With

      End With

   End With

End Sub

Создание пользовательского меню (вариант 4)

Sub Workbook_Open()

   ‘ Задание имени меню

   strMenuName = «MyCommandBarName»

   ‘ Создание меню

   CreateCustomMenu

End Sub

Создание пользовательского меню (вариант 5)

Sub Workbook_BeforeClose(Cancel As Boolean)

   ‘ Удаление меню перед закрытием книги

   DeleteCustomMenu

End Sub

Public strMenuName As String  ‘ Имя строки меню

Private cbrcBar As CommandBarControl

Sub CreateCustomMenu()

   Dim cbrMenu As CommandBar

   Dim cbrcMenu As CommandBarControl     ‘ Выпадающее меню «Меню»

   Dim cbrcSubMenu As CommandBarControl  ‘ Выпадающее меню «Дополнительно»

   ‘ Если уже есть пользовательское меню, то оно удаляется

   DeleteCustomMenu

   ‘ Создание меню вместо стандартного

   Set cbrMenu = Application.CommandBars.Add(strMenuName, msoBarTop, _

    True, True)

   ‘ Создание выпадающего меню с названием «Меню»

   Set cbrcMenu = cbrMenu.Controls.Add(msoControlPopup, , , , True)

   With cbrcMenu

      .Caption = «&Меню»

   End With

   ‘ Создание пункта меню

   With cbrcMenu.Controls.Add(Type:=msoControlButton, _

    Temporary:=True)

      .Caption = «&Меню1»

      .OnAction = «CallMenu1»

   End With

   ‘ Создание пункта меню

   With cbrcMenu.Controls.Add(Type:=msoControlButton, _

    Temporary:=True)

      .Caption = «Меню2»

      .OnAction = «CallMenu2»

   End With

   ‘ Создание подменю первого уровня

   Set cbrcSubMenu = cbrcMenu.Controls.Add(Type:=msoControlPopup, _

    Temporary:=True)

   With cbrcSubMenu

      .Caption = «Подменю1»

      .BeginGroup = True

   End With

   ‘ Создание пункта меню

   With cbrcMenu.Controls.Add(Type:=msoControlButton, _

    Temporary:=True)

      .Caption = «Вкл/Выкл»

      .OnAction = «MenuOnOff»

      .Style = msoButtonIconAndCaption

      .FaceId = 463

   End With

   ‘ Создание пункта меню в подменю первого уровня

   With cbrcSubMenu.Controls.Add(Type:=msoControlButton, _

    Temporary:=True)

      .Caption = «Подменю1»

      .OnAction = «CallSubMenu1»

      .Style = msoButtonIconAndCaption

      .FaceId = 2950

      .State = msoButtonDown

   End With

   ‘ Cоздание пункта меню в подменю первого уровня (его состояние _

    изменяется посредством пункта «Вкл/Выкл»), для чего сохраним ссылку _

    на созданный пункт меню

   Set cbrcBar = cbrcSubMenu.Controls.Add(Type:=msoControlButton, _

    Temporary:=True)

   With cbrcBar

      .Caption = «Подменю2»

      .OnAction = «CallSubMenu2»

      ‘ Сначала меню деактивировано

      .Enabled = False

   End With

   ‘ Создание подменю второго уровня

   Set cbrcSubMenu = cbrcSubMenu.Controls.Add(Type:=msoControlPopup, _

    Temporary:=True)

   With cbrcSubMenu

      .Caption = «ПодчПодменю1»

      .BeginGroup = True

   End With

   ‘ Cоздание пункта меню в подменю второго уровня

   With cbrcSubMenu.Controls.Add(Type:=msoControlButton, _

    Temporary:=True)

      .Caption = «ПослМеню1»

      .OnAction = «CallLastMenu1»

      .Style = msoButtonIconAndCaption

      .FaceId = 71

      .State = msoButtonDown

   End With

   ‘ Cоздание пункта меню в подменю второго уровня

   With cbrcSubMenu.Controls.Add(Type:=msoControlButton, _

    Temporary:=True)

      .Caption = «ПослМеню2»

      .OnAction = «CallLastMenu2»

      .Style = msoButtonIconAndCaption

      .FaceId = 72

      .Enabled = True

   End With

   ‘ Отображение меню

   cbrMenu.Visible = True

   Set cbrcSubMenu = Nothing

   Set cbrcMenu = Nothing

   Set cbrMenu = Nothing

End Sub

Sub DeleteCustomMenu()

   ‘ Удаление строки меню

   On Error Resume Next

   Application.CommandBars(strMenuName).Delete

   On Error GoTo 0

End Sub

Sub CallMenu1()

   ‘ Обработка вызова Меню1

   MsgBox «Приветствует меню 1!», vbInformation, ThisWorkbook.Name

End Sub

Sub CallMenu2()

   ‘ Обработка вызова Меню2

   MsgBox «Приветствует меню 2!», vbInformation, ThisWorkbook.Name

End Sub

Sub CallSubMenu1()

   ‘ Обработка вызова Подменю1

   MsgBox «Приветствует подменю 1!», vbInformation, ThisWorkbook.Name

End Sub

Sub CallSubMenu2()

   ‘ Обработка вызова Подменю2

   MsgBox «Приветствует подменю 2!», vbInformation, ThisWorkbook.Name

End Sub

Sub CallLastMenu1()

   ‘ Обработка вызова Последнего меню1

   MsgBox «Приветствует последнее меню 1!», vbInformation, ThisWorkbook.Name

End Sub

Sub CallLastMenu2()

   ‘ Обработка вызова Последнего меню2

   MsgBox «Приветствует последнее меню 2!», vbInformation, ThisWorkbook.Name

End Sub

Sub MenuOnOff()

   ‘ Активация или деактивация пункта «Меню-Подменю1-Подменю2»

   cbrcBar.Enabled = Not cbrcBar.Enabled

End Sub

Создание пользовательского меню (вариант 6)

Sub CreateMenu()

   Dim cbrMenu As CommandBar

   Dim cbrcNewMenu As CommandBarControl

   ‘ Удаление меню, если оно уже есть

   Call DeleteMenu

   ‘ Добавление строки пользовательского меню

   Set cbrMenu = CommandBars.Add(MenuBar:=True)

   With cbrMenu

      .Name = «Моя строка меню»

      .Visible = True

   End With

   ‘ Копирование стандартного меню «Файл»

   CommandBars(«Worksheet Menu Bar»).FindControl(ID:=30002).Copy _

    CommandBars(«Моя строка меню»)

   ‘ Добавление нового меню — «Дополнительно»

   Set cbrcNewMenu = cbrMenu.Controls.Add(msoControlPopup)

   cbrcNewMenu.Caption = «&Дополнительно»

   ‘ Добавление команды в новое меню

   With cbrcNewMenu.Controls.Add(msoControlButton)

      .Caption = «&Восстановить обычную строку меню»

      .OnAction = «DeleteMenu»

   End With

   ‘ Добавление команды в новое меню

   With cbrcNewMenu.Controls.Add(Type:=msoControlButton)

      .Caption = «&Справка»

   End With

End Sub

Sub DeleteMenu()

   ‘ Пытаемся удалить меню (успешно, если оно ранее создано)

   On Error Resume Next

   CommandBars(«Моя строка меню»).Delete

   On Error GoTo 0

End Sub

Список панелей инструментов и контекстных меню

Sub ListOfMenues()

   Dim intRow As Integer    ‘ Хранит текущую строку

   Dim cbrBar As CommandBar

   ‘ Очистка всех ячеек текущего листа

   Cells.Clear

   intRow = 1  ‘ Начинаем запись с первой строки

   ‘ Просматриваем список панелей инструментов и меню _

    и записываем информацию о каждом элементе в таблицу

   For Each cbrBar In CommandBars

      ‘ Порядковый номер

      Cells(intRow, 1) = cbrBar.Index

      ‘ Название

      Cells(intRow, 2) = cbrBar.Name

      ‘ Тип

      Select Case cbrBar.Type

         Case msoBarTypeNormal

            Cells(intRow, 3) = «Панель инструментов»

         Case msoBarTypeMenuBar

            Cells(intRow, 3) = «Строка меню»

         Case msoBarTypePopup

            Cells(intRow, 3) = «Контекстное меню»

      End Select

      ‘ Встроенный элемент или созданный пользователем

      Cells(intRow, 4) = cbrBar.BuiltIn

      ‘ Переходим на следующую строку

      intRow = intRow + 1

   Next

End Sub

Создание списка пунктов главного меню Excel

Листинг 3.90. Список содержимого главного меню

Sub ListOfMenues()

   Dim intRow As Integer    ‘ Текущая строка, куда идет запись

   Dim cbrcMenu As CommandBarControl        ‘ Главное меню

   Dim cbrcSubMenu As CommandBarControl     ‘ Подменю

   Dim cbrcSubSubMenu As CommandBarControl  ‘ Подменю в подменю

   ‘ Очищаем ячейки текущего листа

   Cells.Clear

   ‘ Начинаем запись с первой строки

   intRow = 1

   ‘ Просматриваем все элементы строки меню

   On Error Resume Next    ‘ Игнорируем ошибки

   For Each cbrcMenu In CommandBars(1).Controls

      ‘ Просматриваем элементы выпадающего меню cbrcMenu

      For Each cbrcSubMenu In cbrcMenu.Controls

         ‘ Просматриваем элементы подменю cbrcSubMenu

         For Each cbrcSubSubMenu In cbrcSubMenu.Controls

            ‘ Выводим название главного меню

            Cells(intRow, 1) = cbrcMenu.Caption

            ‘ Выводим название подменю

            Cells(intRow, 2) = cbrcSubMenu.Caption

            ‘ Выводим название вложенного подменю

            Cells(intRow, 3) = cbrcSubSubMenu.Caption

            ‘ Переходим на следующую строку

            intRow = intRow + 1

         Next cbrcSubSubMenu

      Next cbrcSubMenu

   Next cbrcMenu

End Sub

Создание списка пунктов контекстных меню

Листинг 3.91. Список содержимого контекстных меню

Sub ListOfContextMenues()

   Dim intRow As ****

   Dim intControl As Integer

   Dim cbrBar As CommandBar

   ‘ Очистка ячеек активного листа

   Cells.Clear

   ‘ Начинаем вывод с первой строки

   intRow = 1

   ‘ Просмотр списка контекстных меню и вывод информации о них

   For Each cbrBar In CommandBars

      If cbrBar.Type = msoBarTypePopup Then

         ‘ Порядковый номер

         Cells(intRow, 1) = cbrBar.Index

         ‘ Название

         Cells(intRow, 2) = cbrBar.Name

         ‘ Просмотр всех элементов контекстного меню и вывод _

          названий этих элементов в ячейки текущей строки

         For intControl = 1 To cbrBar.Controls.Count

            Cells(intRow, intControl + 2) = _

             cbrBar.Controls(intControl).Caption

         Next intControl

         ‘ Переход на следующую строку таблицы

         intRow = intRow + 1

      End If

   Next cbrBar

   ‘ Делаем ширину ячеек таблицы оптимальной для просмотра

   Cells.EntireColumn.AutoFit

End Sub

Отображение панели инструментов при определенном условии

Листинг 3.92. Код в модуле рабочего листа

Sub Worksheet_Selectiоnchange(ByVal Target As Excel.Range)

   ‘ Проверка условия отображения

   If Union(Target, Range(«A1:D5»)).Address = _

    Range(«A1:D5»).Address Then

      ‘ Условие выполнено — можно показывать панель

      CommandBars(«AutoSense»).Visible = True

   Else

      ‘ Условие не выполнено — панель нужно скрыть

      CommandBars(«AutoSense»).Visible = False

   End If

End Sub

Листинг 3.93. Код в стандартном модуле

Sub CreatePanel()

   Dim cbrBar As CommandBar

   Dim button As CommandBarButton

   Dim i As Integer

   ‘ Удаление одноименной панели (при ее наличии)

   On Error Resume Next

   CommandBars(«AutoSense»).Delete

   On Error GoTo 0

   ‘ Создание панели инструментов

   Set cbrBar = CommandBars.Add

   ‘ Создание кнопок и их настройка

   For i = 1 To 4

      Set button = cbrBar.Controls.Add(msoControlButton)

      With button

         .OnAction = «Buttоnclick» & i

         .FaceId = i + 37

      End With

   Next i

   cbrBar.Name = «AutoSense»

End Sub

Sub Buttоnclick3()

   ‘ Перемещение вниз

   On Error Resume Next

   ActiveCell.Offset(1, 0).Activate

End Sub

Sub Buttоnclick1()

   ‘ Перемещение вверх

   On Error Resume Next

   ActiveCell.Offset(-1, 0).Activate

End Sub

Sub Buttоnclick2()

   ‘ Перемещение вправо

   On Error Resume Next

   ActiveCell.Offset(0, 1).Activate

End Sub

Sub Buttоnclick4()

   ‘ Перемещение влево

   On Error Resume Next

   ActiveCell.Offset(0, -1).Activate

End Sub

Скрытие и отображение панелей инструментов

Листинг 3.94. Управление отображением панелей инструментов

Sub HidePanels()

   Dim cbrBar As CommandBar

   Dim intRow As Integer       ‘ Номер текущей строки листа

   ‘ Отключение обновления экрана

   Application.ScreenUpdating = False

   ‘ Подготовка к сохранению

   Cells.Clear

   ‘ Скрытие видимых панелей и сохранение их названий

   intRow = 1       ‘ Запись имен с первой строки

   For Each cbrBar In CommandBars

      If cbrBar.Type = msoBarTypeNormal Then

         If cbrBar.Visible Then

            cbrBar.Visible = False

            Cells(intRow, 1) = cbrBar.Name

            intRow = intRow + 1

         End If

      End If

   Next

   ‘ Включение обновления экрана

   Application.ScreenUpdating = True

End Sub

Sub ShowPanels()

   Dim cell As Range       ‘ Текущая ячейка листа

   ‘ Отключение обновления экрана

   Application.ScreenUpdating = False

   ‘ Отображение скрытых панелей

   On Error Resume Next

   For Each cell In Range(«A:A»).SpecialCells( _

    xlCellTypeConstants)

      CommandBars(cell.Value).Visible = True

   Next cell

   ‘ Включение обновления экрана

   Application.ScreenUpdating = True

End Sub

Создать подсказку к моим кнопкам

‘ Cоздаем тулбар

Рublic Sub InitToolBar()

Dim cmdbarSM As CommandBar

Dim ctlNewBtn As CommandBarButton

  Set cmdbarSM = CommandBars.Add(Name:=»MyToolBar»,

                                 Position:=msoBarFloating, _

                                 temporary:=True)

  With cmdbarSM

    ‘ 1) Добавляем кнопку

    Set ctlNewBtn = .Controls.Add(Type:=msoControlButton)

    With ctlNewBtn

      . FaceId = 26

      .OnAction = «OnButton1_Click»

     .TooltipText = «My tooltip message!»

    End With

    ‘ 2) Добавляем ещё кнопку

    Set ctlNewBtn = .Controls.Add(Type:=msoControlButton)

    With ctlNewBtn

      .FaceId = 44

      .OnAction = «OnButton2_Click»

     .TooltipText = «Another tooltip message!»

    End With

    .Visible = True

  End With

End Sub

Создание меню на основе данных рабочего листа

Листинг 3.95. Код в модуле ЭтаКнига

Sub Workbook_Open()

   ‘ Создание меню

   Call CreateCustomMenu

End Sub

Sub Workbook_BeforeClose(Cancel As Boolean)

   ‘ Удаление меню перед закрытием книги

   Call DeleteCustomMenu

End Sub

Листинг 3.96. Код в стандартном модуле

Sub CreateMenu()

   Dim sheet As Worksheet          ‘ Лист с описанием меню

   Dim intRow As Integer           ‘ Считываемая строка

   Dim cbrpBar As CommandBarPopup  ‘ Выпадающее меню

   Dim objNewItem As Object        ‘ Элемент меню cbrpBar

   Dim objNewSubItem As Object     ‘ Элемент подменю objNewItem

   Dim intMenuLevel As Integer     ‘ Уровень вложенности пункта меню

   Dim strCaption As String        ‘ Название пункта меню

   Dim strAction As String         ‘ Макрос пункта меню

   Dim fIsDevider As Boolean       ‘ Нужен разделитель

   Dim intNextLevel As Integer     ‘ Уровень вложенности следующего _

                                    пункта меню

   Dim strFaceID As String         ‘ Номер значка пункта меню

   ‘ Расположение данных для меню

   Set sheet = ThisWorkbook.Sheets(«ЛистМеню»)

   ‘ Удаление одноименного меню (при его наличии)

   Call DeleteMenu

   ‘ Данные считываем со второй строки

   intRow = 2

   ‘ Добавление меню

   Do Until IsEmpty(sheet.Cells(intRow, 1))

      ‘ Считываем информацию о пункте меню

      With sheet

         ‘ Уровень вложенности

         intMenuLevel = .Cells(intRow, 1)

         ‘ Название

         strCaption = .Cells(intRow, 2)

         ‘ Название макроса для меню

         strAction = .Cells(intRow, 3)

         ‘ Нужен ли разделитель перед меню?

         fIsDevider = .Cells(intRow, 4)

         ‘ Номер стандартного значка (если значок нужен)

         strFaceID = .Cells(intRow, 5)

         ‘ Уровень вложенности следующего меню

         intNextLevel = .Cells(intRow + 1, 1)

      End With

      ‘ Создаем меню в зависимости от уровня его вложенности

      Select Case intMenuLevel

         Case 1

            ‘ Создаем меню

            Set cbrpBar = Application.CommandBars(1). _

             Controls.Add(Type:=msoControlPopup, _

             Before:=strAction, _

             Temporary:=True)

            cbrpBar.Caption = strCaption

         Case 2

            ‘ Создаем элемент меню

            If intNextLevel = 3 Then

               ‘ Следующий элемент вложен в создаваемый, то есть _

                создаем раскрывающееся подменю

               Set objNewItem = _

                cbrpBar.Controls.Add(Type:=msoControlPopup)

            Else

               ‘ Создаем команду меню

               Set objNewItem = _

                cbrpBar.Controls.Add(Type:=msoControlButton)

               objNewItem.OnAction = strAction

            End If

            ‘ Установка названия нового пункта меню

            objNewItem.Caption = strCaption

            ‘ Установка значка нового пункта меню (если нужно)

            If strFaceID <> «» Then

               objNewItem.FaceId = strFaceID

            End If

            ‘ Если нужно, то добавим разделитель

            If fIsDevider Then

               objNewItem.BeginGroup = True

            End If

         Case 3

            ‘ Создание элемента подменю

            Set objNewSubItem = _

             objNewItem.Controls.Add(Type:=msoControlButton)

            ‘ Установка его названия

            objNewSubItem.Caption = strCaption

            ‘ Назначение макроса (или команды)

            objNewSubItem.OnAction = strAction

            ‘ Установка значка (если нужно)

            If strFaceID <> «» Then

              objNewSubItem.FaceId = strFaceID

            End If

            ‘ Если нужно, то добавим разделитель

            If fIsDevider Then

               objNewSubItem.BeginGroup = True

            End If

      End Select

      ‘ Переход на следующую строку таблицы

      intRow = intRow + 1

   Loop

End Sub

Sub DeleteMenu()

   Dim sheet As Worksheet    ‘ Лист с описанием меню

   Dim intRow As Integer     ‘ Считываемая строка

   Dim strCaption As String  ‘ Название меню

   Set sheet = ThisWorkbook.Sheets(«ЛистМеню»)

   ‘ Данные начинаются со второй строки

   intRow = 2

   ‘ Считываем данные, пока есть значения в столбце «A», _

    и удаляем созданные ранее меню (с уровнем вложенности 1)

   On Error Resume Next

   Do Until IsEmpty(sheet.Cells(intRow, 1))

      If sheet.Cells(intRow, 1) = 1 Then

         strCaption = sheet.Cells(intRow, 2)

         Application.CommandBars(1).Controls(strCaption).Delete

      End If

      intRow = intRow + 1

   Loop

   On Error GoTo 0

End Sub

Создание контекстного меню

Листинг 3.97. Код в модуле рабочего листа

Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, _

 Cancel As Boolean)

   ‘ Проверка, попадает ли выделенная ячейка в диапазон

   If Union(Target.Range(«A1»), Range(«A2:D5»)).Address = _

    Range(«A2:D5»).Address Then

      ‘ Показываем свое контекстное меню

      CommandBars(«MyContextMenu»).ShowPopup

      Cancel = True

   End If

End Sub

Листинг 3.98. Код в модуле ЭтаКнига

Sub Workbook_Open()

   ‘ Создание контекстного меню при открытии книги

   Call CreateCustomContextMenu

End Sub

Sub Workbook_BeforeClose(Cancel As Boolean)

   ‘ Удаление меню при закрытии книги

   Call DeleteCustomContextMenu

End Sub

Код в стандартном модуле

Sub CreateCustomContextMenu()

   ‘ Удаление одноименного меню

   Call DeleteCustomContextMenu

   ‘ Создание меню

   With CommandBars.Add(«MyContextMenu», msoBarPopup, , True).Controls

      ‘ Создание и настройка кнопок меню

      ‘ Кнопка «Числовой формат»

      With .Add(msoControlButton)

         .Caption = «&Числовой формат…»

         .OnAction = «ShowFormatNumber»

         .FaceId = 1554

      End With

      ‘ Кнопка «Выравнивание»

      With .Add(msoControlButton)

         .Caption = «&Выравнивание…»

         .OnAction = «ShowFormatAlignment»

         .FaceId = 217

      End With

      ‘ Кнопка «Шрифт»

      With .Add(msoControlButton)

         .Caption = «&Шрифт…»

         .OnAction = «ShowFormatFont»

         .FaceId = 291

      End With

      ‘ Кнопка «Границы»

      With .Add(msoControlButton)

         .Caption = «&Границы…»

         .OnAction = «ShowFormatBorder»

         .FaceId = 149

         .BeginGroup = True

      End With

      ‘ Кнопка «Узор»

      With .Add(msoControlButton)

         .Caption = «&Узор…»

         .OnAction = «ShowFormatPatterns»

         .FaceId = 1550

      End With

      ‘ Кнопка «Защита»

      With .Add(msoControlButton)

         .Caption = «&Защита…»

         .OnAction = «ShowFormatProtection»

         .FaceId = 2654

      End With

   End With

End Sub

Блокировка контекстного меню

Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

   Static intCount As Integer     ‘ Счетчик нажатий кнопки мыши

   Dim x As Integer, y As Integer

   ‘ Блокировать обработку щелчка правой кнопкой мыши

   Cancel = True

   ‘ Отображение текстового поля с количеством щелчков правой _

    кнопкой мыши

   x = Target.Left

   y = Target.Top

   intCount = intCount + 1

   ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _

    x, y, 35, 20).TextFrame.Characters.Text = intCount

End Sub

Добавление команды в меню Сервис

Sub AddMenuItem()

   Dim cbrpMenu As CommandBarPopup

   ‘ Удаление аналогичной команды (при ее наличии)

   Call DeleteMenuItem

   ‘ Получение доступа к меню «Сервис»

   Set cbrpMenu = CommandBars(1).FindControl(ID:=30007)

   If cbrpMenu Is Nothing Then

      ‘ Не удалось получить доступ

      MsgBox «Невозможно добавить элемент.»

      Exit Sub

   Else

      ‘ Добавление новой команды в меню

      With cbrpMenu.Controls.Add(Type:=msoControlButton)

         ‘ Название команды

         .Caption = «Очистить в&се, кроме формул»

         ‘ Значок

         .FaceId = 348

         ‘ Сочетание клавиш (только надпись на кнопке)

         .ShortcutText = «Ctrl+Shift+C»

         ‘ Сопоставленный макрос

         .OnAction = «ExecuteCommand»

         ‘ Добавление разделителя перед командой

         .BeginGroup = True

      End With

   End If

   ‘ Сопоставление с макросом сочетания клавиш Ctrl+Shift+C

   Application.MacroOptions _

    Macro:=»ExecuteCommand», _

    HasShortcutKey:=True, _

    ShortcutKey:=»C»

End Sub

Sub ExecuteCommand()

   ‘ Очистка содержимого всех ячеек (кроме формул)

   On Error Resume Next

   Cells.SpecialCells(xlCellTypeConstants, 23).ClearContents

End Sub

Sub DeleteMenuItem()

   ‘ Удаление команды из меню

   On Error Resume Next

   CommandBars(1).FindControl(ID:=30007). _

    Controls(«Очистить в&се, кроме формул»).Delete

End Sub

Добавление команды в меню Вид

Листинг 3.110. Код в стандартном модуле

Dim AppObject As New Class1

Sub AddCommand()

   Dim cbrpBar As CommandBarPopup

   ‘ Удаление аналогичной команды (при ее наличии)

   Call DeleteCommand

   ‘ Получение доступа к меню «Вид»

   Set cbrpBar = CommandBars(1).FindControl(ID:=30004)

   If cbrpBar Is Nothing Then

      ‘ Не удалось получить доступ к меню

      MsgBox «Невозможно добавить элемент меню.»

      Exit Sub

   Else

      ‘ Добавление команды

      With cbrpBar.Controls.Add(Type:=msoControlButton)

         .Caption = «&Линии сетки»

         .OnAction = «GhangeGridlinesState»

      End With

   End If

   ‘ Даем объекту AppObject обрабатывать события

   Set AppObject.AppEvents = Application

End Sub

Sub DeleteCommand()

   ‘ Удаление каманды из меню (если она там есть)

   On Error Resume Next

   CommandBars(1).FindControl(ID:=30004). _

    Controls(«&Линии сетки»).Delete

End Sub

Sub GhangeGridlinesState()

   ‘ Изменение состояния отображения линий сетки _

    на противоположное (если нет — покажем, если есть — скроем)

   If TypeName(ActiveSheet) = «Worksheet» Then

      ActiveWindow.DisplayGridlines = _

       Not ActiveWindow.DisplayGridlines

      ‘ Установка или снятие флажка в меню

      Call CheckGridlines

   End If

End Sub

Sub CheckGridlines()

   Dim button As CommandBarButton

   On Error Resume Next

   ‘ Поиск команды «Линии сетки» в меню «Вид»

   Set button = CommandBars(1).FindControl(ID:=30004). _

    Controls(«&Линии сетки»)

   ‘ Изменение состояния флажка на противоположное

   If ActiveWindow.DisplayGridlines Then

      ‘ Установка

      button.State = msoButtonDown

   Else

      ‘ Снятие

      button.State = msoButtonUp

   End If

End Sub

Создание панели со списком

Sub DeleteCustomContextMenu()

   ‘ Удаление меню

   On Error Resume Next

   CommandBars(«MyContextMenu»).Delete

End Sub

Sub ShowFormatNumber()

   ‘ Число

   Application.Dialogs(xlDialogFormatNumber).Show

End Sub

Sub ShowFormatAlignment()

   ‘ Выравнивание

   Application.Dialogs(xlDialogAlignment).Show

End Sub

Sub ShowFormatFont()

   ‘ Шрифт

   Application.Dialogs(xlDialogFormatFont).Show

End Sub

Sub ShowFormatBorder()

   ‘ Граница

   Application.Dialogs(xlDialogBorder).Show

End Sub

Sub ShowFormatPatterns()

   ‘ Вид (Узор)

   Application.Dialogs(xlDialogPatterns).Show

End Sub

Sub ShowFormatProtection()

   ‘ Защита

   Application.Dialogs(xlDialogCellProtection).Show

End Sub

Sub CreatePanel()

   Dim i As Integer

   On Error Resume Next

   ‘ Удаление одноименной панели (если есть)

   CommandBars(«Список месяцев»).Delete

   On Error GoTo 0

   ‘ Создание панели «Список месяцев»

   With CommandBars.Add

      .Name = «Список месяцев»

      ‘ Создание списка месяцев

      With .Controls.Add(Type:=msoControlDropdown)

         ‘ Настройка (имя, макрос, стиль)

         .Caption = «DateDD»

         .OnAction = «SetMonth»

         .Style = msoButtonAutomatic

         ‘ Добавление в список названий месяцев

         For i = 1 To 12

            .AddItem Format(DateSerial(1, i, 1), «mmmm»)

         Next i

         ‘ Выделение первого месяца

         .ListIndex = 1

      End With

      ‘ Показываем созданную панель

      .Visible = True

   End With

End Sub

Sub SetMonth()

   ‘ Перенос названия выделенного месяца в ячейку

   On Error Resume Next

   With CommandBars(«Список месяцев»).Controls(«DateDD»)

      ActiveCell.Value = .List(.ListIndex)

   End With

End Sub

Мультфильм с помощником в главной роли

Листинг 4.1. «Танцующий» помощник

Sub RunAssistantDance()

   Static intAction As Integer

   ‘ Заставляем помощника выполнять действие (всего 16)

   DoAssistantAction intAction

   intAction = intAction + 1

   If intAction < 16 Then

      ‘ Следующее действие через 3 секунды

      Application.OnTime Time + TimeValue(«00:00:3»), _

       «RunAssistantDance»

   End If

End Sub

Sub DoAssistantAction(intAction As Integer)

   Dim astAssistant As Assistant

   Set astAssistant = Application.Assistant

   ‘ Помещаем помощника в центр активного окна

   astAssistant.Top = Application.ActiveWindow.Top _

    + Application.ActiveWindow.Height / 2

   astAssistant.Left = Application.ActiveWindow.Left _

    + Application.ActiveWindow.Width / 2

   ‘ Показываем помощника

   astAssistant.On = True

   astAssistant.Visible = True

   ‘ Показываем заданное параметром intAction действие

   Select Case intAction

      Case 0

         astAssistant.Animation = msoAnimationAppear

      Case 1

         astAssistant.Animation = msoAnimationCheckingSomething

      Case 2

         astAssistant.Animation = msoAnimationBeginSpeaking

      Case 3

         astAssistant.Animation = msoAnimationCharacterSuccessMajor

      Case 4

         astAssistant.Animation = msoAnimationEmptyTrash

      Case 5

         astAssistant.Animation = msoAnimationGestureDown

      Case 5

         astAssistant.Animation = msoAnimationGestureLeft

      Case 6

         astAssistant.Animation = msoAnimationGestureRight

      Case 7

         astAssistant.Animation = msoAnimationGestureUp

      Case 8

         astAssistant.Animation = msoAnimationGetArtsy

      Case 9

         astAssistant.Animation = msoAnimationGetAttentionMajor

      Case 10

         astAssistant.Animation = msoAnimationGetAttentionMinor

      Case 11

         astAssistant.Animation = msoAnimationGetTechy

      Case 12

         astAssistant.Animation = msoAnimationGetWizardy

      Case 13

         astAssistant.Animation = msoAnimationGoodbye

      Case 14

         astAssistant.Animation = msoAnimationGreeting

      Case 15

         astAssistant.Animation = msoAnimationDisappear

   End Select

End Sub

Дополнение помощника текстом, заголовком, кнопкой и значком

Листинг 4.2. Настройка помощника

Sub AssistantMessage()

   Dim strTitle As String    ‘ Заголовок сообщения

   Dim strMessage As String  ‘ Текст сообщения

   ‘ Содержимое заголовка и текста в окне помощника

   strTitle = «Спрашивайте — ответим»

   strMessage = «{cf 249}{ul 1} Руки мыли{ul 0}?» _

    & vbCr & «{cf 6} Не забыть обновить антивирус!»

   ‘ Настраиваем помощника

   With Application.Assistant

      ‘ Включаем и показываем помощника

      .On = True

      .Visible = True

      ‘ Создаем окно сообщения

      With .NewBalloon

         .BalloonType = msoBalloonTypeButtons

         ‘ Кнопка «ОК» в окне помощника

         .button = msoButtonSetOK

         ‘ Значок в окне помощника

         .Icon = msoIconAlert

         ‘ Заголовок в окне помощника

         .Heading = strTitle

         ‘ Текст в окне помощника

         .Text = strMessage

         ‘ Отображение окна

         .Show

      End With

   End With

End Sub

Новые параметры помощника

Листинг 4.3. Новые параметры помощника

Sub AssistantCheckboxes()

   Dim i As Integer

   Dim strMessage As String

   With Assistant

      ‘ Включение и отображение помощника

      .On = True

      .Visible = True

      ‘ Создание окна сообщения

      With .NewBalloon

         ‘ Настройка окна…

         ‘ Тип окна

         .BalloonType = msoBalloonTypeButtons

         ‘ Заголовок

         .Heading = «Выберите страну»

         ‘ Добавление флажков

         .CheckBoxes(1).Text = «Россия»

         .CheckBoxes(2).Text = «США»

         .CheckBoxes(3).Text = «Южная Африка»

         .button = msoButtonSetOkCancel

         ‘ Отображение окна

         If .Show = msoBalloonButtonOK Then

            ‘ Вывод информационного окна в зависимости _

             от установленных флажков

            For i = 1 To 3

               If .CheckBoxes(i).Checked Then

                  strMessage = strMessage & _

                   .CheckBoxes(i).Text & vbCr

               End If

            Next

            ‘ Отображение окна сообщения (имеется в виду _

             стандартное окно)

            If Len(strMessage) = 0 Then

               MsgBox «No choice.»

            Else

               MsgBox strMessage

            End If

         End If

      End With

   End With

End Sub

Использование помощника для выбора цвета заливки

Листинг 4.4. Выбор цвета заливки рабочего листа

Sub AssistantChooseColor()

   Dim intChoise As Integer

   With Assistant

      ‘ Включение и отображение помощника

      .On = True

      .Visible = True

      With .NewBalloon

         ‘ Настройка окна…

         ‘ Тип

         .BalloonType = msoBalloonTypeButtons

         ‘ Заголовок

         .Heading = «Какой нужен цвет?»

         ‘ Первый цвет

         .Labels(1).Text = «Красный»

         ‘ Второй цвет

         .Labels(2).Text = «Желтый»

         ‘ Третий цвет

         .Labels(3).Text = «Зеленый»

         ‘ Тип кнопок

         .button = msoButtonSetNone

         ‘ Оображение окна

         intChoise = .Show

         ‘ Информационное сообщение о выбранном цвете

         MsgBox «Выбран: » & .Labels(intChoise).Text

      End With

   End With

   ‘ Настройка цветов ячеек (присвоение выбранного цвета)

   Select Case intChoise

      Case 1

         ‘ Красный цвет

         ActiveSheet.Cells.Interior.Color = RGB(255, 0, 0)

      Case 2

         ‘ Желтый цвет

         ActiveSheet.Cells.Interior.Color = RGB(255, 255, 0)

      Case 3

         ‘ Зеленый цвет

         ActiveSheet.Cells.Interior.Color = RGB(0, 255, 0)

   End Select

End Sub

ГЛАВА 6. ДИАЛОГОВЫЕ ОКНА

Функция INPUTBOX (через ввод значения)

Public Sub ИнпутБокс()

Dim текст As Variant

MsgBox «Если в InputBox нажать Отмена, в ячейке будут удалены все данные»

текст = InputBox(«Введите текст», «Окно ввода текста», «222»)

MsgBox текст

If текст <> «» Then

Range(«H7») = текст

MsgBox «Как сделать так, чтобы при выборе пользователем в InputBox — Отмена он закрывался и прекращалось выполнение процедуры?»

Else

Exit Sub

End If

End Sub

Вызов предварительного просмотра

Sub Test()

 With Application.Workbooks.Item(«Test.xls»)

 Sheets(«Test»).PrintPreview

 End With

End Sub

Настройка ввода данных в диалоговом окне

Sub DialogInputData()

   Dim intMin As Integer, intMax As Integer ‘ Диапазон значений

   Dim strInput As String                   ‘ Введенная пользователем строка

   Dim strMessage As String

   Dim intValue As Integer

   intMin = 1    ‘ Минимальное значение

   intMax = 50   ‘ Максимальное значение

   strMessage = «Введите значение от » & intMin & » до » & intMax

   ‘ Ввод значения (цикл завершается, когда пользователь вводит _

    значение из заданного диапазона или отменяет ввод)

   Do

      strInput = InputBox(strMessage)

      If strInput = «» Then Exit Sub   ‘ Отмена ввода

      ‘ Проверка, содержит ли введенная пользователем строка число

      If IsNumeric(strInput) Then

         intValue = CInt(strInput)

         ‘ Проверка, удовлетворяет ли значение диапазону

         If intValue >= intMin And intValue <= intMax Then

            ‘ Все условия выполнены

            Exit Do

         End If

      End If

      ‘ Формирование сообщения с текстом ошибки

      strMessage = «Вы ввели некорректное значение.» & vbNewLine & _

       «Введите число от » & intMin & » до » & intMax

   Loop

   ‘ Внесение данных в ячейку

   ActiveSheet.Range(«A1»).Value = strInput

End Sub

Открытие диалогового окна (“Открыть файл”)_1

Sub Test()

  Application.Dialogs(xlDialogOpen).Show «*.dbf»

End Sub

Открытие диалогового окна (“Открыть файл”)_2

fileToOpen = Application.GetOpenFilename(«Text Files (*.txt), *.txt»)

If fileToOpen <> False Then

  MsgBox «Open » & fileToOpen

End If

Открытие диалогового окна (“Печать”)

Application.Dialogs(xlDialogPrint).Show

Другие диалоговые окна

xlDialogClear — очистка ячейки или диапазона

xlDialogDisplay — параметры отображения ячеек

xlDialogFileDelete — удаление файла

xlDialogSaveWorkbook — сохранить книгу

xlDialogSearch — поиск в документе

xlDialogWorkbookName — переименование листа

Вызов броузера из Экселя

Надо создать кнопку которой добавить код:

Sub Button1_Click()

            Call ShellExecute(GetDesktopWindow, «Open», «www.armentel.com/avb», «», «c:», SW_SHOWNORMAL)

End Sub

И функция:

            Private Declare Function ShellExecute& Lib «shell32.dll» Alias «ShellExecuteA» (ByVal hwnd As ****, ByVal _

            lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _

            ByVal nShowCmd As ****)

            Private Declare Function GetDesktopWindow Lib «user32» () As ****

            Const SW_SHOWNORMAL = 1

Диалоговое окно ввода данных

Sub InputDialog()

   Dim strInput As String

   ‘ Вызов стандартного диалогового окна ввода данных

   strInput = InputBox(«Введите данные», «Ввод данных»)

End Sub

Диалоговое окно настройки шрифта

Sub ShowFontDialog()

   ‘ Вызов стандартного окна настройки шрифта текущей ячейки

   Application.Dialogs(xlDialogActiveCellFont).Show

End Sub

Значения по умолчанию

Sub NewInputDialog()

   Dim strInput As String

   ‘ Вызов стандартного диалогового окна ввода со значением _

    по умолчанию

   strInput = InputBox(«Введите данные», «Ввод данных», _

    «Значение по умолчанию», 200, 200)

End Sub

ГЛАВА 7.ФОРМАТИРОВАНИЕ ТЕКСТА. ТАБЛИЦЫ. ГРАНИЦЫ И ЗАЛИВКА.

Вывод списка доступных шрифтов

Листинг 3.104. Список шрифтов

Sub ListOfFonts()

   Dim cbrcFonts As CommandBarControl

   Dim cbrBar As CommandBar

   Dim i As Integer

   ‘ Получение доступа к списку шрифтов (элемент управления в виде _

    раскрывающегося списка на панели инструментов «Форматирование»)

   Set cbrcFonts = Application.CommandBars(«Formatting»). _

    FindControl(ID:=1728)

   If cbrcFonts Is Nothing Then

      ‘ Панель «Форматирование» не открыта — откроем ее

      Set cbrBar = Application.CommandBars.Add

      Set cbrcFonts = cbrBar.Controls.Add(ID:=1728)

   End If

   ‘ Подготовка к выводу шрифтов (очистка ячеек)

   Range(«A:A»).ClearContents

   ‘ Вывод списка шрифтов в столбец «A» текущего листа

   For i = 0 To cbrcFonts.ListCount — 1

      Cells(i + 1, 1) = cbrcFonts.List(i + 1)

   Next i

   ‘ Закрытие панели инструментов «Форматирование», если мы были _

    вынуждены ее открывать

   On Error Resume Next

   cbrBar.Delete

End Sub

Выбор из текста всех чисел

Листинг 2.48. Функция ExtractNumeric

Function ExtractNumeric(iCell)

   ‘ Анализируется каждый символ входной строки iCell

   For iCount = 1 To Len(iCell)

      ‘ Проверка, является ли анализируемый символ числом

      If IsNumeric(Mid(iCell, iCount, 1)) = True Then

         ‘ Число добавляется в выходную строку

         ExtractNumeric = ExtractNumeric & Mid(iCell, iCount, 1)

      End If

   Next

End Function

Прописная буква только в начале текста

Листинг 2.49. Функция ПрописнНач

Function ПрописнНач(Текст)

   ‘ Пустой текст функция не обрабатывает

   If Текст = «» Then ПрописнНач = «<>»: Exit Function

   ‘ Выделение первого символа и перевод его в верхний регистр

   ПервыйСимвол = UCase(Left(Текст, 1))

   ‘ Выделение остальной части строки и перевод _

    ее в нижний регистр

   Обрубок = LCase(Mid(Текст, 2))

   ‘ Соединение частей строки и возврат значения

   ПрописнНач = ПервыйСимвол & Обрубок

End Function

Подсчет количества повторов искомого текста

Листинг 2.51. Функция CoincideCount

Function CoincideCount(Text, Search)

   ‘ Проверка правильности входных данных _

    (аргумента Search)

   If IsArray(Search) = True Then Exit Function

   If IsError(Search) = True Then Exit Function

   If IsEmpty(Search) = True Then Exit Function

   ‘ Просмотр заданного в параметре Text диапазона

   For Each iCell In Text

      ‘ Анализируются только ячейки, содержащие _

       корректные значения

      If Not IsError(iCell) Then

         ‘ iText — строка для просмотра (в нижнем регистре)

         iText = LCase(iCell)

         ‘ iSearch — искомое значение (в нижнем регистре)

         iSearch = LCase(Search)

         ‘ Длина искомой строки

         iLen = Len(Search)

         ‘ Первый поиск строки iSearch в строке iText _

          (этот и последующий поиски производятся без _

          учета регистра символов)

         iNumber = InStr(iText, iSearch)

         While iNumber > 0

            ‘ Поиск следующего вхождения строки

            iNumber = InStr(iNumber + iLen, iText, iSearch)

            ‘ Подсчет количества вхождений

            CoincideCount = CoincideCount + vbNull

         Wend

      End If

   Next

End Function

Выделение из текста произвольного элемента

Листинг 2.76. Выделение элемента текста

Function dhGetTextItem(ByVal strTextIn As String, intItem As _

 Integer, strSeparator As String) As String

   Dim intStart As Integer ‘ Позиция начала текущего элемента

   Dim intEnd As Integer   ‘ Позиция конца текущего элемента

   Dim i As Integer        ‘ Номер текущего элемента

   ‘ Проверка корректности номера элемента

   If intItem < 1 Then Exit Function

   ‘ Убираются лишние пробелы, если разделитель — пробел

   If strSeparator = » » Then strTextIn = Application.Trim(strTextIn)

   ‘ Разделитель добавляется в конец строки

   If Right(strTextIn, Len(strTextIn)) <> strSeparator Then _

      strTextIn = strTextIn & strSeparator

   ‘ Поиск всех элементов в строке до нужного

   For i = 1 To intItem

      ‘ Начало элемента (перемещение вперед по строке)

      intStart = intEnd + 1

      ‘ Конец элемента

      intEnd = InStr(intStart, strTextIn, strSeparator)

      If (intEnd = 0) Then

         ‘ Дошли до конца строки, но элемент не нашли

         Exit Function

      End If

   Next i

   ‘ Выделение текста из входной строки

   dhGetTextItem = Mid(strTextIn, intStart, intEnd — intStart)

End Function

Отображение текста «задом наперед»

Листинг 2.71. Преобразование текста в обратном порядке

Function dhReverseText(strText As String) As String

   Dim i As Integer

   ‘ Переписываем символы из входной строки в выходную _

    в обратном порядке

   For i = Len(strText) To 1 Step -1

      dhReverseText = dhReverseText & Mid(strText, i, 1)

   Next i

End Function

Sub ReverseText()

   Dim strText As String

   ‘ Ввод строки посредством стандартного окна ввода

   strText = InputBox(«Введите текст:»)

   ‘ Реверсия строки и вывод результата

   MsgBox dhReverseText(strText), , strText

End Sub

Англоязычный текст — заглавными буквами

Листинг 2.70. Английский текст — в верхнем регистре

Function dhFormatEnglish(strText As String) As String

   Dim i As Integer

   Dim strCurChar As String * 1

   ‘ Анализируется каждый символ строки strText. Каждый символ _

    латинского алфавита преобразуется в верхний регистр

   For i = 1 To Len(strText)

      strCurChar = Mid(strText, i, 1)

      ‘ Код латинских строчных символов лежит в пределах _

       от 97 до 122

      If Asc(strCurChar) >= 97 And Asc(strCurChar) <= 122 Then

         ‘ Переводим символ в верхний регистр

         dhFormatEnglish = dhFormatEnglish & UCase(strCurChar)

      Else

         ‘ Просто добавляем символ в выходную строку

         dhFormatEnglish = dhFormatEnglish & strCurChar

      End If

   Next i

End Function

Запуск таблицы символов из Excel

Листинг 3.106. Вызов таблицы символов

Sub ShowSymbolTable()

   On Error Resume Next

   ‘ Запуск Charmap.exe — таблицы символов

   Shell «Charmap.exe», vbNormalFocus

   If Err <> 0 Then

      MsgBox «Невозможно запустить таблицу символов.», vbCritical

   End If

End Sub

Листинг 3.107. Таблица символов

‘ Декларация API-функций:

‘ для открытия процесса

Declare Function OpenProcess Lib «kernel32» _

 (ByVal dwDesiredAccess As ****, ByVal bInheritHandle As ****, _

 ByVal dwProcessId As ****) As ****

‘ для получения кода завершения процесса

Declare Function GetExitCodeProcess Lib «kernel32» _

 (ByVal hProcess As ****, lpExitCode As ****) As ****

‘ для закрытия процесса

Declare Function CloseHandle Lib «kernel32» _

 (hProcess) As ****

Sub ShowSymbolTable1()

   Dim lProcessID As ****

   Dim hProcess As ****

   Dim lExitCode As ****

   On Error Resume Next

   ‘ Запуск таблицы символов (Charman.exe). Функция возвращает _

    идентификатор созданного процесса

   lProcessID = Shell(«Charmap.exe», 1)

   If Err <> 0 Then

      MsgBox «Нельзя запустить Charman.exe», vbCritical, «Ошибка»

      Exit Sub

   End If

   ‘ Открытие процесса по идентификатору (lProcessID). Функция _

    возвращает дескриптор процесса (handle)

   hProcess = OpenProcess(&H400, False, lProcessID)

   ‘ Ждем, пока процесс завершится, для этого периодически _

    получаем код завершения процесса (пока Charman.exe исполняется, _

    функция GetExitCodeProcess возвращает &H103)

   Do

      GetExitCodeProcess hProcess, lExitCode

      DoEvents

   Loop While lExitCode = &H103

   ‘ Закрытие процесса

   CloseHandle (hProcess)

   ‘ Вывод на экран информационного сообщения

   MsgBox «Charmap.exe завершает свою работу»

End Sub

Листинг 3.64. Формат «два знака после запятой»

Sub ChangeNumberFormat()

   Selection.NumberFormat = «0.00»

End Sub

Листинг 3.65. Использование разделителя по разрядам

Sub ThreeNullSepatator()

   Selection.NumberFormat = «#,##»

End Sub

Листинг 3.66. Изменение формата

Sub ChangeNumerFormatEx()

   Selection.NumberFormat = «#,##0.00»

End Sub

Листинг 3.67. Помещение последнего символа над строкой

Sub LastCharUp()

   ‘ Изменение расположения последнего символа ячейки

   With ActiveCell.Characters(Start:=Len(Selection), Length:=1).Font

      .Supersсriрt = True

   End With

End Sub

Листинг 3.68. Нестандартная рамка

Sub ChangeSelGrid()

   ‘ Оформление границ выделения

   ‘ Левая граница

   With Selection.Borders(xlEdgeLeft)

      .LineStyle = xlContinuous

      .Weight = xlThin

      .ColorIndex = xlAutomatic

   End With

   ‘ Правая граница

   With Selection.Borders(xlEdgeRight)

      .LineStyle = xlContinuous

      .Weight = xlThin

      .ColorIndex = xlAutomatic

   End With

   ‘ Верхняя граница

   With Selection.Borders(xlEdgeTop)

      .LineStyle = xlContinuous

      .Weight = xlThin

      .ColorIndex = xlAutomatic

   End With

   ‘ Нижняя граница

   With Selection.Borders(xlEdgeBottom)

      .LineStyle = xlContinuous

      .Weight = xlThin

      .ColorIndex = xlAutomatic

   End With

   ‘ Изменение сетки внутри выделения

   ‘ Вертикальные линии сетки

   With Selection.Borders(xlInsideVertical)

      .LineStyle = xlContinuous

      .Weight = xlHairline

      .ColorIndex = xlAutomatic

   End With

   ‘ Горизонтальные линии сетки

   With Selection.Borders(xlInsideHorizontal)

      .LineStyle = xlContinuous

      .Weight = xlHairline

      .ColorIndex = xlAutomatic

   End With

End Sub

ГЛАВА 8 ИНФОРМАЦИЯ О ПОЛЬЗОВАТЕЛЕ, КОМПЬЮТЕРЕ, ПРИНТЕРЕ И Т.Д.

Получить имя пользователя

Логин юзера получить просто:

Dim UserName As String

UserName = CreateObject(«Wsсriрt.Network»).UserName

А как отслеживать — вариатнов много.

Я, например, просто не выполняю макрос, если логин не тот:

If ThisWorkbook.Sheets(«Rules»).Range(«Admin»).Find(CreateObject(«Wsсriрt.Network»).UserName, _

LookAt:=xlWhole, LookIn:=xlValues) Is Nothing Then Exit Sub

MsgBox «Имя пользователя : » & CreateObject(«Wsсriрt.Network»).UserNam

CreateObject(«Wsсriрt.Network»).UserName вместо Application.UserName

Вывод разрешения монитора

Листинг 3.73. Разрешение монитора

‘Объявление API-функции

Declare Function GetSystemMetrics Lib «user32» _

 (ByVal nIndex As ****) As ****

‘ Константы, которые передаются в функцию для определения _

 горизонтального и вертикального размеров изображения

Const SM_CXSCREEN = 0

Const SM_CYSCREEN = 1

Sub GetMonitorResolution()

   Dim lngHorzRes As ****

   Dim lngVertRes As ****

   ‘ Получение ширины и высоты изображения на мониторе

   lngHorzRes = GetSystemMetrics(SM_CXSCREEN)

   lngVertRes = GetSystemMetrics(SM_CYSCREEN)

   ‘ Отображение сообщения

   MsgBox «Текущее разрешение: » & lngHorzRes & «x» & lngVertRes

End Sub

Получение информации об используемом принтере

Информация о принтере

‘ Объявление API-функции

Declare Function GetProfileStringA Lib «kernel32» _

 (ByVal lpAppName As String, ByVal lpKeyName As String, _

 ByVal lpDefault As String, ByVal lpReturnedString As _

 String, ByVal nSize As ****) As ****

Sub Принтер()

   Dim strFullInfo As String * 255  ‘ Буфер для API-функции

   Dim strInfo As String            ‘ Строка с полной информацией

   Dim strPrinter As String         ‘ Название принтера

   Dim strDriver As String          ‘ Драйвер принтера

   Dim strPort As String            ‘ Порт принтера

   Dim strMessage As String

   Dim intPrinterEndPos As Integer

   Dim intDriverEndPos As Integer

   ‘ Заполнение буфера пробелами

   strFullInfo = Space(255)

   ‘ Получение полной информации о принтере

   Call GetProfileStringA(«Windows», «Device», «», strFullInfo, 254)

   ‘ Удаление лишних символов из конца возвращенной строки

   ‘ Строка strInfo имеет формат <имя_принтера>,<драйвер>,<порт>:

   strInfo = Trim(strFullInfo)

   ‘ Поиск запятых в строке (окончаний названий принтера и драйвера)

   intPrinterEndPos = Application.Find(«,», strInfo, 1)

   intDriverEndPos = Application.Find(«,», strInfo, intPrinterEndPos + 1)

   ‘ Определение названия принтера

   strPrinter = Left(strInfo, intPrinterEndPos — 1)

   ‘ Определение драйвера

   strDriver = Mid(strInfo, intPrinterEndPos + 1, intDriverEndPos _

    — intPrinterEndPos — 1)

   ‘ Определение порта (его название заканчивается символом «:»)

   strPort = Mid(strInfo, intDriverEndPos + 1, InStr(1, strInfo, «:») _

    — intDriverEndPos — 1)

   ‘ Формирование информационного сообщения

   strMessage = «Принтер:» & Chr(9) & strPrinter & Chr(13)

   strMessage = strMessage & «Драйвер:» & strDriver & Chr(13)

   strMessage = strMessage & «strPort:» & Chr(9) & strPort

   ‘ Вывод информационного сообщения

   MsgBox strMessage, vbInformation, «Сведения о принтере по умолчанию»

End Sub

Просмотр информации о дисках компьютера

Sub DrivesInfo()

   Dim objFileSysObject As Object  ‘ Объект для работы _

                                    с файловой системой

   Dim objDrive As Object          ‘ Анализируемый диск

   Dim intRow As Integer           ‘ Заполняемая строка листа

   ‘ Создание объекта для работы с файловой системой

   Set objFileSysObject = CreateObject(«sсriрting.FileSystemObject»)

   ‘ Очистка листа

   Cells.Clear

   ‘ Запись с первой строки

   intRow = 1

   ‘ Запись на лист информации о дисках компьютера

   On Error Resume Next

   For Each objDrive In objFileSysObject.Drives

      ‘ Буква диска

      Cells(intRow, 1) = objDrive.DriveLetter

      ‘ Готовность

      Cells(intRow, 2) = objDrive.IsReady

      ‘ Тип диска

      Select Case objDrive.DriveType

         Case 0

            Cells(intRow, 3) = «Неизвестно»

         Case 1

            Cells(intRow, 3) = «Съемный»

         Case 2

            Cells(intRow, 3) = «Жесткий»

         Case 3

            Cells(intRow, 3) = «Сетевой»

         Case 4

            Cells(intRow, 3) = «CD-ROM»

         Case 5

            Cells(intRow, 3) = «RAM»

      End Select

      ‘ Метка диска

      Cells(intRow, 4) = objDrive.VolumeName

      ‘ Общий размер

      Cells(intRow, 5) = objDrive.TotalSize

      ‘ Свободное место

      Cells(intRow, 6) = objDrive.AvailableSpace

      intRow = intRow + 1

   Next

End Sub

ГЛАВА 9. ДИАГРАММЫ

Построение диаграммы с помощью макроса

Листинг 5.1. Макрос построения диаграммы

Sub CreateChart()

   ‘ Создание и настройка диаграммы

   With Charts.Add

      ‘ Данные из первого листа

      .SetSourceData Source:=Worksheets(1).Range(«A1:E4»)

      ‘ Заголовок

      .HasTitle = True

      .ChartTitle.Text = «Выручка по магазинам»

      ‘ Активизируем диаграмму

      .Activate

   End With

End Sub

Листинг 5.2. Построение внедренной диаграммы

Sub CreateеmbеddedChart()

   ‘ Создание и настройка внедренной диаграммы

   With Worksheets(1).ChartObjects.Add(100, 60, 250, 200)

      ‘ Объемная диаграмма

      .Chart.ChartType = xl3DArea

      ‘ Источник данных

      .Chart.SetSourceData Source:=Worksheets(1).Range(«A1:E4»)

   End With

End Sub

Листинг 5.3. Создание диаграммы на основе выделенных данных

Sub CreateCharOnSelection()

   ‘ Создание диаграммы (с заданием положения на листе)

   With ActiveSheet.ChartObjects.Add( _

    Selection.Left + Selection.Width, _

    Selection.Top + Selection.Height, 300, 200).Chart

      ‘ Тип диаграммы

      .ChartType = xlColumnClustered

      ‘ Источник данных — выделение

      .SetSourceData Source:=Selection, PlotBy:=xlColumns

      ‘ Без легенды

      .HasLegend = False

      ‘ Без заголовка

      .HasTitle = True

      .ChartTitle.Characters.Text = «Выручка за период»

      ‘ Выделение диаграммы

      .Parent.Select

   End With

End Sub

Сохранение диаграммы в отдельном файле

Листинг 5.4. Сохранение диаграммы

Sub SaveChart()

   ‘ Сохранение выделенной диаграммы в файл

   If ActiveChart Is Nothing Then

      ‘ Нет выделенных диаграмм

      MsgBox «Выделите диаграмму»

   Else

      ‘ Сохранение…

      ActiveChart.Export ActiveWorkbook.path & «Диаграмма.gif», «GIF»

   End If

End Sub

Листинг 5.5. Сохранение диаграммы под указанным именем

Sub InteractiveSaveChart()

   Dim strFileName As String  ‘ Имя файла для сохранения

   ‘ Проверка, выделена ли диаграмма

   If ActiveChart Is Nothing Then

      ‘ Нет выделенных диаграмм

      MsgBox «Выделите диаграмму»

   Else

      ‘ Выбор файла для сохранения

      strFileName = Application.GetSaveAsFilename( _

       ActiveChart.Name & «.gif», «Файлы GIF (*.gif), *.gif», 1, _

       «Сохранить диаграмму в формате GIF»)

      ‘ Проверка, выбран ли файл

      If strFileName <> «» Then

         ‘ Сохранение выделенной диаграммы в файл

         ActiveChart.Export strFileName, «GIF»

      End If

   End If

End Sub

Построение и удаление диаграммы нажатием одной кнопки

Листинг 5.6. Быстрое построение и удаление диаграммы

Sub CreateChart()

   ‘ Создание диаграммы

   Charts.Add

   ‘ Параметры диаграммы

   ‘ Тип диаграммы

   ActiveChart.ChartType = xlLineMarkers

   ‘ Заголовок

   ActiveChart.SetSourceData Range(«B1:E2»), xlRows

   ActiveChart.Location xlLocationAsObject, Name

   ‘ Остальные параметры

   With ActiveChart

      ‘ Заголовок

      .HasTitle = True

      .ChartTitle.Characters.Text = Name

      ‘ Заголовок оси категорий

      .Axes(xlCategory, xlPrimary).HasTitle = True

      .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text _

       = Sheets(Name).Range(«A1»).Value

      ‘ Заголовок оси значений

      .Axes(xlValue, xlPrimary).HasTitle = True

      .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text _

       = Sheets(Name).Range(«A2»).Value

      ‘ Отображение легенды

      .HasLegend = False

      .HasDataTable = True

      .DataTable.ShowLegendKey = True

      ‘ Настройка отображения сетки

      With .Axes(xlCategory)

         .HasMajorGridlines = True

         .HasMinorGridlines = False

      End With

      With .Axes(xlValue)

         .HasMajorGridlines = True

         .HasMinorGridlines = False

      End With

   End With

End Sub

Sub DeleteChart()

   ‘ Удаление диаграммы

   ActiveSheet.ChartObjects.Delete

End Sub

Вывод списка диаграмм в отдельном окне

Листинг 5.7. Внедренные диаграммы

Sub ShowSheetCharts()

   Dim strMessage As String

   Dim i As Integer

   ‘ Формирование списка диаграмм

   For i = 1 To ActiveSheet.ChartObjects.Count

      strMessage = strMessage & ActiveSheet.ChartObjects(i).Name _

       & vbNewLine

   Next i

   ‘ Отображение списка

   MsgBox strMessage

End Sub

Листинг 5.8. Перечень рабочих листов, содержащих обычные диаграммы

Sub ShowBookCharts()

   Dim crt As chart

   Dim strMessage As String

   ‘ Формирование списка диаграмм

   For Each crt In ActiveWorkbook.Charts

      strMessage = strMessage & crt.Name & vbNewLine

   Next

   ‘ Отображение списка

   MsgBox strMessage

End Sub

Применение случайной цветовой палитры

Листинг 5.9. Случайная цветовая палитра

Sub RandomChartColors()

   Dim intGradientStyle As Integer, intGradientVariant As Integer

   Dim i As Integer

   ‘ Проверка, выделена ли диаграмма

   If ActiveChart Is Nothing Then Exit Sub

   ‘ Изменение оформления всех категорий

   For i = 1 To ActiveChart.SeriesCollection.Count

      With ActiveChart.SeriesCollection(i)

         ‘ Вид градиентной заливки (случайный)

         intGradientStyle = Int(Rnd * 7) + 1

         If intGradientStyle = 6 Then intGradientStyle = 1

         If intGradientStyle = 7 Then

            intGradientVariant = Int(Rnd * 2) + 1

         Else

            intGradientVariant = Int(Rnd * 4) + 1

         End If

         ‘ Применение градиента

         .Fill.TwoColorGradient Style:=intGradientStyle, _

          Variant:=intGradientVariant

         ‘ Установка случайных цветов фона и обводки (используются _

          для градиента)

         .Fill.ForeColor.SchemeColor = Int(Rnd * 57) + 1

         .Fill.BackColor.SchemeColor = Int(Rnd * 57) + 1

      End With

   Next i

End Sub

Эффект прозрачности диаграммы

Листинг 5.10. Эффект прозрачности диаграммы

Sub TransparentChart()

   Dim shpShape As Shape

   Dim dblColor As Double

   Dim srSerie As Series

   Dim intBorderLineStyle As Integer

   Dim intBorderColorIndex As Integer

   Dim intBorderWeight As Integer

   ‘ Проверка, есть ли выделенная диаграмма

   If ActiveChart Is Nothing Then Exit Sub

   ‘ Изменение отображения каждой категории

   For Each srSerie In ActiveChart.SeriesCollection

      If (srSerie.ChartType = xlColumnClustered Or _

       srSerie.ChartType = xlColumnStacked Or _

       srSerie.ChartType = xlColumnStacked100 Or _

       srSerie.ChartType = xlBarClustered Or _

       srSerie.ChartType = xlBarStacked Or _

       srSerie.ChartType = xlBarStacked100) Then

         ‘ Сохранение прежнего цвета категории

         dblColor = srSerie.Interior.Color

         ‘ Сохранение стиля линий

         intBorderLineStyle = srSerie.Border.LineStyle

         ‘ Цвет границы

         intBorderColorIndex = srSerie.Border.ColorIndex

         ‘ Толщина линий границы

         intBorderWeight = srSerie.Border.Weight

         ‘ Создание автофигуры

         Set shpShape = ActiveSheet.shapes.AddShape _

          (msoShapeRectangle, 1, 1, 100, 100)

         With shpShape

            ‘ Закрашиваем нужным цветом

            .Fill.ForeColor.RGB = dblColor

            ‘ Делаем прозрачной

            .Fill.Transparency = 0.4

            ‘ Убираем линии

            .Line.Visible = msoFalse

         End With

         ‘ Копируем автофигуру в буфер обмена

         shpShape.CopyPicture Appearance:=xlScreen, _

          Format:=xlPicture

         ‘ Вставляем автофигуру в изображения столбцов _

          категории и настраиваем

         With srSerie

            ‘ Собственно вставка

            .Paste

            ‘ Возвращаем на место толщину линий

            .Border.Weight = intBorderWeight

            ‘ Стиль линий

            .Border.LineStyle = intBorderLineStyle

            ‘ Цвет границы

            .Border.ColorIndex = intBorderColorIndex

         End With

         ‘ Автофигура больше не нужна

         shpShape.Delete

      End If

   Next srSerie

End Sub

Построение диаграммы на основе данных нескольких рабочих листов

Листинг 5.11. Одновременное создание нескольких диаграмм

Sub ManyCharts()

   Dim intTop As ****, intLeft As ****

   Dim intHeight As ****, intWidth As ****

   Dim sheet As Worksheet

   Dim lngFirstRow As ****      ‘ Первая строка с данными

   Dim intSerie As Integer      ‘ Текущая категория диаграммы

   Dim strErrorSheets As String ‘ Список листов, для которых _

                                 не удалось построить диаграммы

   intTop = 1       ‘ Верхняя точка первой диаграммы

   intLeft = 1      ‘ Левая точка каждой диаграммы

   intHeight = 180  ‘ Высота каждой диаграммы

   intWidth = 300   ‘ Ширина каждой диаграммы

   ‘ Постоение диаграммы для каждого листа, кроме текущего

   For Each sheet In ActiveWorkbook.Worksheets

      If sheet.Name <> ActiveSheet.Name Then

         ‘ Первый заполненный ряд

         lngFirstRow = 3

         ‘ Первая категория

         intSerie = 1

         On Error GoTo DiagrammError

         ‘ Добавление и настройка диаграммы

         With ActiveSheet.ChartObjects.Add _

          (intLeft, intTop, intWidth, intHeight).Chart

            Do Until IsEmpty(sheet.Cells(lngFirstRow + intSerie, 1))

               ‘ Создание ряда

               .SeriesCollection.NewSeries

               ‘ Значения для ряда

               .SeriesCollection(intSerie).Values = _

                sheet.Range(sheet.Cells(lngFirstRow + intSerie, 2), _

                sheet.Cells(lngFirstRow + intSerie, 4))

               ‘ Диапазон данных для подписей

               .SeriesCollection(intSerie).XValues = _

                sheet.Range(«B3:D3»)

               ‘ Название ряда (берется из столбца «A» таблицы с данными)

               .SeriesCollection(intSerie).Name = sheet.Cells( _

                lngFirstRow + intSerie, 1)

               intSerie = intSerie + 1

            Loop

            ‘ Настройка внешнего вида диаграммы

            .ChartType = xl3DColumnClustered

            .ChartGroups(1).GapWidth = 20

            .PlotArea.Interior.ColorIndex = xlNone

            .ChartArea.Font.Size = 9

            ‘ Диаграмма с легендой

            .HasLegend = True

            ‘ Заголовок

            .HasTitle = True

            .ChartTitle.Characters.Text = sheet.Range(«A1»)

            ‘ Задание диапазона значений на осях

            .Axes(xlValue).MinimumScale = 0

            .Axes(xlValue).MaximumScale = 120000

            ‘ Стиль линий сетки (прерывистый)

            .Axes(xlValue).MajorGridlines.Border. _

             LineStyle = xlDot

         End With

         On Error GoTo 0

         ‘ Сдвиг верхней точки следующей диаграммы на высоту _

          текущей диаграммы

         intTop = intTop + intHeight

AfterError:

      End If

   Next sheet

   If strErrorSheets <> «» Then

      ‘ Отобразим список листов, для которых не построили диаграммы

      MsgBox «Не удалось построить диаграммы для листов:» & Chr(13) _

       & strErrorSheets, vbExclamation

   End If

   Exit Sub

DiagrammError:

   ‘ Добавление в список имени листа, для которого не смогли _

    построить диаграмму (ошибка в данных для диаграммы)

   strErrorSheets = strErrorSheets & sheet.Name & Chr(13)

   ‘ Удаление пустой диаграммы на текущем листе

   ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Delete

   ‘ Продолжаем работу с другими листами

   Resume AfterError

End Sub

Создание подписей к данным диаграммы

Листинг 5.12. Подписи к данным диаграммы

Sub ShowLabels()

   Dim rgLabels As Range    ‘ Диапазон с подписями

   Dim chrChart As Chart    ‘ Диаграмма

   Dim intPoint As Integer  ‘ Точка, для которой добавляется подпись

   ‘ Определение диаграммы

   Set chrChart = ActiveSheet.ChartObjects(1).Chart

   ‘ Запрос на ввод диапазона с исходными данными

   On Error Resume Next

   Set rgLabels = Application.InputBox _

    (prompt:=»Укажите диапазон с подписями», Type:=8)

   If rgLabels Is Nothing Then Exit Sub

   On Error GoTo 0

   ‘ Добавление подписей

   chrChart.SeriesCollection(1).ApplyDataLabels _

    Type:=xlDataLabelsShowValue, _

    AutoText:=True, _

    LegendKey:=False

   ‘ Просмотр диапазона и назначение подписей

   For intPoint = 1 To chrChart.SeriesCollection(1).Points.Count

      chrChart.SeriesCollection(1). _

       Points(intPoint).DataLabel.Text = rgLabels(intPoint)

   Next intPoint

End Sub

Sub DeleteLabels()

   ‘ Удаление подписей диаграммы

   ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1). _

    HasDataLabels = False

End Sub

ГЛАВА 10. РАЗНЫЕ ПРОГРАММЫ.

Программа для составления кроссвордов

Листинг 6.1. Программа для составления кроссворда

Const dhcMinCol = 1   ‘ Номер первого столбца кроссворда

Const dhcMaxCol = 35  ‘ Номер последнего столбца кроссворда

Const dhcMinRow = 1   ‘ Номер первой строки кроссворда

Const dhcMaxRow = 35  ‘ Номер последней строки кроссворда

Sub Clear()

   ‘ Выделение и очистка всех используемых для кроссворда ячеек

   Range(Cells(dhcMinRow, dhcMinCol), _

    Cells(dhcMaxRow, dhcMaxCol)).Select

   Selection.Clear

   ‘ Удаление сетки всего кроссворда

   ClearGrid

   Range(«A1»).Select

End Sub

Sub ClearGrid()

   ‘ Удаление сетки кроссворда (в выделенных ячейках)…

   ‘ Возврат прежнего цвета ячеек

   Selection.Interior.ColorIndex = xlNone

   ‘ Задание начертания границ ячеек по умолчанию

   Selection.Borders(xlDiagonalDown).LineStyle = xlNone

   Selection.Borders(xlDiagonalUp).LineStyle = xlNone

   Selection.Borders(xlEdgeLeft).LineStyle = xlNone

   Selection.Borders(xlEdgeTop).LineStyle = xlNone

   Selection.Borders(xlEdgeBottom).LineStyle = xlNone

   Selection.Borders(xlEdgeRight).LineStyle = xlNone

   Selection.Borders(xlInsideVertical).LineStyle = xlNone

   Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

End Sub

Sub DrowCrosswordGrid()

   ‘ Процедура начертания сетки кроссворда

   ‘ Задание цвета всех ячеек кроссворда

   Selection.Interior.ColorIndex = 35

   ‘ Линии по диагонали не нужны

   Selection.Borders(xlDiagonalDown).LineStyle = xlNone

   Selection.Borders(xlDiagonalUp).LineStyle = xlNone

   ‘ Задание начертания границ всех диапазонов, входящих _

    в выделение, а также границ между соседними ячейками _

    всех диапазонов

   On Error Resume Next

   ‘ Левые границы

   With Selection.Borders(xlEdgeLeft)

      .LineStyle = xlContinuous

      .Weight = xlThin

      .ColorIndex = xlAutomatic

   End With

   ‘ Правые границы

   With Selection.Borders(xlEdgeRight)

      .LineStyle = xlContinuous

      .Weight = xlThin

      .ColorIndex = xlAutomatic

   End With

   ‘ Верхние границы

   With Selection.Borders(xlEdgeTop)

      .LineStyle = xlContinuous

      .Weight = xlThin

      .ColorIndex = xlAutomatic

   End With

   ‘ Нижние границы

   With Selection.Borders(xlEdgeBottom)

      .LineStyle = xlContinuous

      .Weight = xlThin

      .ColorIndex = xlAutomatic

   End With

   ‘ Вертикальные границы между ячейками

   With Selection.Borders(xlInsideVertical)

      .LineStyle = xlContinuous

      .Weight = xlThin

      .ColorIndex = xlAutomatic

   End With

   ‘ Горизонтальные границы между ячейками

   With Selection.Borders(xlInsideHorizontal)

      .LineStyle = xlContinuous

      .Weight = xlThin

      .ColorIndex = xlAutomatic

   End With

End Sub

Sub DisplayGrid()

   ‘ Включение сетки на листе

   ActiveWindow.DisplayGridlines = True

End Sub

Sub HideGrid()

   ‘ Выключение сетки на листе

   ActiveWindow.DisplayGridlines = False

End Sub

Sub AutoNumber()

   ‘ Нумерация клеток, являющихся началом слов

   Dim intRow As Integer    ‘ Текущая строка

   Dim intCol As Integer    ‘ Текущий ряд

   Dim cell As Range        ‘ Текущая ячейка (с координатами _

                             (intRow, intCol))

   Dim fTop As Boolean      ‘ = True, если cell имеет соседей сверху

   Dim fBottom As Boolean   ‘ = True, если cell имеет соседей снизу

   Dim fLeft As Boolean     ‘ = True, если cell имеет соседей слева

   Dim fRight As Boolean    ‘ = True, если cell имеет соседей справа

   Dim intDigit As Integer  ‘ Текущий номер слова в кроссворде

   intDigit = 1             ‘ Нумерация слов с 1

   ‘ Проходим по всем клеткам диапазона, используемого _

    для кроссворда, сверху вниз слева направо и анализируем _

    каждую угловую и крайнюю (левую и верхнюю) ячейки

   For intRow = dhcMinRow To dhcMaxRow

      For intCol = dhcMinCol To dhcMaxCol

         ‘ Текущая ячейка

         Set cell = Cells(intRow, intCol)

         ‘ Проверка, входит ли ячейка в кроссворд (по ее цвету)

         If cell.Interior.ColorIndex = 35 Then

            fLeft = False

            fRight = False

            fTop = False

            fBottom = False

            On Error Resume Next

            ‘ Определение наличия соседей у ячейки…

            ‘ сверху

            fTop = cell.Offset(-1, 0).Interior.ColorIndex = 35

            ‘ снизу

            fBottom = cell.Offset(1, 0).Interior.ColorIndex = 35

            ‘ слева

            fLeft = cell.Offset(0, -1).Interior.ColorIndex = 35

            ‘ справа

            fRight = cell.Offset(0, 1).Interior.ColorIndex = 35

            On Error GoTo 0

            ‘ Анализ положения ячейки

            If (Not fTop And Not fLeft) Or _

             (Not fBottom And Not fLeft And fRight) Or _

             (Not fLeft And fRight) Or _

             (Not fTop And fBottom) Then

               ‘ Ячейка подходит для начала слова

               SetDigit intDigit, cell

               intDigit = intDigit + 1

            End If

         End If

      Next intCol

   Next intRow

End Sub

Sub SetDigit(intDigit As Integer, cell As Range)

   ‘ Вставка цифры intDigit в ячейку, заданную параметром cell

   cell.Value = intDigit

   ‘ Изменение настроек шрифта так, чтобы было похоже _

    на настоящий кроссворд

   ‘ Маленький размер шрифта

   cell.Font.Size = 6

   ‘ Выравнивание текста по левому верхнему углу ячейки

   cell.HorizontalAlignment = xlLeft

   cell.VerticalAlignment = xlTop

End Sub

Sub ToPrint()

   ‘ Удаление цветовой подсветки кроссворда

   Cells.Interior.ColorIndex = xlNone

End Sub

Sub ToNumber()

   ‘ Закрытие первой формы и переход ко второй

   UserForm1.Hide

   UserForm2.Show

End Sub

Создать обложку DVD

Sub Обложка_DVD()

On Error Resume Next

Sheets(«Обложка»).Select

If Err > 0 Then GoTo 10 Else MsgBox («Такой лист уже присутствует в книге…»): Exit Sub

10:

Sheets.Add.Name = «Обложка» ‘ создаем новый лист в текущей книге с именем «Обложка»

Sheets(«Обложка»).Range(«A1»).Select ‘ становимся в ячейку А1

Application.Dialogs(xlDialoginsеrtPicture).Show ‘вызываем диологовое окно «Вставка рисунка из файла»

Selection.ShapeRange.LockAspectRatio = msoFalse ‘

‘ Selection.ShapeRange.Height = 530.25 ‘ подгоняем размеры под размеры коробки

‘ Selection.ShapeRange.Width = 726# ‘

Selection.ShapeRange.Height = 530.2 ‘ подгоняем размеры под размеры коробки

Selection.ShapeRange.Width = 724# ‘

Selection.ShapeRange.Rotation = 0# ‘

Selection.Locked = False ‘

With ActiveSheet.PageSetup ‘ разносим поля листа на максимальные расстояния

.LeftMargin = Application.InchesToPoints(0.17)

.RightMargin = Application.InchesToPoints(0.17)

.TopMargin = Application.InchesToPoints(0.27)

.BottomMargin = Application.InchesToPoints(0.27)

.HeaderMargin = Application.InchesToPoints(0.17)

.FooterMargin = Application.InchesToPoints(0.17)

.Zoom = 100

.FitToPagesWide = 1

.FitToPagesTall = 1

.Orientation = xlLandscape ‘ придаем листу горизантальное положение (АЛЬБОМНЫЙ)

End With

If MsgBox(«Печать текущего изображения», vbYesNo, «Вывод на печать») = vbYes Then Sheets(«Обложка»).PrintOut Copies:=1, Collate:=True

Application.DisplayAlerts = False ‘ Выключили системные сообщения…

If MsgBox(«Удалить лист ОБЛОЖКА», vbYesNo, «Удаление листа…») = vbYes Then Sheets(«Обложка»).Delete Else Application.CommandBars(«Picture»).Visible = True

Application.DisplayAlerts = True ‘Включили системные сообщения…

End Sub

Игра «Минное поле»

Листинг 6.2. Код в модуле рабочего листа

Sub Worksheet_Selectiоnchange(ByVal Target As Range)

   Dim intCol As Integer, intRow As Integer

   Dim intMinesAround As Integer

   Dim fInGameField As Boolean

   ‘ Определим, попадает ли в игровое поле выделенная ячейка

   fInGameField = (Target.Row >= 2) And (Target.Row <= 7) _

    And (Target.Column >= 2) And (Target.Column <= 7)

   ‘ Обрабатываем выделение ячейки

   If Target.Value = «*» And fInGameField Then

      ‘ Пользователь выделил ячейку с миной — покажем мину

      Target.Font.Color = RGB(0, 0, 0)

      Target.Interior.Color = RGB(255, 0, 0)

      ‘ Пользователь проиграл!

      EndGame

   ElseIf fInGameField Then

      ‘ Пользователь выделил пустую ячейку. Оформим эту ячейку

      Target.Interior.Color = RGB(0, 0, 255)

      Target.Font.Color = RGB(0, 255, 0)

      Target.Font.Size = 16

      ‘ Подсчитаем количество мин рядом с ячейкой (вокруг ячейки)

      For intCol = Target.Column — 1 To Target.Column + 1

         For intRow = Target.Row — 1 To Target.Row + 1

            If Target.Worksheet.Cells(intRow, intCol).Value = «*» _

             Then

               ‘ Нашли очередную мину

               intMinesAround = intMinesAround + 1

            End If

         Next

      Next

      ‘ Отображение количества мин

      Target.Value = intMinesAround

   End If

End Sub

Листинг 6.3. Код в стандартном модуле

Sub NewGame()

   ‘ Начало новой игры

   ‘ Подготовим поле для игры

   InitGame

   Dim intRow As Integer, intCol As Integer

   Dim intMinesCount As Integer    ‘ Количество мин

   ‘ Расставляем мины (то есть в случайные ячейки помещаем _

    значения «*» и делаем цвет шрифта таким же, как цвет _

    фона этих ячеек)

   For intMinesCount = 1 To 10

      ‘ Строка для мины (от 2 до 7)

      intRow = Int((6 * Rnd) + 1) + 1

      ‘ Столбец для мины (от 2 до 7)

      intCol = Int((6 * Rnd) + 1) + 1

      ‘ Ставим мину, если ячейка пустая

      If Cells(intRow, intCol) <> «*» Then

         Cells(intRow, intCol).Font.Color = _

          Cells(intRow, intCol).Interior.Color

         Cells(intRow, intCol).Value = «*»

      Else

         ‘ В данной ячейке мина есть — продолжим поиск ячеек

         intMinesCount = intMinesCount — 1

      End If

   Next

   ‘ Вывод информации о количестве мин в строку состояния

   Application.StatusBar = «Количество мин » & intMinesCount

End Sub

Sub InitGame()

   ‘ Раскраска (оформление) листа перед началом игры

   Dim intRow As Integer, intCol As Integer

   ‘ Цвет фона всех ячеек

   Cells.Interior.Color = RGB(0, 200, 75)

   ‘ Цвет шрифта всех ячеек

   Cells.Font.Color = RGB(0, 0, 0)

   ‘ Размер шрифта

   Cells.Font.Size = 18

   ‘ Все надписи — по центру

   Cells.HorizontalAlignment = xlCenter

   ‘ Всем ячейкам игрового поля назначим особый цвет

   For intRow = 2 To 7

      For intCol = 2 To 7

         Cells(intRow, intCol).Interior.Color = RGB(200, 200, 200)

         Cells(intRow, intCol).Value = «»

      Next

   Next

End Sub

Sub EndGame()

   ‘ Завершение игры (поражение)

   Dim intRow As Integer, intCol As Integer

   ‘ Покажем все мины. Для этого сделаем цвет шрифта всех ячеек _

    черным (ведь во всех ячейках с минами «*» цвет шрифта и цвет _

    заливки одинаковы)

   For intRow = 2 To 7

      For intCol = 2 To 7

         If Cells(intRow, intCol).Value = «*» Then

            Cells(intRow, intCol).Font.Color = RGB(0, 0, 0)

         End If

      Next

   Next

   MsgBox «Проигрыш»

End Sub

Игра «Угадай животное»

Листинг 6.4. Игра «Угадай животное»

Sub StartGame()

   Dim intLastRow As Integer    ‘ Номер строки для вставки записей

   Dim intRow As Integer        ‘ Номер текущей строки

   Dim intYesRow As Integer     ‘ Номер строки, из которой брать _

                                 данные при утвердительном ответе

   Dim intNoRow As Integer      ‘ Номер строки, из которой брать _

                                 данные при отрицательном ответе

   Dim strText As String        ‘ Строка с вопросом или названием _

                                 животного

   Dim strNewName As String     ‘ Строка с названием нового животного

   Dim strNewQuestion As String ‘ Строка с новым вопросом

   Dim intRes As Integer

   ‘ Начало игры

   MsgBox «Начнем игру. Задумайте животное.», vbOKOnly, _

    «Задумайте животное»

   ‘ Определение номера ряда для вставки записей. _

    intLastRow-1 — номер последнего ряда, содержащего данные

   intLastRow = Worksheets(«Data»).Range(«D1»).Value + 1

   ‘ Данные в таблице идут с первого ряда

   intRow = 1

   Do While intRow < intLastRow

      ‘ Текст вопроса или название животного из столбца «A»

      strText = Worksheets(«Data»).Cells(intRow, 1).Value

      ‘ Номер ряда, из которого брать данные при утвердительном _

       ответе, берем из столбца «B»

      intYesRow = Worksheets(«Data»).Cells(intRow, 2).Value

      ‘ Номер ряда, из которого брать данные при отрицательном _

       ответе, берем из столбца «C»

      intNoRow = Worksheets(«Data»).Cells(intRow, 3).Value

      If intYesRow > 0 Then

         ‘ В строке strText содержится вопрос. Зададим его

         intRes = MsgBox(strText, vbYesNo, «Вопрос»)

         If intRes = vbYes Then

            ‘ Переходим по утвердительному ответу

            intRow = intYesRow

         Else

            ‘ Переходим по отрицательному ответу

            intRow = intNoRow

         End If

      Else

         ‘ Альтернативы закончились. В строке strText — название _

          животного. Спросим, его ли загадали

         intRes = MsgBox(«Это » & strText & «?», vbYesNo, «Вопрос»)

         If intRes = vbYes Then

            ‘ Животное угадано

            MsgBox «Угадано! Спасибо за игру!», vbOKOnly, _

             «Игра завершена»

            Exit Do

         Else

            ‘ Животное не угадали, но данные уже занкончились. _

             Нужно пополнить наши данные, чтобы отличать животное _

             с названием strText от загаданного

            ‘ Ввод названия нового животного

            strNewName = InputBox(«Сдаюсь. Кто это?», _

             «Напечатайте название животного»)

            If strNewName <> «» Then

               ‘ Ввод вопроса, по которому отличать животных

               strNewQuestion = InputBox(«Задайте вопрос, по » & _

                «которому можно отличить ‘» & strNewName & _

                «‘ от ‘» & strText & «‘», «Напечатайте вопрос»)

               If strNewQuestion <> «» Then

                  ‘ Определение, какое из животных соответствует _

                   утвердительному ответу на вопрос

                  intRes = MsgBox(«Правильный ответ на ваш » & _

                   «вопрос — » & strNewName & «‘», vbYesNo, _

                   «Какой ответ на вопрос?»)

                  ‘ Добавление в таблицу названия нового животного

                  Worksheets(«Data»).Cells(intLastRow, 1). _

                   Value = strNewName

                  ‘ Перемещения названия животного, которое было _

                   ранее, в конец таблицы

                  Worksheets(«Data»).Cells(intLastRow + 1, 1). _

                   Value = strText

                  ‘ Замена названия этого животного вопросом

                  Worksheets(«Data»).Cells(intRow, 1). _

                   Value = strNewQuestion

                  ‘ Корректировка номеров строк для перехода _

                   в зависимости от того, какое животное является _

                   правильным ответом на введенный пользователем вопрос

                  If intRes = vbYes Then

                     ‘ Новое животное — правильный ответ

                     Worksheets(«Data»).Cells(intRow, 2). _

                      Value = intLastRow

                     Worksheets(«Data»).Cells(intRow, 3). _

                      Value = intLastRow + 1

                  Else

                     ‘ Бывшее ранее животное — правильный ответ

                     Worksheets(«Data»).Cells(intRow, 2). _

                      Value = intLastRow + 1

                     Worksheets(«Data»).Cells(intRow, 3). _

                      Value = intLastRow

                  End If

                  ‘ Сохраним номер строки для добавления записей

                  Worksheets(«Data»).Range(«D1»).Value = _

                   intLastRow + 2

               End If

            End If

            ‘ Игра завершена. Таблица дополнена

            MsgBox «Спасибо за игру!», vbOKOnly, «Игра завершена»

            Exit Do

         End If

      End If

   Loop

End Sub

Расчет на основании ячеек определенного цвета

Листинг 6.5. Код в стандартном модуле

Const dhcSum As Integer = 0

Const dhcAvg As Integer = 1

Const dhcMax As Integer = 2

Const dhcMin As Integer = 3

Const dhcCount As Integer = 4

Const dhcSumPlus As Integer = 5

Const dhcSumMinus As Integer = 6

Const dhcCountFull As Integer = 7

Const dhcCountNotNull As Integer = 8

Const dhcCountPlus As Integer = 9

Const dhcCountMinus As Integer = 10

Sub CalcColors()

   ‘ Отображение формы

   Load frmColorCalc

   frmColorCalc.Show

End Sub

Public Function ColorCalc(strRange As String, _

   lngColor As ****, fBackBolor As Boolean, _

   intMode As Integer, Optional fAbsence As Boolean) As Double

   ‘ Операции над ячейками с установленным цветом шрифта _

    или заливки

   Dim rgData As Range     ‘ Диапазон ячеек для расчетов

   Dim i As Integer

   Dim Values() As Variant ‘ Массив со значениями для расчета

   Dim intCount As Integer ‘ Количество значений в массиве

   Dim cell As Range

   Dim varOut As Variant   ‘ В этой переменной хранятся _

                            результаты промежуточных подсчетов _

                            и окончательный результат

   Set rgData = Range(strRange)

   ReDim Values(1 To rgData.Count)

   ‘ Просматриваются все ячейки входного диапазона. Значения тех из них, _

    цвет которых удовлетворяет условию, записываются в массив Values

   For Each cell In rgData.Cells

      ‘ Если нужно суммировать по заливке:

      If fBackBolor = True Then

         ‘ Включение ячейки в сумму в зависимости от цвета _

          заливки и фильтра

         If fAbsence Then

            ‘ Если ячейка имеет заданный цвет, то она не включается _

             в вычисления

            If cell.Interior.Color <> lngColor Then

               intCount = intCount + 1

               Values(intCount) = cell.Value

            End If

         Else

            ‘ Если ячейка имеет заданный цвет, то она включается _

             в вычисления

            If cell.Interior.Color = lngColor Then

               intCount = intCount + 1

               Values(intCount) = cell.Value

            End If

         End If

         ‘ В противном случае — суммируется по шрифту

      Else

         ‘ Включение ячейки в сумму в зависимости _

          от ее цвета и фильтра

         If fAbsence Then

            ‘ Если ячейка имеет заданный цвет, то она не включается _

             в вычисления

            If cell.Font.Color <> lngColor Then

               intCount = intCount + 1

               Values(intCount) = cell.Value

            End If

         Else

            ‘ Если ячейка имеет заданный цвет, то она включается _

             в вычисления

            If cell.Font.Color = lngColor Then

               intCount = intCount + 1

               Values(intCount) = cell.Value

            End If

         End If

      End If

   Next cell

   ‘ Выполнение над собранными значениями операции, заданной в intMode

   For i = 1 To intCount

      Select Case intMode

         Case dhcSum, dhcAvg

            ‘ Подсчет суммы значений

            varOut = varOut + Values(i)

         Case dhcSumPlus

            ‘ Подсчет суммы положительных значений

            If Values(i) > 0 Then varOut = varOut + Values(i)

         Case dhcSumMinus

            ‘ Посчет суммы отрицательных значений

            If Values(i) < 0 Then varOut = varOut + Values(i)

         Case dhcMax

            ‘ Нахождение максимального значения

            If Values(i) > varOut Then varOut = Values(i)

         Case dhcMin

            ‘ Нахождение минимального значения

            If i = LBound(Values) Then varOut = Values(i)

            If Values(i) < varOut Then varOut = Values(i)

         Case dhcCount

            ‘ Подсчет количества значений

            varOut = varOut + 1

         Case dhcCountFull

            ‘ Подсчет количества заполненных ячеек

            If Not IsEmpty(Values(i)) Then varOut = varOut + 1

         Case dhcCountNotNull

            ‘ Подсчет количества пустых ячеек

            If Not IsEmpty(Values(i)) And Values(i) <> 0 Then _

             varOut = varOut + 1

         Case dhcCountPlus

            ‘ Подсчет количества положительных значений

            If Values(i) > 0 Then varOut = varOut + 1

         Case dhcCountMinus

            ‘ Подсчет количества отрицательных значений

            If Values(i) < 0 Then varOut = varOut + 1

      End Select

   Next i

   ‘ Окончательные операции для некоторых видов расчета

   If intMode = dhcAvg Then

      ‘ Вычисление среднего значения

      ColorCalc = varOut / intCount

   Else

      ColorCalc = varOut

   End If

End Function

Листинг 6.6. Код в модуле формы

Dim lngCurColor As **** ‘ Выбранный цвет, по которому _

                         идентифицировать (отбирать) ячейки

Dim intMode As Integer  ‘ Номер типа вычисления в списке

Sub cmbApplyColor_Click()

   If cboOtherColor.Value >= 0 Then

      ‘ Вычисление с использованием выбранного в списке цвета

      lngCurColor = cboOtherColor.Value

      SetColorSum

   End If

End Sub

Sub cmbColor1_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor1.BackColor

   SetColorSum

End Sub

Sub cmbColor2_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor2.BackColor

   SetColorSum

End Sub

Sub cmbColor3_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor3.BackColor

   SetColorSum

End Sub

Sub cmbColor4_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor4.BackColor

   SetColorSum

End Sub

Sub cmbColor5_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor5.BackColor

   SetColorSum

End Sub

Sub cmbColor6_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor6.BackColor

   SetColorSum

End Sub

Sub cmbColor7_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor7.BackColor

   SetColorSum

End Sub

Sub cmbColor8_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor8.BackColor

   SetColorSum

End Sub

Sub cmbColor9_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor9.BackColor

   SetColorSum

End Sub

Sub cmbColor10_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor10.BackColor

   SetColorSum

End Sub

Sub cmbColor11_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor11.BackColor

   SetColorSum

End Sub

Sub cmbColor12_Click()

   ‘ Вычисление с использованием цвета нажатой кнопки

   lngCurColor = cmbColor12.BackColor

   SetColorSum

End Sub

Sub SetColorSum()

   ‘ Вычисление с использованием заданного цвета

   Dim strFormula As String

   ‘ Проверка правильности введенных диапазонов и номеров ячеек

   If txtResCell.Value = «» Then

      MsgBox «Введите адрес ячейки вставки функции», _

       vbCritical, «Внимание!»

      txtResCell.SetFocus

      Exit Sub

   ElseIf txtRange.Value = «» Then

      MsgBox «Введите адрес диапазона суммирования», _

       vbCritical, «Внимание!»

      txtRange.SetFocus

      Exit Sub

   End If

   ‘ Формирование формулы

   strFormula = «=ColorCalc(» & «»»» & txtRange.Value & «»»» _

    & «,» & lngCurColor & «,» & CInt(tglType.Value) & «,» _

    & intMode & «,» & CInt(chkVarify.Value) & «)»

   ‘ Запись формулы в ячейку

   Range(txtResCell.Value).Formula = strFormula

End Sub

Sub cmbExit_Click()

   ‘ Закрытие формы

   Unload Me

End Sub

Sub cboCalcTypes_Afterupdаtе()

   ‘ Изменение режима вычисления — сохраним в переменной _

    номер вычисления

   intMode = cboCalcTypes.ListIndex

End Sub

Sub cboOtherColor_Change()

   ‘ Изменение выделенного цвета в списке «Другой»

   If cboOtherColor.Text <> «» Then

      ‘ Сохранение выбранного цвета в переменной

      lngCurColor = Val(cboOtherColor.Value)

   End If

End Sub

Sub tglType_Click()

   ‘ Изменение типа идентификации ячеек

   If tglType.Value = -1 Then

      ‘ Идентификация по цвету заливки

      tglType.Caption = «Заливка»

   Else

      ‘ Идентификация по цвету шрифта

      tglType.Caption = «Шрифт»

   End If

   GetColors

End Sub

Sub txtRange_Afterupdаtе()

   ‘ Изменение диапазона с исходными данными — покажем _

    кнопки с цветами, представленными в новом диапазоне

   GetColors

End Sub

Sub txtRange_Beforeupdаtе(ByVal Cancel As MSForms.ReturnBoolean)

   ‘ Проверка корректности данных, введенных в поле _

    диапазона исходных данных

   Dim rgData As Range

   Dim cell As Range

   ‘ Проверка, введен ли диапазон данных

   If txtRange.Text = «» Then

      MsgBox «Введите адрес диапазона суммирования!», _

       vbCritical, «Ошибка выполнения»

      Cancel = True

   End If

   If txtResCell.Text = «» Then Exit Sub

   On Error GoTo Err1

   ‘ Проверка отсутствия циклических ссылок (чтобы одна _

    из входных ячеек не была одновременно и выходной)

   Set rgData = Range(txtRange.Text)

   For Each cell In rgData.Cells

      If cell.Address(False, False) = _

       Range(txtResCell.Text).Address(False, False) Then

         ‘ Нашли циклическую ссылку

         MsgBox «Введите другой адрес во избежание » & _

          «появления циклических ссылок», vbCritical, _

          «Внимание!»

         Cancel = True

         Exit Sub

      End If

   Next cell

   Exit Sub

Err1:

   ‘ Обработка ошибок при работе с ячейками

   If Err.Number = 1004 Then

      MsgBox «Введите корректный адрес ячейки», vbCritical, _

       «Ошибка ввода»

      Cancel = True

      Exit Sub

   Else

      MsgBox Err.Desсriрtion, vbCritical, «Ошибка ввода»

      Cancel = True

      Exit Sub

   End If

End Sub

Sub txtResCell_Beforeupdаtе(ByVal Cancel As MSForms.ReturnBoolean)

   ‘ Проверка корректности данных, введенных в поле _

    адреса выходной ячейки

   Dim rgData As Range

   Dim cell As Range

   ‘ Проверка, введен ли диапазон данных

   If txtRange.Text = «» Then

      MsgBox «Введите адрес диапазона суммирования!», _

       vbCritical, «Ошибка выполнения»

      Cancel = True

   End If

   If txtResCell.Text = «» Then Exit Sub

   On Error GoTo Err1

   ‘ Проверка отсутствия циклических ссылок (чтобы одна _

    из входных ячеек не была одновременно и выходной)

   Set rgData = Range(txtRange.Text)

   For Each cell In rgData.Cells

      If cell.Address(False, False) = _

       Range(txtResCell.Text).Address(False, False) Then

         ‘ Нашли циклическую ссылку

         MsgBox «Введите другой адрес во избежание » & _

          «появления циклических ссылок», vbCritical, _

          «Внимание!»

         Cancel = True

         Exit Sub

      End If

   Next cell

   Exit Sub

Err1:

   ‘ Обработка ошибок при работе с ячейками

   If Err.Number = 1004 Then

      MsgBox «Введите корректный адрес ячейки», vbCritical, _

       «Ошибка ввода»

      Cancel = True

      Exit Sub

   Else

      MsgBox Err.Desсriрtion, vbCritical, «Ошибка ввода»

      Cancel = True

      Exit Sub

   End If

End Sub

Sub UserForm_Activate()

   ‘ Инициализация формы при активации

   Dim intFunc As Integer

   Dim strFunc As String

   ‘ Заполение списка доступных операций

   cboCalcTypes.AddItem «0»

   cboCalcTypes.List(0, 1) = «Сумма»

   cboCalcTypes.AddItem «1»

   cboCalcTypes.List(1, 1) = «Среднее»

   cboCalcTypes.AddItem «2»

   cboCalcTypes.List(2, 1) = «Максимум»

   cboCalcTypes.AddItem «3»

   cboCalcTypes.List(3, 1) = «Минимум»

   cboCalcTypes.AddItem «4»

   cboCalcTypes.List(4, 1) = «Количество ячеек»

   cboCalcTypes.AddItem «5»

   cboCalcTypes.List(5, 1) = «Сумма положительных»

   cboCalcTypes.AddItem «6»

   cboCalcTypes.List(6, 1) = «Сумма отрицательных»

   cboCalcTypes.AddItem «7»

   cboCalcTypes.List(7, 1) = «Количество непустых»

   cboCalcTypes.AddItem «8»

   cboCalcTypes.List(8, 1) = «Количество непустых ненулевых»

   cboCalcTypes.AddItem «9»

   cboCalcTypes.List(9, 1) = «Количество положительных»

   cboCalcTypes.AddItem «10»

   cboCalcTypes.List(10, 1) = «Количество отрицательных»

   ‘ Заполнение списка дополнительных цветов

   cboOtherColor.AddItem «255»

   cboOtherColor.List(0, 1) = «Красный»

   cboOtherColor.AddItem «52479»

   cboOtherColor.List(1, 1) = «Оранжевый»

   cboOtherColor.AddItem «65535»

   cboOtherColor.List(2, 1) = «Желтый»

   cboOtherColor.AddItem «32768»

   cboOtherColor.List(3, 1) = «Зеленый»

   cboOtherColor.AddItem «16776960»

   cboOtherColor.List(4, 1) = «Голубой»

   cboOtherColor.AddItem «16711680»

   cboOtherColor.List(5, 1) = «Синий»

   cboOtherColor.AddItem «16711935»

   cboOtherColor.List(6, 1) = «Фиолетовый»

   cboOtherColor.AddItem «16777215»

   cboOtherColor.List(7, 1) = «Белый»

   cboOtherColor.AddItem «0»

   cboOtherColor.List(8, 1) = «Черный»

   If Selection.Cells.Count = 1 Then

      ‘ На листе есть выделенная ячейка. Определим, есть ли в этой _

       ячейке формула с функцией ColorCalc

      intFunc = InStr(Selection.Formula, «ColorCalc(«)

      If intFunc > 0 Then

         ‘ Формула есть, заполним поля формы для вычислений

         ‘ Адрес ячейки с результатом

         txtResCell.Text = Selection.Address(False, False)

         ‘ Выделяем аргументы функции…

         ‘ Номера ячеек с исходными данными

         strFunc = Mid(Selection.Formula, intFunc + 11)

         intFunc = InStr(strFunc, «»»»)

         txtRange.Text = Left(strFunc, intFunc — 1)

         ‘ Тип идентификации ячеек (по шрифту или цвету)

         strFunc = Mid(strFunc, intFunc + 2)

         intFunc = InStr(strFunc, «,»)

         strFunc = Mid(strFunc, intFunc + 1)

         intFunc = InStr(strFunc, «,»)

         tglType.Value = Left(strFunc, intFunc — 1)

         ‘ Режим вычислений

         strFunc = Mid(strFunc, intFunc + 1)

         strFunc = Left(strFunc, Len(strFunc) — 1)

         intFunc = InStr(strFunc, «,»)

         cboCalcTypes.Text = cboCalcTypes.List(Val(Left$( _

          strFunc, intFunc — 1)), 1)

         strFunc = Mid(strFunc, intFunc + 1)

         chkVarify.SetFocus

         chkVarify.Value = CBool(strFunc)

         lblChoose.Visible = True

         GetColors

      Else

         ‘ Будем применять формулу для выделенной ячейки

         txtRange.Value = Selection.Address(False, False)

         ‘ В выделенной ячейке конкретная функция не задана. _

          Выберем первую функцию в списке

         cboCalcTypes.Text = «Сумма»

      End If

   Else

      ‘ Будем применять формулу для выделенной ячейки

      txtRange.Value = Selection.Address(False, False)

      ‘ В выделенной ячейке конкретная функция не задана. _

       Выберем первую функцию в списке

      cboCalcTypes.Text = «Сумма»

   End If

End Sub

Sub GetColors()

   ‘ Отображение кнопок выбора цвета окрашенными в цвета, _

    встречающиеся среди ячеек заданного диапазона

   Dim rgCells As Range

   Dim i As Integer

   Dim intColorNumber As Integer   ‘ Номер следующей кнопки _

                                    выбора цвета

   Dim lngCurColor As ****         ‘ Анализируемый цвет

   Dim fColorPresented As Boolean  ‘ Кнопка с цветом _

                                    lngCurColor уже существует

   Dim ctrl As Control

   Dim strCtrl As String

   Dim fBackColor As Boolean       ‘ = True, если ячейки _

                                    идентифицируются по цвету фона, _

                                    = False — по цвету шрифта

   fBackColor = tglType.Value

   On Error Resume Next

   ‘ Скрытие всех кнопок выбора цвета

   For Each ctrl In Me.Controls

      If Left(ctrl.Name, 8) = «cmbColor» Then

         ctrl.Visible = False

      End If

   Next ctrl

   On Error GoTo ErrRange

   Set rgCells = Range(txtRange.Text)

   On Error GoTo 0

   ‘ Получение цвета первой ячейки

   If fBackColor = False Then

      lngCurColor = rgCells.Cells(i).Font.Color

   Else

      lngCurColor = rgCells.Cells(i).Interior.Color

   End If

   ‘ Назначения цвета первой ячейки первой кнопке

   cmbColor1.BackColor = lngCurColor

   cmbColor1.Visible = True

   ‘ Просмотр остальных ячеек и при нахождении новых цветов _

    отображение кнопок, окрашенных в эти цвета

   intColorNumber = 2

   For i = 2 To rgCells.Cells.Count

      fColorPresented = False

      ‘ Получение цвета i-й ячейки

      If fBackColor = False Then

         lngCurColor = rgCells.Cells(i).Font.Color

      Else

         lngCurColor = rgCells.Cells(i).Interior.Color

      End If

      ‘ Проверка, отображается ли уже кнопка с таким цветом

      For Each ctrl In Me.Controls

         If Left(ctrl.Name, 8) = «cmbColor» And _

          ctrl.Visible = True Then

            If lngCurColor = ctrl.BackColor Then

               ‘ Кнопка с цветом i-й ячейки уже отображается

               fColorPresented = True

               Exit For

            End If

         End If

      Next ctrl

      If Not fColorPresented Then

         ‘ Кнопки с цветом lngCurColor еще нет — покажем ее

         intColorNumber = intColorNumber + 1

         strCtrl = «cmbColor» & intColorNumber

         Me.Controls(strCtrl).BackColor = lngCurColor

         Me.Controls(strCtrl).Visible = True

      End If

   Next i

   Exit Sub

ErrRange:

   ‘ Обработка ошибок при работе с диапазоном

   If txtRange.Text = «» Then

      MsgBox «Введите адрес диапазона суммирования», _

       vbCritical, «Внимание!»

   Else

      MsgBox «Введен некорректный адрес диапазона суммирования», _

       vbCritical, «Ошибка!»

   End If

   ‘ Установка курсора в поле ввода диапазона

   txtRange.SetFocus

End Sub

ГЛАВА 11. ДРУГИЕ ФУНКЦИИ И МАКРОСЫ

Вызов функциональных клавиш

Sub Test()

 SendKeys («{F1}»)

End Sub

Расчет среднего арифметического значения

Sub CalculateAverage()

   Dim strFistCell As String

   Dim strLastCell As String

   Dim strFormula As String

   ‘ Условия закрытия процедуры

   If ActiveCell.Row = 1 Then Exit Sub

   ‘ Определение положения первой и последней ячеек для расчета

   strFistCell = ActiveCell.Offset(-1, 0).End(xlUp).Address

   strLastCell = ActiveCell.Offset(-1, 0).Address

   ‘ Формула для расчета среднего значения

   strFormula = «=AVERAGE(» & strFistCell & «:» & strLastCell & «)»

   ‘ Ввод формулы в текущую ячейку

   ActiveCell.Formula = strFormula

End Sub

Перевод чисел в «деньги»

Листинг 2.50. Функция RubKop

Function RubKop(Число)

   ‘ Пустые ячейки и ячейки, содержащие текст, функция _

    не обрабатывает

   If IsNumeric(Число) = False Or Число = «» Then RubKop = _

    «<>»: Exit Function

   ‘ Из числа целой части — рубли

   ДлинаЧисла = Len(Число)

   ЦелаяЧасть = Fix(Число)

   ДлинаЦелой = Len(ЦелаяЧасть)

   ‘ Вычисление длины дробной части

   ДлинаДроби = ДлинаЧисла — ДлинаЦелой

   If ДлинаДроби <> 0 Then

      ДлинаДроби = ДлинаЧисла — ДлинаЦелой — 1

   End If

   ‘ Формирование количества копеек в зависимости от длины _

    дробной части

   If ДлинаДроби = 0 Then

      ‘ Ноль копеек

      Копейки = «00»

   ElseIf ДлинаДроби = 1 Then

      ‘ Дробная часть состоит из одного числа — это _

       десятки копеек

      Копейки = Right(Число, ДлинаДроби) & «0»

   ElseIf ДлинаДроби = 2 Then

      ‘ Дробная часть полностью соответствует количеству копеек

      Копейки = Right(Число, ДлинаДроби)

   Else

      ‘ Длина дробной части больше двух — округлим _

       дробную часть

      Копейки = Right(Число, ДлинаДроби)

      If Mid(Копейки, 3, 1) > 4 Then

         Копейки = Left(Копейки, 2) + 1

      Else

         Копейки = Left(Копейки, 2)

      End If

   End If

   ‘ Составление полной надписи из количества рублей и копеек

   Рубли = ЦелаяЧасть

   RubKop = Рубли & » » & «руб.» & » » & Копейки & » » & «коп.»

End Function

Поиск ближайшего понедельника

Листинг 2.60. Ближайший день недели по отношению к дате

Function dhGetNextMonday(datDate As Date) As Date

   ‘ Определение даты следующего понедельника (функция Weekday _

    возвращает номер дня недели, считая от понедельника, если _

    в качестве второго аргумента задавать vbMonday)

   If Weekday(datDate, vbMonday) = 1 Then

      ‘ Заданная дата и есть понедельник

      dhGetNextMonday = datDate

   Else

      ‘ Расчет даты следующего понедельника

      dhGetNextMonday = datDate + 8 — Weekday(datDate, vbMonday)

   End If

End Function

Подсчет количества полных лет

Листинг 2.61. Функция dhCalculateAge

Function dhCalculateAge(datDate As Date) As ****

   Dim lngAge As ****

   ‘ Находим разность между текущей датой и указанной (лет)

   lngAge = DateDiff(«yyyy», datDate, Date)

   If DateSerial(Year(datDate) + lngAge, Month(datDate), _

    Day(datDate)) > Date Then

      ‘ В этом году день рождения еще не наступил

      lngAge = lngAge — 1

   End If

   dhCalculateAge = lngAge

End Function

Расчет средневзвешенного значения

Листинг 2.63. Расчет средневзвешенного значения

Function dhAverageWithWeight(rgWeights As Range, rgValues As Range) _

 As Double

   If (rgWeights.Count <> rgValues.Count) Then

      ‘ Количество весов не соответствует количеству аргументов

      dhAverageWithWeight = 0

      Exit Function

   End If

   Dim i As Integer

   Dim dblSum As Double        ‘ Сумма значений

   Dim dblSumWeight As Double  ‘ Взвешенная сумма значений

   ‘ Вычисление…

   For i = 1 To rgWeights.Count

      ‘ Взвешенной суммы значений

      dblSumWeight = dblSumWeight + rgWeights(i) * rgValues(i)

      ‘ Суммы значений

      dblSum = dblSum + rgWeights(i)

   Next

   ‘ Возвращение средневзвешенного значения

   dhAverageWithWeight = dblSumWeight / dblSum

End Function

Преобразование номера месяца в его название

Листинг 2.64. Название месяца

Function dhMonthName(intMonth As Integer) As String

   ‘ Возвращение имени месяца по его номеру (intMonth _

    является номером элемента в массиве с названиями месяцев)

   dhMonthName = Choose(intMonth, «Январь», «Февраль», «Март», _

    «Апрель», «Май», «Июнь», «Июль», «Август», «Сентябрь», _

    «Октябрь», «Ноябрь», «Декабрь»)

End Function

Использование относительных ссылок

Листинг 2.73. Функция dhSheetOffset

Function dhSheetOffset(offset As Integer, cell As Range) As Variant

   ‘ Возврат корректного значения ячейки cell листа, смещение _

    которого относительно текущего задано переменной offset

   dhSheetOffset = Sheets(Application.Caller.Parent.Index _

    + offset).Range(cell.Address)

End Function

Листинг 2.74. Функция dhSheetOffset2

Function dhSheetOffset2(offset As Integer, cell As Range) As Variant

   ‘ Корректировка смещения (чтобы ссылка была на рабочий лист)

   Do While TypeName(Sheets(cell.Parent.Index + offset)) _

    <> «Worksheet»

      If offset > 0 Then

         ‘ Пропускаем лист и проходим вперед по книге

         offset = offset + 1

      Else

         ‘ Пропускаем лист и проходим назад по книге

         offset = offset — 1

      End If

   Loop

   ‘ Возврат корректного значения ячейки cell листа, смещение _

    которого относительно текущего задано переменной offset _

    с пропуском листов с диаграммами

   dhSheetOffset2 = Sheets(cell.Parent.Index _

    + offset).Range(cell.Address)

End Function

Преобразование таблицы Excel в HТМL-формат

Листинг 3.60. Преобразование таблицы в HТМL-формат

Sub ExportAsHТМL()

   Dim strStyle As String     ‘ Параметры стиля отображения ячейки

   Dim strAlign As String     ‘ Параметры выравнивания ячейки

   Dim strOut As String       ‘ Выходная строка с HТМL-кодом

   Dim cell As Object         ‘ Обрабатываемая ячейка

   Dim strCellText As String  ‘ Текст обрабатываемой ячейки

   Dim lngRow As ****         ‘ Номер строки обрабатываемой ячейки

   Dim lngLastRow As ****     ‘ Номер строки предыдущей ячейки

   Dim strTemp As String

   Dim objWordApp As Object

   Dim i As ****

   lngLastRow = Selection.Row

   ‘ Просмотр всех выделенных ячеек

    For Each cell In Selection

      ‘ Значение строки для рассматриваемой ячейки

      lngRow = cell.Row

      ‘ Если перешли на другую строку, то вставляем <tr>

      If lngRow <> lngLastRow Then

         strOut = strOut & vbTab & «</tr>» & vbCrLf & vbTab & _

          «<tr>» & vbCrLf

         ‘ Переход на следующую строку

         lngLastRow = lngRow

      End If

      ‘ Задание шрифта ячейки

      If Not IsNull(cell.Font.Size) Then

         strStyle = » style=» & «font-size: » & Int(100 * _

          cell.Font.Size / 19) & «%;»

      End If

      ‘ Для полужирного шрифта вставляем <b>

      If cell.Font.Bold Then

         strCellText = «<b>» & strCellText & «</b>»

      End If

      ‘ Задание выравнивания

      If cell.HorizontalAlignment = xlRight Then

         ‘ По правому краю

         strAlign = » align=» & «right»

      ElseIf cell.HorizontalAlignment = xlCenter Then

         ‘ По центру

         strAlign = » align=» & «center»

      Else

         ‘ По левому краю (по умолчанию)

         strAlign = «»

      End If

      ‘ Чтение текста в ячейке

      strCellText = cell.Text

      ‘ Если нужно, то вертикальный вывод текста (в строку strTemp _

       с последующим перенесением обратно в strCellText)

      If cell.Orientation <> xlHorizontal Then

         strTemp = «»

         ‘ Печать после каждого символа специального _

          разделителя — <br>

         For i = 1 To Len(strCellText)

            strTemp = strTemp & Mid$(strCellText, i, 1) & «<br>»

         Next i

         strCellText = strTemp

         strStyle = «»

      End If

      strOut = strOut & vbTab & vbTab & «<td» & strStyle & strAlign _

       & «>» & strCellText & «</td>» & vbCrLf

   Next

   ‘ Вставка <tr> для первой строки и </tr> — для последней

   strOut = vbTab & «<tr>» & vbCrLf & strOut & vbTab & «</tr>» & vbCrLf

   ‘ Вставка дескриптора <table>

   strOut = «<table border=1 cellpadding=3 cellspacing=1>» & vbCrLf & _

    strOut & vbCrLf & «</table>»

   ‘ Запускаем Word и показываем в нем сформированный HТМL-код

   Set objWordApp = CreateObject(«Word.Application»)

   objWordApp.documents.Add

   objWordApp.Selection = strOut

   objWordApp.Selection.Copy

   objWordApp.Visible = True

   Set objWordApp = Nothing

End Sub

Генератор случайных чисел

Листинг 2.77. Функция dhGetRandomValues

Function dhGetRandomValues() As Variant

   Dim intRow As Integer       ‘ Номер текущей строки

   Dim intCol As Integer       ‘ Номер текущего столбца

   Dim aintOut() As Integer    ‘ Выходной массив (двумерный)

   Dim aintValues() As Integer ‘ Массив с возможными значениями

   Dim intMax As Integer       ‘ Последний доступный элемент массива _

                                aintValues

   Dim i As Integer

   ReDim aintOut(1 To Application.Caller.Rows.Count, 1 To _

    Application.Caller.Columns.Count)

   ‘ Всего нужно чисел…

   intMax = Application.Caller.Rows.Count * _

    Application.Caller.Columns.Count

   ReDim aintValues(1 To intMax)

   ‘ Заполнение массива aintValues значениями от 1 до intMax

   For i = 1 To intMax

      aintValues(i) = i

   Next i

   ‘ Занесение значений в выходной массив aintOut, в произвольном _

    порядке выбирая их из aintValues

   Randomize

   For intRow = 1 To Application.Caller.Rows.Count

      For intCol = 1 To Application.Caller.Columns.Count

         ‘ Определение номера элемента из aintValues

         i = Rnd * intMax

         If i = 0 Then i = 1

         ‘ Занесение этого элемента в выходной массив

         aintOut(intRow, intCol) = aintValues(i)

         ‘ Уменьшение массива aintValues (то есть еще один его _

          элемент выбран) — замена выбранного элемента последним _

          в массиве

         aintValues(i) = aintValues(intMax)

         intMax = intMax — 1

      Next intCol

   Next intRow

   ‘ Возвращение массива значений

   dhGetRandomValues = aintOut

End Function

Случайные числа — на основании диапазона

Листинг 2.78. Функция dhGetRandomValues1

Function dhGetRandomValues1(rgSource As Range) As Variant

   Dim intRow As Integer       ‘ Номер текущей строки

   Dim intCol As Integer       ‘ Номер текущего столбца

   Dim avarOut() As Variant    ‘ Выходной массив (двумерный)

   Dim avarValues() As Variant ‘ Массив с возможными значениями

   Dim intValCount As Integer  ‘ Количество возможных значений

   Dim cell As Range

   Dim i As Integer

   ReDim avarOut(1 To Application.Caller.Rows.Count, 1 To _

    Application.Caller.Columns.Count)

   ‘ Всего нужно чисел…

   intValCount = rgSource.Rows.Count * rgSource.Columns.Count

   ReDim avarValues(1 To intValCount)

   ‘ Заполнение массива avarValues значениями из указанного _

    диапазона

   For Each cell In rgSource

      i = i + 1

      avarValues(i) = cell.Value

   Next cell

   ‘ Занесение значений в выходной массив avarOut, в произвольном _

    порядке выбирая их из avarValues

   Randomize

   For intRow = 1 To Application.Caller.Rows.Count

      For intCol = 1 To Application.Caller.Columns.Count

         ‘ Определение номера элемента из avarValues

         i = Rnd * intValCount

         If i = 0 Then i = 1

         ‘ Занесение этого элемента в выходной массив

         avarOut(intRow, intCol) = avarValues(i)

      Next intCol

   Next intRow

   ‘ Возвращение массива значений

   dhGetRandomValues1 = avarOut

End Function

Применение функции без ввода ее в ячейку

Листинг 3.14. Применение функции без ввода в ячейку

Sub Func()

   [A1] = Application.Sum([B5:B10])

End Sub

Подсчет именованных объектов

Листинг 3.29. Количество именованных объектов

Sub CountNames()

   Dim intNamesCount As Integer

   ‘ Получаем и отображаем количество имен в активной _

    рабочей книге

   intNamesCount = ActiveWorkbook.Names.Count

   If intNamesCount = 0 Then

      MsgBox «Имен нет»

   Else

      MsgBox «Имен: » & intNamesCount & » шт.»

   End If

End Sub

Включение автофильтра с помощью макроса

Листинг 3.63. Включение автофильтра

Sub EnableAutoFilter()

   On Error Resume Next

   Selection.AutoFilter

End Sub

Создание бегущей строки

Листинг 3.76. Создание бегущей строки

Dim intSpacesLeft As Integer  ‘ Количество пробелов в начале строки

Sub Start()

   ‘ Установка начального количества пробелов

   intSpacesLeft = 10

   ‘ Первый вызов функции бегущей строки

   MovingString

End Sub

Sub MovingString()

   If intSpacesLeft >= 0 Then

      ‘ Отображение строки

      Range(«A1»).Value = Space(intSpacesLeft) & «Привет!»

      intSpacesLeft = intSpacesLeft — 1

      ‘ Указывем Excel, что данную процедуру нужно вызвать через _

       1 секунду

      Application.OnTime Now + TimeValue(«00:00:01»), «MovingString»

   End If

End Sub

Создание бегущей картинки

Листинг 3.77. Бегущая картинка

Sub MovingImage()

   Dim i As Integer

   Dim image As Object

   ‘ Создание изображения (в ячейке «A1»)

   With Range(«A1»)

      ‘ Формирование значения в ячейке:

      ‘ текст

      .Value = «Привет!»

      ‘ полужирный шрифт

      .Font.Bold = True

      ‘ цвет

      .Font.Color = RGB(233, 133, 229)

      ‘ размер шрифта

      .Font.Size = 16

      ‘ угол наклона

      .Orientation = 30

      ‘ Отображение текста полностью

      .EntireColumn.AutoFit

      ‘ Копирование в буфер обмена

      .Copy

      ‘ Создание самостоятельного изображения (на основе _

       скопированных в буфер обмена данных)

      Set image = ActiveSheet.Pictures.Paste(Link:=False)

      ‘ Содержимое ячейки больше не нужно

      .Clear

   End With

   ‘ Задание начального положения изображения (левый верхний _

    угол листа)

   With image

      .Top = 0

      .Left = 0

   End With

   MsgBox «ПУСК!»

   With image

      ‘ Перемещение изображения по диагонали

      For i = 0 To 100

         .Top = i

         .Left = i

      Next

      ‘ Удаление изображения

      .Delete

   End With

   ‘ Удаление ссылки на изображение

   Set image = Nothing

End Sub

Вращающиеся автофигуры

Листинг 3.79. Вращение автофигур

Sub RotatingAutoShapes()

   Static fRunning As Boolean

   ‘ Проверка, выполняется ли уже этот макрос

   If fRunning Then

      ‘ При повторном запуске останавливаем все запущенные макросы

      fRunning = False

      End

   End If

   ‘ Укажем, что макрос запущен

   fRunning = True

   Dim cell As Range                  ‘ Рабочая ячейка

   Dim intLeftBorder As ****          ‘ Левая граница ячейки

   Dim intRightBorder As ****         ‘ Правая граница ячейки

   Dim intTopBorder As ****           ‘ Верхняя граница ячейки

   Dim intBottomBorder As ****        ‘ Нижняя граница ячейки

   Dim alngVertSpeed(1 To 2) As ****  ‘ Массивы со значениями

   Dim alngHorzSpeed(1 To 2) As ****  ‘ горизонтальной и вертикальной

                                      ‘ составляющих скоростей фигур

   Dim ashShapes(1 To 2) As Shape     ‘ Массив перемещаемых автофигур

   Dim i As Integer

   ‘ Заполнение массива автофигур

   Set ashShapes(1) = ActiveSheet.shapes(1)

   Set ashShapes(2) = ActiveSheet.shapes(2)

   ‘ Заполнение массива скоростей:

   ‘ для первой фигуры

   alngVertSpeed(1) = 3

   alngHorzSpeed(1) = 3

   ‘ для второй фигуры

   alngVertSpeed(2) = 4

   alngHorzSpeed(2) = 4

   ‘ Получение границ рабочей ячейки

   Set cell = Range(«B2»)

   intLeftBorder = cell.Left

   intRightBorder = cell.Left + cell.Width

   intTopBorder = cell.Top

   intBottomBorder = cell.Top + cell.Height

   ‘ Выполнение вращения и перемещения фигур

   Do

      ‘ Изменение положения каждой автофигуры

      For i = 1 To 2

         With ashShapes(i)

            ‘ Контроль достижения правой границы ячейки

            If .Left + .Width + alngHorzSpeed(i) > intRightBorder Then

               ‘ Корректировка положения

               .Left = intRightBorder — .Width

               ‘ Изменение направления горизонтальной скорости _

                на противоположное

               alngHorzSpeed(i) = -alngHorzSpeed(i)

            End If

            ‘ Контроль достижения левой границы ячейки

            If .Left + alngHorzSpeed(i) < intLeftBorder Then

               ‘ Корректировка положения

               .Left = intLeftBorder

               ‘ Изменение направления горизонтальной скорости _

                на противоположное

               alngHorzSpeed(i) = -alngHorzSpeed(i)

            End If

            ‘ Контроль достижения нижней границы ячейки

            If .Top + .Height + alngVertSpeed(i) > intBottomBorder Then

               ‘ Корректировка положения

               .Top = intBottomBorder — .Height

               ‘ Изменение направления вертикальной скорости _

                на противоположное

               alngVertSpeed(i) = -alngVertSpeed(i)

            End If

            ‘ Контроль достижения верхней границы ячейки

            If .Top + alngVertSpeed(i) < intTopBorder Then

               ‘ Корректировка положения

               .Top = intTopBorder

               ‘ Изменение направления вертикальной скорости _

                на противоположное

               alngVertSpeed(i) = -alngVertSpeed(i)

            End If

            ‘ Перемещение автофигуры

            .Left = .Left + alngHorzSpeed(i)

            .Top = .Top + alngVertSpeed(i)

            ‘ Вращение автофигуры (изменение направления вращения _

             происходит каждый раз при изменении направления _

             вертикального перемещения)

            .IncrementRotation alngVertSpeed(i)

            ‘ Даем Excel команду обработать пользовательский ввод

            DoEvents

         End With

      Next

   Loop

End Sub

Вызов таблицы цветов

Листинг 3.80. Отображение таблицы цветов

Sub ShowColorTable()

   Dim intColor As Integer

   ‘ Формирование заголовка таблицы

   Range(«A1»).Value = «Цвет»

   Range(«B1»).Value = «Значение свойства ColorIndex»

   ‘ Вывод таблицы

   Range(«A2»).Select

   For intColor = 1 To 56

      ‘ Окрашиваем ячейку столбца «A» в текущий цвет

      With ActiveCell.Interior

         .ColorIndex = intColor

         .Pattern = xlSolid

         .PatternColorIndex = xlAutomatic

      End With

      ‘ В ячейку столбца «B» вносим индекс текущего цвета

      ActiveCell.Offset(0, 1).Value = intColor

      ‘ Переходим на следующую строку

      ActiveCell.Offset(1, 0).Activate

   Next

   ‘ Покажем ячейку «A1» (начало таблицы)

   Range(«A1»).Select

   ActiveWindow.ScrollRow = 1

End Sub

Создание калькулятора

Листинг 3.81. Создание калькулятора

Sub SimpleCalculator()

   Dim strExpr As String

   ‘ Ввод выражения

   strExpr = InputBox(«Что будем считать?»)

   ‘ Подсчет и вывод результата

   MsgBox strExpr & » = » & Application.Evaluate(strExpr)

End Sub

Склонение фамилии, имени и отчества

Листинг 3.85. Склонение ФИО

Public Sub PossessiveCase()

   ‘ Склоняем ФИО в родительный падеж

   Dim strName1 As String, strName2 As String, strName3 As String

   strName1 = dhGetName(ActiveCell, 1)  ‘ Выделяем имя

   strName2 = dhGetName(ActiveCell, 2)  ‘ Выделяем фамилию

   strName3 = dhGetName(ActiveCell, 3)  ‘ Выделяем отчество

   ‘ Если в ячейке менее трех слов — закрытие процедуры

   If strName1 = «» Or strName2 = «» Or strName3 = «» Then Exit Sub

   ‘ Склоняем

   Cells(ActiveCell.Row, ActiveCell.Column) = dhPossessive( _

    strName1, strName2, strName3)

End Sub

Public Sub DativeCase()

   ‘ Объявление переменных

   Dim strName1 As String, strName2 As String, strName3 As String

   strName1 = dhGetName(ActiveCell, 1)

   strName2 = dhGetName(ActiveCell, 2)

   strName3 = dhGetName(ActiveCell, 3)

   ‘ Если в ячейке менее трех слов — закрытие процедуры

   If Len(strName1) = 0 Or Len(strName2) = 0 Or Len(strName3) = 0 _

    Then Exit Sub

   Cells(ActiveCell.Row, ActiveCell.Column) = dhDative( _

    strName1, strName2, strName3)

End Sub

Function dhPossessive(strName1 As String, strName2 As String, _

 strName3 As String) As String

   Dim fMan As Boolean

   ‘ Определяем, мужские ФИО или женские

   fMan = (Right(strName3, 1) = «ч»)

   ‘ Склонение фамилии в родительный падеж

   If Len(strName1) > 0 Then

      If fMan Then

         ‘ Склонение мужской фамилии

         Select Case Right(strName1, 1)

            Case «о», «и», «я», «а»

               dhPossessive = strName1

            Case «й»

               dhPossessive = Mid(strName1, 1, Len(strName1) — 2) + «ого»

            Case Else

               dhPossessive = strName1 + «а»

         End Select

      Else

         ‘ Склонение женской фамилии

         Select Case Right(strName1, 1)

            Case «о», «и», «б», «в», «г», «д», «ж», «з», «к», «л», _

             «м», «н», «п», «р», «с», «т», «ф», «х», «ц», «ч», _

             «ш», «щ», «ь»

               dhPossessive = strName1

            Case «я»

               dhPossessive = Mid(strName1, 1, Len(strName1) — 2) & «ой»

            Case Else

               dhPossessive = Mid(strName1, 1, Len(strName1) — 1) & «ой»

         End Select

      End If

      dhPossessive = dhPossessive & » »

   End If

   ‘ Склонение имени в родительный падеж

   If Len(strName2) > 0 Then

      If fMan Then

         ‘ Склонение мужского имени

         Select Case Right(strName2, 1)

            Case «й», «ь»

               dhPossessive = dhPossessive & Mid(strName2, _

                1, Len(strName2) — 1) & «я»

            Case Else

               dhPossessive = dhPossessive & strName2 & «а»

         End Select

      Else

         ‘ Склонение женского имени

         Select Case Right(strName2, 1)

            Case «а»

               Select Case Mid(strName2, Len(strName2) — 1, 1)

                  Case «и», «г»

                     dhPossessive = dhPossessive & Mid( _

                      strName2, 1, Len(strName2) — 1) & «и»

                  Case Else

                     dhPossessive = dhPossessive & Mid(strName2, _

                      1, Len(strName2) — 1) & «ы»

               End Select

            Case «я»

               If Mid(strName2, Len(strName2) — 1, 1) = «и» Then

                  dhPossessive = dhPossessive & Mid(strName2, _

                   1, Len(strName2) — 1) & «и»

               Else

                  dhPossessive = dhPossessive & Mid(strName2, _

                   1, Len(strName2) — 1) & «и»

               End If

            Case «ь»

               dhPossessive = dhPossessive & Mid(strName2, _

                1, Len(strName2) — 1) & «и»

            Case Else

               dhPossessive = dhPossessive & strName2

         End Select

      End If

      dhPossessive = dhPossessive & » »

   End If

   ‘ Склонение отчества в родительный падеж

   If Len(strName3) > 0 Then

      If fMan Then

         dhPossessive = dhPossessive & strName3 & «а»

      Else

         dhPossessive = dhPossessive & Mid(strName3, 1, _

          Len(strName3) — 1) & «ы»

      End If

   End If

End Function

Function dhDative(strName1 As String, strName2 As String, _

 strName3 As String) As String

   Dim fMan As Boolean

   ‘ Определяем, мужские ФИО или женские

   fMan = (Right(strName3, 1) = «ч»)

   ‘ Склонение фамилии в дательный падеж

   If Len(strName1) > 0 Then

      If fMan Then

         ‘ Склонение мужской фамилии

         Select Case Right(strName1, 1)

            Case «о», «и», «я», «а»

               dhDative = strName1

            Case «й»

               dhDative = Mid(strName1, 1, Len(strName1) — 2) + «ому»

            Case Else

               dhDative = strName1 + «у»

         End Select

      Else

         ‘ Склонение женской фамилии

         Select Case Right(strName1, 1)

            Case «о», «и», «б», «в», «г», «д», «ж», «з», «к», «л», _

             «м», «н», «п», «р», «с», «т», «ф», «х», «ц», «ч», «ш», _

             «щ», «ь»

               dhDative = strName1

            Case «я»

               dhDative = Mid(strName1, 1, Len(strName1) — 2) & «ой»

            Case Else

               dhDative = Mid(strName1, 1, Len(strName1) — 1) & «ой»

         End Select

      End If

      dhDative = dhDative & » »

   End If

   ‘ Склонение имени в дательный падеж

   If Len(strName2) > 0 Then

      If fMan Then

         ‘ Склонение мужского имени

         Select Case Right(strName2, 1)

            Case «й», «ь»

               dhDative = dhDative & Mid(strName2, 1, _

                Len(strName2) — 1) & «ю»

            Case Else

               dhDative = dhDative & strName2 & «у»

         End Select

      Else

         ‘ Склонение женского имени

         Select Case Right(strName2, 1)

            Case «а», «я»

               If Mid(strName2, Len(strName2) — 1, 1) = «и» Then

                  dhDative = dhDative & Mid(strName2, 1, _

                   Len(strName2) — 1) & «и»

               Else

                  dhDative = dhDative & Mid(strName2, 1, _

                   Len(strName2) — 1) & «е»

               End If

            Case «ь»

               dhDative = dhDative & Mid(strName2, 1, _

                Len(strName2) — 1) & «и»

            Case Else

               dhDative = dhDative & strName2

         End Select

      End If

      dhDative = dhDative & » »

   End If

   ‘ Склонение отчества в дательный падеж

   If Len(strName3) > 0 Then

      If fMan Then

         dhDative = dhDative & strName3 & «у»

      Else

         dhDative = dhDative & Mid(strName3, 1, Len(strName3) — 1) & «е»

      End If

   End If

End Function

Function dhGetName(strString As String, intNum As Integer)

   ‘ Функция возвращает слово с номером intNum во входной строке _

    strString

   Dim strTemp As String

   Dim intWord As Integer

   Dim intSpace As Integer

   ‘ Удаление пробелов по краям строки

   strTemp = Trim(strString)

   ‘ Просмотр строки (до слова с нужным номером)

   For intWord = 1 To intNum — 1

      ‘ Поиск следующего пробела

      intSpace = InStr(strTemp, » «)

      If intSpace = 0 Then

         ‘ Строка закончилась

         intSpace = Len(strTemp)

      End If

      ‘ Строка strTemp теперь начинается со слова с номером intWord

      strTemp = Trim(Right(strTemp, Len(strTemp) — intSpace))

   Next intWord

   ‘ Выделение нужного слова (по пробелу после него)

   intSpace = InStr(strTemp, » «)

   If intSpace = 0 Then

      intSpace = Len(strTemp)

   End If

   dhGetName = Trim(Left(strTemp, intSpace))

End Function

ГЛАВА 12. ДАТА И ВРЕМЯ

Вывод даты и времени_1

Sub Test()

 Dim MyDate As Date

 MyDate = DateValue(«6/1/72») + TimeValue(«10:10:12»)

 MsgBox Str(Minute(MyDate))

 MsgBox Str(Year(MyDate))

End Sub

Вывод даты и времени_2

Sub TimeAndDate()

   Dim strDate As String, strTime As String

   Dim strGreeting As String

   Dim strUserName As String

   Dim intSpacePos As Integer

   strDate = Format(Date, «**** Date»)

   strTime = Format(Time, «Medium Time»)

   ‘ Приветствие — в зависимости от времени суток

   If Time < TimeValue(«12:00») Then

      strGreeting = «Доброе утро, »

   ElseIf Time < TimeValue(«17:00») Then

      strGreeting = «Добрый день, »

   Else

      strGreeting = «Добрый вечер, »

   End If

   ‘ В приветствие добавляется имя текущего пользователя

   strUserName = Application.UserName

   intSpacePos = InStr(1, strUserName, » «, 1)

   ‘ Управление ситуацией, когда в имени нет пробела

   If intSpacePos = 0 Then intSpacePos = Len(strUserName)

   strGreeting = strGreeting & Left(strUserName, intSpacePos)

   ‘ Вывод на экран информационного сообщения о дате и времени

   MsgBox strDate & vbCrLf & strTime, vbOKOnly, strGreeting

End Sub

Получение системной даты

Извлечение даты и часов

Month(переменная типа Date)

Day(переменная типа Date)

Year(переменная типа Date)

Hour(переменная типа Date)

Minute(переменная типа Date)

Second(переменная типа Date)

WeekDay(переменная типа Date)

WeekDay это день недели, если Вам это нужно, то вы можете написать что-то типа этого.

Sub Test()

 Dim MyDate As Date

 MyDate = DateValue(«9/1/72»)

 If (WeekDay(MyDate) = vbSunday) Then MsgBox («Sunday»)

End Sub

vbSunday это константа , есть еще vbMonday , ну дальше понятно.

Функция ДатаПолная

Function ДатаПолная(Ячейка)

   ‘ Получение данных в заданной ячейке в формате _

    «dd mmmm yyyy»

   Дата = Format(Ячейка, «dd mmmm yyyy»)

   If IsDate(Ячейка) = True Or IsDate(Дата) = True Then

      ‘ Возврат строки с полной датой

      ДатаПолная = StrConv(Дата, vbProperCase)

   Else

      ‘ Данные в ячейке не являются датой

      ДатаПолная = «<>»

   End If

End Function

#Руководства

  • 23 май 2022

  • 0

Как с помощью макросов автоматизировать рутинные задачи в Excel? Какие команды они выполняют? Как создать макрос новичку? Разбираемся на примере.

Иллюстрация: Meery Mary для Skillbox Media

Ксеня Шестак

Рассказывает просто о сложных вещах из мира бизнеса и управления. До редактуры — пять лет в банке и три — в оценке имущества. Разбирается в Excel, финансах и корпоративной жизни.

Макрос (или макрокоманда) в Excel — алгоритм действий в программе, который объединён в одну команду. С помощью макроса можно выполнить несколько шагов в Excel, нажав на одну кнопку в меню или на сочетание клавиш.

Обычно макросы используют для автоматизации рутинной работы — вместо того чтобы выполнять десяток повторяющихся действий, пользователь записывает одну команду и затем запускает её, когда нужно совершить эти действия снова.

Например, если нужно добавить название компании в несколько десятков документов и отформатировать его вид под корпоративный дизайн, можно делать это в каждом документе отдельно, а можно записать ход действий при создании первого документа в макрос — и затем применить его ко всем остальным. Второй вариант будет гораздо проще и быстрее.

В статье разберёмся:

  • как работают макросы и как с их помощью избавиться от рутины в Excel;
  • какие способы создания макросов существуют и как подготовиться к их записи;
  • как записать и запустить макрос начинающим пользователям — на примере со скриншотами.

Общий принцип работы макросов такой:

  • Пользователь записывает последовательность действий, которые нужно выполнить в Excel, — о том, как это сделать, поговорим ниже.
  • Excel обрабатывает эти действия и создаёт для них одну общую команду. Получается макрос.
  • Пользователь запускает этот макрос, когда ему нужно выполнить эту же последовательность действий ещё раз. При записи макроса можно задать комбинацию клавиш или создать новую кнопку на главной панели Excel — если нажать на них, макрос запустится автоматически.

Макросы могут выполнять любые действия, которые в них запишет пользователь. Вот некоторые команды, которые они умеют делать в Excel:

  • Автоматизировать повторяющиеся процедуры.

    Например, если пользователю нужно каждый месяц собирать отчёты из нескольких файлов в один, а порядок действий каждый раз один и тот же, можно записать макрос и запускать его ежемесячно.

  • Объединять работу нескольких программ Microsoft Office.

    Например, с помощью одного макроса можно создать таблицу в Excel, вставить и сохранить её в документе Word и затем отправить в письме по Outlook.

  • Искать ячейки с данными и переносить их в другие файлы.

    Этот макрос пригодится, когда нужно найти информацию в нескольких объёмных документах. Макрос самостоятельно отыщет её и принесёт в заданный файл за несколько секунд.

  • Форматировать таблицы и заполнять их текстом.

    Например, если нужно привести несколько таблиц к одному виду и дополнить их новыми данными, можно записать макрос при форматировании первой таблицы и потом применить его ко всем остальным.

  • Создавать шаблоны для ввода данных.

    Команда подойдёт, когда, например, нужно создать анкету для сбора данных от сотрудников. С помощью макроса можно сформировать такой шаблон и разослать его по корпоративной почте.

  • Создавать новые функции Excel.

    Если пользователю понадобятся дополнительные функции, которых ещё нет в Excel, он сможет записать их самостоятельно. Все базовые функции Excel — это тоже макросы.

Все перечисленные команды, а также любые другие команды пользователя можно комбинировать друг с другом и на их основе создавать макросы под свои потребности.

В Excel и других программах Microsoft Office макросы создаются в виде кода на языке программирования VBA (Visual Basic for Applications). Этот язык разработан в Microsoft специально для программ компании — он представляет собой упрощённую версию языка Visual Basic. Но это не значит, что для записи макроса нужно уметь кодить.

Есть два способа создания макроса в Excel:

  • Написать макрос вручную.

    Это способ для продвинутых пользователей. Предполагается, что они откроют окно Visual Basic в Еxcel и самостоятельно напишут последовательность действий для макроса в виде кода.

  • Записать макрос с помощью кнопки меню Excel.

    Способ подойдёт новичкам. В этом варианте Excel запишет программный код вместо пользователя. Нужно нажать кнопку записи и выполнить все действия, которые планируется включить в макрос, и после этого остановить запись — Excel переведёт каждое действие и выдаст алгоритм на языке VBA.

Разберёмся на примере, как создать макрос с помощью второго способа.

Допустим, специальный сервис автосалона выгрузил отчёт по продажам за три месяца первого квартала в формате таблиц Excel. Эти таблицы содержат всю необходимую информацию, но при этом никак не отформатированы: колонки слиплись друг с другом и не видны полностью, шапка таблицы не выделена и сливается с другими строками, часть данных не отображается.

Так выглядят таблицы с продажами автосалона в первоначальном виде
Скриншот: Skillbox Media

Пользоваться таким отчётом неудобно — нужно сделать его наглядным. Запишем макрос при форматировании таблицы с продажами за январь и затем применим его к двум другим таблицам.


Готовимся к записи макроса

Кнопки для работы с макросами в Excel находятся во вкладке «Разработчик». Эта вкладка по умолчанию скрыта, поэтому для начала разблокируем её.

В операционной системе Windows это делается так: переходим во вкладку «Файл» и выбираем пункты «Параметры» → «Настройка ленты». В открывшемся окне в разделе «Основные вкладки» находим пункт «Разработчик», отмечаем его галочкой и нажимаем кнопку «ОК» → в основном меню Excel появляется новая вкладка «Разработчик».

В операционной системе macOS это нужно делать по-другому. В самом верхнем меню нажимаем на вкладку «Excel» и выбираем пункт «Параметры…».

Нажимаем сюда, чтобы вызвать панель с дополнительными параметрами Excel в macOS
Скриншот: Skillbox Media

В появившемся окне нажимаем кнопку «Лента и панель».

Выбираем параметр «Лента и панель»
Скриншот: Skillbox Media

Затем в правой панели «Настроить ленту» ищем пункт «Разработчик» и отмечаем его галочкой. Нажимаем «Сохранить».

Отмечаем пункт «Разработчик» и сохраняем изменения
Скриншот: Skillbox Media

Готово — вкладка «Разработчик» появилась на основной панели Excel.

Теперь можно работать с макросами
Скриншот: Skillbox Media

Чтобы Excel смог сохранить и в дальнейшем использовать макрос, нужно пересохранить документ в формате, который поддерживает макросы. Это делается через команду «Сохранить как» на главной панели. В появившемся меню нужно выбрать формат «Книга Excel с поддержкой макросов».

Перед записью макросов нужно сохранить документ в формате с их поддержкой
Скриншот: Skillbox Media

Перед началом записи макроса важно знать об особенностях его работы:

  • Макрос записывает все действия пользователя.

    После старта записи макрос начнёт регистрировать все клики мышки и все нажатия клавиш. Поэтому перед записью последовательности лучше хорошо отработать её, чтобы не добавлять лишних действий и не удлинять код. Если требуется записать длинную последовательность задач — лучше разбить её на несколько коротких и записать несколько макросов.

  • Работу макроса нельзя отменить.

    Все действия, которые выполняет запущенный макрос, остаются в файле навсегда. Поэтому перед тем, как запускать макрос в первый раз, лучше создать копию всего файла. Если что-то пойдёт не так, можно будет просто закрыть его и переписать макрос в созданной копии.

  • Макрос выполняет свой алгоритм только для записанного диапазона таблиц.

    Если при записи макроса пользователь выбирал диапазон таблицы, то и при запуске макроса в другом месте он выполнит свой алгоритм только в рамках этого диапазона. Если добавить новую строку, макрос к ней применяться не будет. Поэтому при записи макроса можно сразу выбирать большее количество строк — как это сделать, показываем ниже.

Для начала записи макроса перейдём на вкладку «Разработчик» и нажмём кнопку «Записать макрос».

Нажимаем сюда, чтобы начать запись макроса
Скриншот: Skillbox Media

Появляется окно для заполнения параметров макроса. Нужно заполнить поля: «Имя макроса», «Сохранить в», «Сочетание клавиш», «Описание».

Так выглядит окно с параметрами макроса
Скриншот: Skillbox Media

«Имя макроса» — здесь нужно придумать и ввести название для макроса. Лучше сделать его логически понятным, чтобы в дальнейшем можно было быстро его найти.

Первым символом в названии обязательно должна быть буква. Другие символы могут быть буквами или цифрами. Важно не использовать пробелы в названии — их можно заменить символом подчёркивания.

«Сохранить в» — здесь нужно выбрать книгу, в которую макрос сохранится после записи.

Если выбрать параметр «Эта книга», макрос будет доступен при работе только в этом файле Excel. Чтобы макрос был доступен всегда, нужно выбрать параметр «Личная книга макросов» — Excel создаст личную книгу макросов и сохранит новый макрос в неё.

«Сочетание клавиш» — здесь к уже выбранным двум клавишам (Ctrl + Shift в системе Windows и Option + Cmd в системе macOS) нужно добавить третью клавишу. Это должна быть строчная или прописная буква, которую ещё не используют в других быстрых командах компьютера или программы Excel.

В дальнейшем при нажатии этих трёх клавиш записанный макрос будет запускаться автоматически.

«Описание» — необязательное поле, но лучше его заполнять. Например, можно ввести туда последовательность действий, которые планируется записать в этом макросе. Так не придётся вспоминать, какие именно команды выполнит этот макрос, если нужно будет запустить его позже. Плюс будет проще ориентироваться среди других макросов.

В нашем случае с форматированием таблицы заполним поля записи макроса следующим образом и нажмём «ОК».

Заполняем поля и жмём «ОК», чтобы начать запись
Скриншот: Skillbox Media

После этого начнётся запись макроса — в нижнем левом углу окна Excel появится значок записи.

Началась запись макроса — теперь в него попадут все клики мышки и нажатия клавиш
Скриншот: Skillbox Media

Пока идёт запись, форматируем таблицу с продажами за январь: меняем ширину всех столбцов, данные во всех ячейках располагаем по центру, выделяем шапку таблицы цветом и жирным шрифтом, рисуем границы.

Важно: в нашем случае у таблиц продаж за январь, февраль и март одинаковое количество столбцов, но разное количество строк. Чтобы в случае со второй и третьей таблицей макрос сработал корректно, при форматировании выделим диапазон так, чтобы в него попали не только строки самой таблицы, но и строки ниже неё. Для этого нужно выделить столбцы в строке с их буквенным обозначением A–G, как на рисунке ниже.

Так макрос будет работать и для таблиц с большим количеством строк
Скриншот: Skillbox Media

Если выбрать диапазон только в рамках первой таблицы, то после запуска макроса в таблице с большим количеством строк она отформатируется только частично.

Так макрос отформатирует только выбранные строки: если в других таблицах строк окажется больше, они останутся в первоначальном виде
Скриншот: Skillbox Media

После всех манипуляций с оформлением таблица примет такой вид:

Так выглядит таблица после форматирования
Скриншот: Skillbox Media

Проверяем, все ли действия с таблицей мы выполнили, и останавливаем запись макроса. Сделать это можно двумя способами:

  • Нажать на кнопку записи в нижнем левом углу.
  • Перейти во вкладку «Разработчик» и нажать кнопку «Остановить запись».

Нажимаем сюда, чтобы остановить запись макроса
Скриншот: Skillbox Media

Готово — мы создали макрос для форматирования таблиц в границах столбцов A–G. Теперь его можно применить к другим таблицам.


Запускаем макрос

Перейдём в лист со второй таблицей «Февраль_2022». В первоначальном виде она такая же нечитаемая, как и первая таблица до форматирования.

Так выглядит таблица до запуска макроса
Скриншот: Skillbox Media

Отформатируем её с помощью записанного макроса. Запустить макрос можно двумя способами:

  • Нажать комбинацию клавиш, которую выбрали при заполнении параметров макроса — в нашем случае Option + Cmd + Ф.
  • Перейти во вкладку «Разработчик» и нажать кнопку «Макросы».

Нажимаем сюда, чтобы вызвать панель для выбора макроса
Скриншот: Skillbox Media

Появляется окно — там выбираем макрос, который нужно запустить. В нашем случае он один — «Форматирование_таблицы». Под ним отображается описание того, какие действия он включает. Нажимаем «Выполнить».

Нажимаем сюда, чтобы запустить макрос для форматирования таблицы
Скриншот: Skillbox Media

Готово — вторая таблица с помощью макроса форматируется так же, как и первая.

За пару секунд с помощью макроса исходная таблица принимает такой вид
Скриншот: Skillbox Media

То же самое можно сделать и на третьем листе для таблицы продаж за март. Более того, этот же макрос можно будет запустить и в следующем квартале, когда сервис автосалона выгрузит таблицы с новыми данными.

Научитесь: Excel + Google Таблицы с нуля до PRO
Узнать больше

12. Подбор параметра

Функция Подбор параметра.

Решение уравнений средствами программы Excel

Задача : Найти решение уравнения x 3 — Зх 2 +х= -1.

1. Присвойте рабочему листу имя Уравнение.

2. Занесите в ячейку A 1 значение 0.

3. Занесите в ячейку B 1 левую часть уравнения, используя в качестве независи­ мой переменной ссылку на ячейку A 1. Соответствующая формула может, напри­ мер, иметь вид = A 1^3-3* A 1^2+ A 1.

4. На вкладке Данные, в группе Работа с данными выберите Анализ «что если» — Подбор параметра.

5. В поле Установить в ячейке укажите В1, в поле Значение задайте -1, в поле Из­меняя значение ячейки укажите А1.

6. Щелкните на кнопке ОК и посмотрите на результат подбора, отображаемый в диалоговом окне Результат подбора параметра. Щелкните на кнопке ОК, чтобы сохранить полученные значения ячеек, участвовавших в операции.

7. Повторите расчет, задавая в ячейке A 1 другие начальные значения, например 0,5 или 2. Совпали ли результаты вычислений? Чем можно объяснить различия?

Мы научились численно решать с помощью программы Excel уравнения, содержащие одно неизвестное и задаваемые формулой. Мы выяснили, что при наличии нескольких корней результат решения уравнения зависит от того, какое число было выбрано в качестве начального приближения.

Составление штатного расписания больницы.

Вы — заведующий больницей. Составьте штатное расписа­ние, то есть определите, сколько сотрудников, на каких должностях и с каким окладом вы должны принять на работу. Общий месячный фонд зарплаты составляет $10.000.

Предположим, что для нормальной работы больницы нужно 5-7 санитарок, 8-10 медсестер, 10-12 врачей, 1 заведующий апте­кой, 3 заведующих отделениями, 1 главный врач, 1 заведующий хозяйством, 1 заведующий больницей.

Предлагается следующая модель решения задачи. За основу берется оклад санитарки, а остальные вычисляются исходя из него с помощью коэффициентов оклада:

Коэффициенты назначаются следующим образом:

медсестра должна получать в 1,5 раза больше санитарки;

врач — в 3 раза больше санитарки;

заведующий отделением — на $30 больше, чем врач;

заведующий аптекой — в 2 раза больше санитарки;

заведующий хозяйством — на $40 больше медсестры;

главный врач — в 4 раза больше санитарки;

заведующий больницей — на $20 больше главного врача.

Оформите таблицу, используя следующие столбцы: Должность, Количество сотрудников, Коэффициент A , Коэффициент B , Оклад, Итого.

1. В первой строке – название таблицы.

2. Во второй строке – название столбцов таблицы.

3. В ячейках А3:А10 введите названия должностей – от санитарки до главного врача. В ячейках В3:В10 – количество сотрудников по верхнему пределу, заданному в условии задачи. В ячейке С3 – 1, в ячейках C 4: C 10 – во сколько раз данный оклад больше оклада санитарки. В ячейках D 3: D 10 – на сколько больше (обратите внимание, что размер оклада нужно выразить относительно оклада санитарки). Ячейку Е3 оставьте пустой – там будет формироваться величина оклада. В ячейках Е4:Е10 – введите формулу для вычисления оклада (см. в условии задачи). В столбце F подсчитайте сумму окладов по должностям и итоговую по всей по больнице.

При решении задачи используйте сервисную функцию Excel Подбор параметра : Данные– (Работа с данными) Анализ «Что если» (см. рисунок Подбор параметра).

В поле Установить в ячейке ввести адрес ячейки, где вы­числяется общая месячная зарплата всех сотрудников больницы. В поле Значение ввести предельное значение месячного фонда зарплаты. В поле Изменяя значение ячейки ввести адрес ячейки, где находится оклад санитарки. После нажатия ОК произойдет ав­томатический подбор значения оклада санитарки таким образом, чтобы общий месячный фонд зарплаты составил $10.000.

4. Рассчитайте оклады для нескольких вариантов штата, из­меняя количество штатных единиц в соответствии с заданными условиями.

Для этого несколько раз подряд придется выполнять рутин­ные действия по вызову команды Подбор параметра и заполне­нию всех полей ее диалогового окна.

Создание простого макроса и кнопки.

Для упрощения работы с предыдущим заданием создадим простейший макрос — программу на языке VBA ( VisualBasicforApplication ), встроенном в офисные программы. Причем сделаем это, не зная пока самого языка. В этом нам поможет MacroRecorder — транслятор, перево­ дящий на язык VBA действия пользователя с момента запуска MacroRecorder до окончания записи макроса.

Для активизации MacroRecorder выбираем команду Вид – Макросы – Запись макроса . В появившемся диалоговом окне Запись макроса (см. рисунок) задаем имя макроса (« Staff ») и описание макро­са (не обязательно). В поле Сохранить в: оставляем опцию по умолчанию Эта книга (тогда созданный макрос сохранится на но­вом листе модуля в активной рабочей книге).

После нажатия OK на экране появляется кнопка Остановить запись в левом нижнем углу MSExcel . Теперь все ваши действия над ячейками будут записываться.

В данном случае действия будут простые. Вызовем сервис­ ную функцию Подбор параметра, выполним описанные ранее дей­ствия по расчету штатного расписания и остановим запись макроса.

Чтобы посмотреть, какая же все-таки VBA — программа «соз­дана» нами, выполним команду Вид — Макросы — Макросы. В появившемся диалоговом окне выберем макрос с именем « Staff » и нажмем кнопку Изменить. Откроется главное окно редактора VBA с текстом записанного макроса, например:

‘ Штатное расписание таблицы

Range(«F11»).GoalSeek Goal:=10000, ChangingCell:=Range(«E3»)

Именно эта процедура и выполняется, если в диалоговом ок­ не Макросы нажать кнопку Выполнить. Рассчитываются оклады для заданного заранее нового количества штатных единиц.

Для еще большей оптимизации действий по расчету штатно­го расписания разместим на листе Кнопку, при нажатии на которую будут производиться нужные действия.

Кнопка является одним из элементов управления листа, соз­ даваемых с помощью панели инструментов Формы. Обычно этой панели нет на экране, поэтому выполняем команду Файл | Параметры | Настройка ленты| Все команды. На экран выводится панель инструментов Всех команд, находим название Кнопка, затем нажимаем на Добавить >> (данная функция уже есть в ранее созданной вкладке). Выбираем на ней щелчком мыши форму Кнопка, при этом указатель мыши превращается в тонкий крестик. Щелкаем им по листу. На нем появляется кнопка с именем Кнопка1 и одновременно открывается диалоговое окно На­значение макроса объекту. В поле Имя макроса выбираем имя нашего макроса « Staff ».

Теперь указанная выше процедура расчета окладов будет выполняться простым нажатием кнопки.

Решение системы уравнений в Microsoft Excel

Умение решать системы уравнений часто может принести пользу не только в учебе, но и на практике. В то же время, далеко не каждый пользователь ПК знает, что в Экселе существует собственные варианты решений линейных уравнений. Давайте узнаем, как с применением инструментария этого табличного процессора выполнить данную задачу различными способами.

Варианты решений

Любое уравнение может считаться решенным только тогда, когда будут отысканы его корни. В программе Excel существует несколько вариантов поиска корней. Давайте рассмотрим каждый из них.

Способ 1: матричный метод

Самый распространенный способ решения системы линейных уравнений инструментами Excel – это применение матричного метода. Он заключается в построении матрицы из коэффициентов выражений, а затем в создании обратной матрицы. Попробуем использовать данный метод для решения следующей системы уравнений:

    Заполняем матрицу числами, которые являются коэффициентами уравнения. Данные числа должны располагаться последовательно по порядку с учетом расположения каждого корня, которому они соответствуют. Если в каком-то выражении один из корней отсутствует, то в этом случае коэффициент считается равным нулю. Если коэффициент не обозначен в уравнении, но соответствующий корень имеется, то считается, что коэффициент равен 1. Обозначаем полученную таблицу, как вектор A.

Отдельно записываем значения после знака «равно». Обозначаем их общим наименованием, как вектор B.

Аргумент «Массив» — это, собственно, адрес исходной таблицы.

Итак, выделяем на листе область пустых ячеек, которая по размеру равна диапазону исходной матрицы. Щелкаем по кнопке «Вставить функцию», расположенную около строки формул.

Выполняется запуск Мастера функций. Переходим в категорию «Математические». В представившемся списке ищем наименование «МОБР». После того, как оно отыскано, выделяем его и жмем на кнопку «OK».

Итак, после этого программа производит вычисления и на выходе в предварительно выделенной области мы имеем матрицу, обратную данной.

Теперь нам нужно будет умножить обратную матрицу на матрицу B, которая состоит из одного столбца значений, расположенных после знака «равно» в выражениях. Для умножения таблиц в Экселе также имеется отдельная функция, которая называется МУМНОЖ. Данный оператор имеет следующий синтаксис:

Выделяем диапазон, в нашем случае состоящий из четырех ячеек. Далее опять запускаем Мастер функций, нажав значок «Вставить функцию».

В категории «Математические», запустившегося Мастера функций, выделяем наименование «МУМНОЖ» и жмем на кнопку «OK».

Активируется окно аргументов функции МУМНОЖ. В поле «Массив1» заносим координаты нашей обратной матрицы. Для этого, как и в прошлый раз, устанавливаем курсор в поле и с зажатой левой кнопкой мыши выделяем курсором соответствующую таблицу. Аналогичное действие проводим для внесения координат в поле «Массив2», только на этот раз выделяем значения колонки B. После того, как вышеуказанные действия проведены, опять не спешим жать на кнопку «OK» или клавишу Enter, а набираем комбинацию клавиш Ctrl+Shift+Enter.

  • После данного действия в предварительно выделенной ячейке отобразятся корни уравнения: X1, X2, X3 и X4. Они будут расположены последовательно. Таким образом, можно сказать, что мы решили данную систему. Для того, чтобы проверить правильность решения достаточно подставить в исходную систему выражений данные ответы вместо соответствующих корней. Если равенство будет соблюдено, то это означает, что представленная система уравнений решена верно.
  • Способ 2: подбор параметров

    Второй известный способ решения системы уравнений в Экселе – это применение метода подбора параметров. Суть данного метода заключается в поиске от обратного. То есть, основываясь на известном результате, мы производим поиск неизвестного аргумента. Давайте для примера используем квадратное уравнение

      Принимаем значение x за равное 0. Высчитываем соответствующее для него значение f(x), применив следующую формулу:

    Вместо значения «X» подставляем адрес той ячейки, где расположено число 0, принятое нами за x.

    Переходим во вкладку «Данные». Жмем на кнопку «Анализ «что если»». Эта кнопка размещена на ленте в блоке инструментов «Работа с данными». Открывается выпадающий список. Выбираем в нем позицию «Подбор параметра…».

    Запускается окно подбора параметров. Как видим, оно состоит из трех полей. В поле «Установить в ячейке» указываем адрес ячейки, в которой находится формула f(x), рассчитанная нами чуть ранее. В поле «Значение» вводим число «0». В поле «Изменяя значения» указываем адрес ячейки, в которой расположено значение x, ранее принятое нами за 0. После выполнения данных действий жмем на кнопку «OK».

    После этого Эксель произведет вычисление с помощью подбора параметра. Об этом сообщит появившееся информационное окно. В нем следует нажать на кнопку «OK».

  • Результат вычисления корня уравнения будет находиться в той ячейке, которую мы назначили в поле «Изменяя значения». В нашем случае, как видим, x будет равен 6.
  • Этот результат также можно проверить, подставив данное значение в решаемое выражение вместо значения x.

    Способ 3: метод Крамера

    Теперь попробуем решить систему уравнений методом Крамера. Для примера возьмем все ту же систему, которую использовали в Способе 1:

      Как и в первом способе, составляем матрицу A из коэффициентов уравнений и таблицу B из значений, которые стоят после знака «равно».

    Далее делаем ещё четыре таблицы. Каждая из них является копией матрицы A, только у этих копий поочередно один столбец заменен на таблицу B. У первой таблицы – это первый столбец, у второй таблицы – второй и т.д.

    Теперь нам нужно высчитать определители для всех этих таблиц. Система уравнений будет иметь решения только в том случае, если все определители будут иметь значение, отличное от нуля. Для расчета этого значения в Экселе опять имеется отдельная функция – МОПРЕД. Синтаксис данного оператора следующий:

    Таким образом, как и у функции МОБР, единственным аргументом выступает ссылка на обрабатываемую таблицу.

    Итак, выделяем ячейку, в которой будет выводиться определитель первой матрицы. Затем жмем на знакомую по предыдущим способам кнопку «Вставить функцию».

    Активируется окно Мастера функций. Переходим в категорию «Математические» и среди списка операторов выделяем там наименование «МОПРЕД». После этого жмем на кнопку «OK».

    Запускается окно аргументов функции МОПРЕД. Как видим, оно имеет только одно поле – «Массив». В это поле вписываем адрес первой преобразованной матрицы. Для этого устанавливаем курсор в поле, а затем выделяем матричный диапазон. После этого жмем на кнопку «OK». Данная функция выводит результат в одну ячейку, а не массивом, поэтому для получения расчета не нужно прибегать к нажатию комбинации клавиш Ctrl+Shift+Enter.

    Функция производит подсчет результата и выводит его в заранее выделенную ячейку. Как видим, в нашем случае определитель равен -740, то есть, не является равным нулю, что нам подходит.

    Аналогичным образом производим подсчет определителей для остальных трех таблиц.

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

  • Теперь пора найти корни уравнения. Корень уравнения будет равен отношению определителя соответствующей преобразованной матрицы на определитель первичной таблицы. Таким образом, разделив поочередно все четыре определителя преобразованных матриц на число -148, которое является определителем первоначальной таблицы, мы получим четыре корня. Как видим, они равны значениям 5, 14, 8 и 15. Таким образом, они в точности совпадают с корнями, которые мы нашли, используя обратную матрицу в способе 1, что подтверждает правильность решения системы уравнений.
  • Способ 4: метод Гаусса

    Решить систему уравнений можно также, применив метод Гаусса. Для примера возьмем более простую систему уравнений из трех неизвестных:

      Опять последовательно записываем коэффициенты в таблицу A, а свободные члены, расположенные после знака «равно» — в таблицу B. Но на этот раз сблизим обе таблицы, так как это понадобится нам для работы в дальнейшем. Важным условием является то, чтобы в первой ячейке матрицы A значение было отличным от нуля. В обратном случае следует переставить строки местами.

    Копируем первую строку двух соединенных матриц в строчку ниже (для наглядности можно пропустить одну строку). В первую ячейку, которая расположена в строке ещё ниже предыдущей, вводим следующую формулу:

    Если вы расположили матрицы по-другому, то и адреса ячеек формулы у вас будут иметь другое значение, но вы сможете высчитать их, сопоставив с теми формулами и изображениями, которые приводятся здесь.

    После того, как формула введена, выделите весь ряд ячеек и нажмите комбинацию клавиш Ctrl+Shift+Enter. К ряду будет применена формула массива и он будет заполнен значениями. Таким образом мы произвели вычитание из второй строки первой, умноженной на отношение первых коэффициентов двух первых выражений системы.

    После этого копируем полученную строку и вставляем её в строчку ниже.

    Выделяем две первые строки после пропущенной строчки. Жмем на кнопку «Копировать», которая расположена на ленте во вкладке «Главная».

    Пропускаем строку после последней записи на листе. Выделяем первую ячейку в следующей строке. Кликаем правой кнопкой мыши. В открывшемся контекстном меню наводим курсор на пункт «Специальная вставка». В запустившемся дополнительном списке выбираем позицию «Значения».

    В следующую строку вводим формулу массива. В ней производится вычитание из третьей строки предыдущей группы данных второй строки, умноженной на отношение второго коэффициента третьей и второй строки. В нашем случае формула будет иметь следующий вид:

    После ввода формулы выделяем весь ряд и применяем сочетание клавиш Ctrl+Shift+Enter.

    Теперь следует выполнить обратную прогонку по методу Гаусса. Пропускаем три строки от последней записи. В четвертой строке вводим формулу массива:

    Таким образом, мы делим последнюю рассчитанную нами строку на её же третий коэффициент. После того, как набрали формулу, выделяем всю строчку и жмем сочетание клавиш Ctrl+Shift+Enter.

    Поднимаемся на строку вверх и вводим в неё следующую формулу массива:

    Жмем привычное уже нам сочетание клавиш для применения формулы массива.

    Поднимаемся ещё на одну строку выше. В неё вводим формулу массива следующего вида:

    Опять выделяем всю строку и применяем сочетание клавиш Ctrl+Shift+Enter.

  • Теперь смотрим на числа, которые получились в последнем столбце последнего блока строк, рассчитанного нами ранее. Именно эти числа (4, 7 и 5) будут являться корнями данной системы уравнений. Проверить это можно, подставив их вместо значений X1, X2 и X3 в выражения.
  • Как видим, в Экселе систему уравнений можно решить целым рядом способов, каждый из которых имеет собственные преимущества и недостатки. Но все эти методы можно условно разделить на две большие группы: матричные и с применением инструмента подбора параметров. В некоторых случаях не всегда матричные методы подходят для решения задачи. В частности тогда, когда определитель матрицы равен нулю. В остальных же случаях пользователь сам волен решать, какой вариант он считает более удобным для себя.

    Помимо этой статьи, на сайте еще 12689 инструкций.
    Добавьте сайт Lumpics.ru в закладки (CTRL+D) и мы точно еще пригодимся вам.

    Отблагодарите автора, поделитесь статьей в социальных сетях.

    Решение уравнений в Excel методом итераций Крамера и Гаусса

    В программе Excel имеется обширный инструментарий для решения различных видов уравнений разными методами.

    Рассмотрим на примерах некоторые варианты решений.

    Решение уравнений методом подбора параметров Excel

    Инструмент «Подбор параметра» применяется в ситуации, когда известен результат, но неизвестны аргументы. Excel подбирает значения до тех пор, пока вычисление не даст нужный итог.

    Путь к команде: «Данные» — «Работа с данными» — «Анализ «что-если»» — «Подбор параметра».

    Рассмотрим на примере решение квадратного уравнения х 2 + 3х + 2 = 0. Порядок нахождения корня средствами Excel:

    1. Введем в ячейку В2 формулу для нахождения значения функции. В качестве аргумента применим ссылку на ячейку В1.
    2. Открываем меню инструмента «Подбор параметра». В графе «Установить в ячейку» — ссылка на ячейку В2, где находится формула. В поле «Значение» вводим 0. Это то значение, которое нужно получить. В графе «Изменяя значение ячейки» — В1. Здесь должен отобразиться отобранный параметр.
    3. После нажатия ОК отобразится результат подбора. Если нужно его сохранить, вновь нажимаем ОК. В противном случае – «Отмена».

    Для подбора параметра программа использует циклический процесс. Чтобы изменить число итераций и погрешность, нужно зайти в параметры Excel. На вкладке «Формулы» установить предельное количество итераций, относительную погрешность. Поставить галочку «включить итеративные вычисления».

    Как решить систему уравнений матричным методом в Excel

    Дана система уравнений:

    1. Значения элементов введем в ячейки Excel в виде таблицы.
    2. Найдем обратную матрицу. Выделим диапазон, куда впоследствии будут помещены элементы матрицы (ориентируемся на количество строк и столбцов в исходной матрице). Открываем список функций (fx). В категории «Математические» находим МОБР. Аргумент – массив ячеек с элементами исходной матрицы.
    3. Нажимаем ОК – в левом верхнем углу диапазона появляется значение. Последовательно жмем кнопку F2 и сочетание клавиш Ctrl + Shift + Enter.
    4. Умножим обратную матрицу Ах -1х на матрицу В (именно в таком порядке следования множителей!). Выделяем диапазон, где впоследствии появятся элементы результирующей матрицы (ориентируемся на число строк и столбцов матрицы В). Открываем диалоговое окно математической функции МУМНОЖ. Первый диапазон – обратная матрица. Второй – матрица В.
    5. Закрываем окно с аргументами функции нажатием кнопки ОК. Последовательно нажимаем кнопку F2 и комбинацию Ctrl + Shift + Enter.

    Получены корни уравнений.

    Решение системы уравнений методом Крамера в Excel

    Возьмем систему уравнений из предыдущего примера:

    Для их решения методом Крамера вычислим определители матриц, полученных заменой одного столбца в матрице А на столбец-матрицу В.

    Для расчета определителей используем функцию МОПРЕД. Аргумент – диапазон с соответствующей матрицей.

    Рассчитаем также определитель матрицы А (массив – диапазон матрицы А).

    Определитель системы больше 0 – решение можно найти по формуле Крамера (Dx / |A|).

    Для расчета Х1: =U2/$U$1, где U2 – D1. Для расчета Х2: =U3/$U$1. И т.д. Получим корни уравнений:

    Решение систем уравнений методом Гаусса в Excel

    Для примера возьмем простейшую систему уравнений:

    3а + 2в – 5с = -1
    2а – в – 3с = 13
    а + 2в – с = 9

    Коэффициенты запишем в матрицу А. Свободные члены – в матрицу В.

    Для наглядности свободные члены выделим заливкой. Если в первой ячейке матрицы А оказался 0, нужно поменять местами строки, чтобы здесь оказалось отличное от 0 значение.

    1. Приведем все коэффициенты при а к 0. Кроме первого уравнения. Скопируем значения в первой строке двух матриц в ячейки В6:Е6. В ячейку В7 введем формулу: =B3:Е3-$B$2:$Е$2*(B3/$B$2). Выделим диапазон В7:Е7. Нажмем F2 и сочетание клавиш Ctrl + Shift + Enter. Мы отняли от второй строки первую, умноженную на отношение первых элементов второго и первого уравнения.
    2. Копируем введенную формулу на 8 и 9 строки. Так мы избавились от коэффициентов перед а. Сохранили только первое уравнение.
    3. Приведем к 0 коэффициенты перед в в третьем и четвертом уравнении. Копируем строки 6 и 7 (только значения). Переносим их ниже, в строки 10 и 11. Эти данные должны остаться неизменными. В ячейку В12 вводим формулу массива.
    4. Прямую прогонку по методу Гаусса сделали. В обратном порядке начнем прогонять с последней строки полученной матрицы. Все элементы данной строки нужно разделить на коэффициент при с. Введем в строку формулу массива: <=B12:E12/D12>.
    5. В строке 15: отнимем от второй строки третью, умноженную на коэффициент при с второй строки (<=(B11:E11-B16:E16*D11)/C11>). В строке 14: от первой строки отнимаем вторую и третью, умноженные на соответствующие коэффициенты (<=(B10:E10-B15:E15*C10-B16:E16*D10)/B10>). В последнем столбце новой матрицы получаем корни уравнения.

    Примеры решения уравнений методом итераций в Excel

    Вычисления в книге должны быть настроены следующим образом:

    Делается это на вкладке «Формулы» в «Параметрах Excel». Найдем корень уравнения х – х 3 + 1 = 0 (а = 1, b = 2) методом итерации с применением циклических ссылок. Формула:

    M – максимальное значение производной по модулю. Чтобы найти М, произведем вычисления:

    f’ (1) = -2 * f’ (2) = -11.

    Полученное значение меньше 0. Поэтому функция будет с противоположным знаком: f (х) = -х + х 3 – 1. М = 11.

    В ячейку А3 введем значение: а = 1. Точность – три знака после запятой. Для расчета текущего значения х в соседнюю ячейку (В3) введем формулу: =ЕСЛИ(B3=0;A3;B3-(-B3+СТЕПЕНЬ(B3;3)-1/11)).

    В ячейке С3 проконтролируем значение f (x): с помощью формулы =B3-СТЕПЕНЬ(B3;3)+1.

    Корень уравнения – 1,179. Введем в ячейку А3 значение 2. Получим тот же результат:

    источники:

    http://lumpics.ru/how-solve-system-equations-excel/

    http://exceltable.com/otchety/reshenie-uravneniy

    Время на прочтение
    7 мин

    Количество просмотров 312K

    Приветствую всех.

    В этом посте я расскажу, что такое VBA и как с ним работать в Microsoft Excel 2007/2010 (для более старых версий изменяется лишь интерфейс — код, скорее всего, будет таким же) для автоматизации различной рутины.

    VBA (Visual Basic for Applications) — это упрощенная версия Visual Basic, встроенная в множество продуктов линейки Microsoft Office. Она позволяет писать программы прямо в файле конкретного документа. Вам не требуется устанавливать различные IDE — всё, включая отладчик, уже есть в Excel.

    Еще при помощи Visual Studio Tools for Office можно писать макросы на C# и также встраивать их. Спасибо, FireStorm.

    Сразу скажу — писать на других языках (C++/Delphi/PHP) также возможно, но требуется научится читать, изменять и писать файлы офиса — встраивать в документы не получится. А интерфейсы Microsoft работают через COM. Чтобы вы поняли весь ужас, вот Hello World с использованием COM.

    Поэтому, увы, будем учить Visual Basic.

    Чуть-чуть подготовки и постановка задачи

    Итак, поехали. Открываем Excel.

    Для начала давайте добавим в Ribbon панель «Разработчик». В ней находятся кнопки, текстовые поля и пр. элементы для конструирования форм.

    Появилась вкладка.

    Теперь давайте подумаем, на каком примере мы будем изучать VBA. Недавно мне потребовалось красиво оформить прайс-лист, выглядевший, как таблица. Идём в гугл, набираем «прайс-лист» и качаем любой, который оформлен примерно так (не сочтите за рекламу, пожалуйста):

    То есть требуется, чтобы было как минимум две группы, по которым можно объединить товары (в нашем случае это будут Тип и Производитель — в таком порядке). Для того, чтобы предложенный мною алгоритм работал корректно, отсортируйте товары так, чтобы товары из одной группы стояли подряд (сначала по Типу, потом по Производителю).

    Результат, которого хотим добиться, выглядит примерно так:

    Разумеется, если смотреть прайс только на компьютере, то можно добавить фильтры и будет гораздо удобнее искать нужный товар. Однако мы хотим научится кодить и задача вполне подходящая, не так ли?

    Кодим

    Для начала требуется создать кнопку, при нажатии на которую будет вызываться наша програма. Кнопки находятся в панели «Разработчик» и появляются по кнопке «Вставить». Вам нужен компонент формы «Кнопка». Нажали, поставили на любое место в листе. Далее, если не появилось окно назначения макроса, надо нажать правой кнопкой и выбрать пункт «Назначить макрос». Назовём его FormatPrice. Важно, чтобы перед именем макроса ничего не было — иначе он создастся в отдельном модуле, а не в пространстве имен книги. В этому случае вам будет недоступно быстрое обращение к выделенному листу. Нажимаем кнопку «Новый».

    И вот мы в среде разработки VB. Также её можно вызвать из контекстного меню командой «Исходный текст»/«View code».

    Перед вами окно с заглушкой процедуры. Можете его развернуть. Код должен выглядеть примерно так:

    Sub FormatPrice()End Sub

    Напишем Hello World:

    Sub FormatPrice()
        MsgBox "Hello World!"
    End Sub

    И запустим либо щелкнув по кнопке (предварительно сняв с неё выделение), либо клавишей F5 прямо из редактора.

    Тут, пожалуй, следует отвлечься на небольшой ликбез по поводу синтаксиса VB. Кто его знает — может смело пропустить этот раздел до конца. Основное отличие Visual Basic от Pascal/C/Java в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.

    Примеры синтаксиса

    ' Процедура. Ничего не возвращает
    ' Перегрузка в VBA отсутствует
    Sub foo(a As String, b As String)
        ' Exit Sub ' Это значит "выйти из процедуры"
        MsgBox a + ";" + b
    End Sub' Функция. Вовращает Integer
    Function LengthSqr(x As Integer, y As IntegerAs Integer
        ' Exit Function
        LengthSqr = x * x + y * y
    End FunctionSub FormatPrice()
        Dim s1 As String, s2 As String
        s1 = "str1"
        s2 = "str2"
        If s1 <> s2 Then
            foo "123""456" ' Скобки при вызове процедур запрещены
        End IfDim res As sTRING ' Регистр в VB не важен. Впрочем, редактор Вас поправит
        Dim i As Integer
        ' Цикл всегда состоит из нескольких строк
        For i = 1 To 10
            res = res + CStr(i) ' Конвертация чего угодно в String
            If i = 5 Then Exit For
        Next iDim x As Double
        x = Val("1.234"' Парсинг чисел
        x = x + 10
        MsgBox xOn Error Resume Next ' Обработка ошибок - игнорировать все ошибки
        x = 5 / 0
        MsgBox xOn Error GoTo Err ' При ошибке перейти к метке Err
        x = 5 / 0
        MsgBox "OK!"
        GoTo ne

    Err:
        MsgBox 

    "Err!"

    ne:

    On Error GoTo 0 ' Отключаем обработку ошибок

        ' Циклы бывает, какие захотите
        Do While True
            Exit DoLoop 'While True
        Do 'Until False
            Exit Do
        Loop Until False
        ' А вот при вызове функций, от которых хотим получить значение, скобки нужны.
        ' Val также умеет возвращать Integer
        Select Case LengthSqr(Len("abc"), Val("4"))
        Case 24
            MsgBox "0"
        Case 25
            MsgBox "1"
        Case 26
            MsgBox "2"
        End Select' Двухмерный массив.
        ' Можно также менять размеры командой ReDim (Preserve) - см. google
        Dim arr(1 to 10, 5 to 6) As Integer
        arr(1, 6) = 8Dim coll As New Collection
        Dim coll2 As Collection
        coll.Add "item""key"
        Set coll2 = coll ' Все присваивания объектов должны производится командой Set
        MsgBox coll2("key")
        Set coll2 = New Collection
        MsgBox coll2.Count
    End Sub

    Грабли-1. При копировании кода из IDE (в английском Excel) есь текст конвертируется в 1252 Latin-1. Поэтому, если хотите сохранить русские комментарии — надо сохранить крокозябры как Latin-1, а потом открыть в 1251.

    Грабли-2. Т.к. VB позволяет использовать необъявленные переменные, я всегда в начале кода (перед всеми процедурами) ставлю строчку Option Explicit. Эта директива запрещает интерпретатору заводить переменные самостоятельно.

    Грабли-3. Глобальные переменные можно объявлять только до первой функции/процедуры. Локальные — в любом месте процедуры/функции.

    Еще немного дополнительных функций, которые могут пригодится: InPos, Mid, Trim, LBound, UBound. Также ответы на все вопросы по поводу работы функций/их параметров можно получить в MSDN.

    Надеюсь, что этого Вам хватит, чтобы не пугаться кода и самостоятельно написать какое-нибудь домашнее задание по информатике. По ходу поста я буду ненавязчиво знакомить Вас с новыми конструкциями.

    Кодим много и под Excel

    В этой части мы уже начнём кодить нечто, что умеет работать с нашими листами в Excel. Для начала создадим отдельный лист с именем result (лист с данными назовём data). Теперь, наверное, нужно этот лист очистить от того, что на нём есть. Также мы «выделим» лист с данными, чтобы каждый раз не писать длинное обращение к массиву с листами.

    Sub FormatPrice()
        Sheets("result").Cells.Clear
        Sheets("data").Activate
    End Sub

    Работа с диапазонами ячеек

    Вся работа в Excel VBA производится с диапазонами ячеек. Они создаются функцией Range и возвращают объект типа Range. У него есть всё необходимое для работы с данными и/или оформлением. Кстати сказать, свойство Cells листа — это тоже Range.

    Примеры работы с Range

    Sheets("result").Activate
    Dim r As Range
    Set r = Range("A1")
    r.Value = "123"
    Set r = Range("A3,A5")
    r.Font.Color = vbRed
    r.Value = "456"
    Set r = Range("A6:A7")
    r.Value = "=A1+A3"

    Теперь давайте поймем алгоритм работы нашего кода. Итак, у каждой строчки листа data, начиная со второй, есть некоторые данные, которые нас не интересуют (ID, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:

    1. Считали группы из очередной строки.
    2. Пробегаемся по всем группам в порядке приоритета (вначале более крупные)
      1. Если текущая группа не совпадает, вызываем процедуру AddGroup(i, name), где i — номер группы (от номера текущей до максимума), name — её имя. Несколько вызовов необходимы, чтобы создать не только наш заголовок, но и всё более мелкие.
    3. После отрисовки всех необходимых заголовков делаем еще одну строку и заполняем её данными.

    Для упрощения работы рекомендую определить следующие функции-сокращения:

    Function GetCol(Col As IntegerAs String
        GetCol = Chr(Asc("A") + Col)
    End FunctionFunction GetCellS(Sheet As String, Col As Integer, Row As IntegerAs Range
        Set GetCellS = Sheets(Sheet).Range(GetCol(Col) + CStr(Row))
    End FunctionFunction GetCell(Col As Integer, Row As IntegerAs Range
        Set GetCell = Range(GetCol(Col) + CStr(Row))
    End Function

    Далее определим глобальную переменную «текущая строчка»: Dim CurRow As Integer. В начале процедуры её следует сделать равной единице. Еще нам потребуется переменная-«текущая строка в data», массив с именами групп текущей предыдущей строк. Потом можно написать цикл «пока первая ячейка в строке непуста».

    Глобальные переменные

    Option Explicit ' про эту строчку я уже рассказывал
    Dim CurRow As Integer
    Const GroupsCount As Integer = 2
    Const DataCount As Integer = 3

    FormatPrice

    Sub FormatPrice()
        Dim I As Integer ' строка в data
        CurRow = 1
        Dim Groups(1 To GroupsCount) As String
        Dim PrGroups(1 To GroupsCount) As String

        Sheets(

    "data").Activate
        I = 2
        Do While True
            If GetCell(0, I).Value = "" Then Exit Do
            ' ...
            I = I + 1
        Loop
    End Sub

    Теперь надо заполнить массив Groups:

    На месте многоточия

    Dim I2 As Integer
    For I2 = 1 To GroupsCount
        Groups(I2) = GetCell(I2, I)
    Next I2
    ' ...
    For I2 = 1 To GroupsCount ' VB не умеет копировать массивы
        PrGroups(I2) = Groups(I2)
    Next I2
    I =  I + 1

    И создать заголовки:

    На месте многоточия в предыдущем куске

    For I2 = 1 To GroupsCount
        If Groups(I2) <> PrGroups(I2) Then
            Dim I3 As Integer
            For I3 = I2 To GroupsCount
                AddHeader I3, Groups(I3)
            Next I3
            Exit For
        End If
    Next I2

    Не забудем про процедуру AddHeader:

    Перед FormatPrice

    Sub AddHeader(Ty As Integer, Name As String)
        GetCellS("result", 1, CurRow).Value = Name
        CurRow = CurRow + 1
    End Sub

    Теперь надо перенести всякую информацию в result

    For I2 = 0 To DataCount - 1
        GetCellS("result", I2, CurRow).Value = GetCell(I2, I)
    Next I2

    Подогнать столбцы по ширине и выбрать лист result для показа результата

    После цикла в конце FormatPrice

    Sheets("Result").Activate
    Columns.AutoFit

    Всё. Можно любоваться первой версией.

    Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:

    Sub AddHeader(Ty As Integer, Name As String)
        Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow)).Merge
        ' Чтобы не заводить переменную и не писать каждый раз длинный вызов
        ' можно воспользоваться блоком With
        With GetCellS("result", 0, CurRow)
            .Value = Name
            .Font.Italic = True
            .Font.Name = "Cambria"
            Select Case Ty
            Case 1 ' Тип
                .Font.Bold = True
                .Font.Size = 16
            Case 2 ' Производитель
                .Font.Size = 12
            End Select
            .HorizontalAlignment = xlCenter
        End With
        CurRow = CurRow + 1
    End Sub

    Уже лучше:

    Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:

    Поэтому чуть-чуть меняем код с добавлением стиля границ:

    Sub AddHeader(Ty As Integer, Name As String)
        With Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow))
            .Merge
            .Value = Name
            .Font.Italic = True
            .Font.Name = "Cambria"
            .HorizontalAlignment = xlCenterSelect Case Ty
            Case 1 ' Тип
                .Font.Bold = True
                .Font.Size = 16
                .Borders(xlTop).Weight = xlThick
            Case 2 ' Производитель
                .Font.Size = 12
                .Borders(xlTop).Weight = xlMedium
            End Select
            .Borders(xlBottom).Weight = xlMedium ' По убыванию: xlThick, xlMedium, xlThin, xlHairline
        End With
        CurRow = CurRow + 1
    End Sub

    Осталось лишь добится пропусков перед началом новой группы. Это легко:

    В начале FormatPrice

    Dim I As Integer ' строка в  data
    CurRow = 0 ' чтобы не было пропуска в самом начале
    Dim Groups(1 To GroupsCount) As String

    В цикле расстановки заголовков

    If Groups(I2) <> PrGroups(I2) Then
        CurRow = CurRow + 1
        Dim I3 As Integer

    В точности то, что и хотели.

    Надеюсь, что эта статья помогла вам немного освоится с программированием для Excel на VBA. Домашнее задание — добавить заголовки «ID, Название, Цена» в результат. Подсказка: CurRow = 0 CurRow = 1.

    Файл можно скачать тут (min.us) или тут (Dropbox). Не забудьте разрешить исполнение макросов. Если кто-нибудь подскажет человеческих файлохостинг, залью туда.

    Спасибо за внимание.

    Буду рад конструктивной критике в комментариях.

    UPD: Перезалил пример на Dropbox и min.us.

    UPD2: На самом деле, при вызове процедуры с одним параметром скобки можно поставить. Либо использовать конструкцию Call Foo(«bar», 1, 2, 3) — тут скобки нужны постоянно.

    Создание калькулятора в Microsoft Excel

    Калькулятор в Microsoft Excel

    ​Смотрите также​ окупаемости.​ и «основного долга»​ данными выстроенными в​ ячеек, и кликаем​ и нужно для​ ежемесячного платежа, включающего​ введены, жмем на​ по кредиту за​ на листе, поэтому​указывает на процентную​«Добавить»​ кнопкой мыши. В​ жмем на пиктограмму​ параметр​ намного быстрее и​ его сохранить. В​Для постоянных пользователей Excel​Основные компоненты:​ в текущем периоде:​ ряд. Поэтому, в​ по кнопке «Автосумма».​

    ​ выполнения поставленных целей.​ платеж по телу​

    Процедура создания калькулятора

    ​ кнопку​ весь срок составила​ дадим на неё​ ставку за конкретный​, которая расположена между​ контекстном меню клацаем​«Вставить функцию»​«Действительное»​ проще, чем каждый​ поле​ не секрет, что​описание макроэкономического окружения (темпы​ =F8+G8.​ каждой конкретной ситуации​Но на экран выводится​ Далее жмем на​ займа и оплату​«OK»​64881,67 рубля​ ссылку. Устанавливаем курсор​ период. Если, например,​

    Способ 1: использование макросов

    ​ правой и левой​ по пункту​.​. В поле​ раз вызывать его​«Имя файла»​ в этой программе​ инфляции, проценты по​Внесем формулы в соответствующие​ сам пользователь должен​ не сумма всех​ кнопку​ процентов, составит​.​.​ в поле, а​ используется годовая ставка,​ областью.​«Формат ячеек»​Запускается​

    1. ​«Значение»​ через окно макросов.​присваиваем документу любое​ можно производить различные​​ налогам и сборам,​​ столбцы. Скопируем их​​ решить, какой именно​​ этих ячеек, а​«OK»​23536,74 рубля​​После этого в ячейке,​​Урок:​

      Переход в редактор макросов в Microsoft Excel

    2. ​ затем кликаем по​ но платеж по​После того, как наименование​.​Мастер функций​также из списка​Урок: Как создать макрос​ желаемое наименование или​ математические, инженерные и​ требуемая норма доходности);​​ на всю таблицу.​​ способ больше подойдет.​ суммы для каждого​​.​​. Собственно этот показатель​ которую мы ранее​Мастер функций в Эксель​ соответствующей ячейке. Но,​​ займу производится ежемесячно,​​«Калькулятор»​Снова в окне форматирования​. Переходим в нем​

      Включение поля для ввода кода в редакторе макросов в Microsoft Excel

    3. ​ останавливаем выбор на​ в Экселе​ оставляем то, которое​ финансовые расчеты. Данная​прогнозируемый объем продаж;​

      ​Сравним переплату при аннуитетной​
      ​Автор: Максим Тютюшев​ столбца или строчки​
      ​Итак, результат остатка кредитной​ мы уже рассчитывали​
      ​ выделили, отобразится величина​А теперь с помощью​
      ​ как мы помним,​
      ​ то годовую ставку​отобразилось в правой​ переходим во вкладку​
      ​ в категорию​

      ​ параметре​​Теперь давайте рассмотрим вариант​​ присвоено ему по​ возможность реализуется путем​прогнозируемые затраты на привлечение​ и дифференцированной схеме​Excel – это универсальный​ в отдельности.​

      ​ задолженности после второго​ ранее при помощи​ выплаты по телу​ других операторов Эксель​ у нас в​ нужно разделить на​ области окна, жмем​«Защита»​«Инженерные»​«Больше»​

      Введение кода в редакторе макросов в Microsoft Excel

    4. ​ создания узкопрофильного калькулятора.​ умолчанию. В обязательном​ применения различных формул​ и обучение персонала,​ погашения кредита:​ аналитическо-вычислительный инструмент, который​Для того, чтобы просмотреть​​ месяца выводится в​​ПЛТ​ займа за первый​ сделаем помесячную детализацию​ таблице задана годовая​12​ на кнопку​​, но на этот​​и выделяем там​. В поле​​ Он будет предназначен​ порядке в поле​​ и функций. Но,​ аренду площадей, закупку​​Красная цифра – аннуитет​​ часто используют кредиторы​ сумму целого массива,​

      Сохранение файла в формате xlsm в Microsoft Excel

    5. ​ ячейку. Теперь, начиная​. Но в данном​ месяц. Она составит​ выплат, чтобы видеть,​ процентная ставка, а​и полученный результат​«OK»​ раз, наоборот, устанавливаем​

      Закрытие окна редактора макросов в Microsoft Excel

    6. ​ наименование​«Минимум»​ для выполнения конкретных,​​«Тип файла»​​ если Эксель постоянно​​ сырья и материалов​​ (брали 100 000​ (банки, инвесторы и​​ или нескольких массивов​​ с данной ячейки,​

      Переход в окно макросов в Microsoft Excel

    7. ​ случае это представлено​18536,74 рубля​ сколько в конкретном​ период оплаты равен​ использовать в качестве​внизу.​ галочку около параметра​​«ПРЕОБР»​​устанавливаем значение​

      Окно макросов в Microsoft Excel

    8. ​ специфических задач и​из всех доступных​ использовать для проведения​

      Калькулятор на основе макроса запущен в Microsoft Excel

    9. ​ и т.п.;​ руб.), черная –​ т.п.) и заемщики​ данных в программе​ производим копирование формулы​ более наглядно, именно​.​ месяце мы платим​ месяцу. Поэтому делим​ аргумента. Если применяется​После этого окно параметров​​«Защищаемая ячейка»​​. Затем клацаем по​

      Переход к вычислению в калькуляторе на основе макроса запущен в Microsoft Excel

    10. ​«0»​ размещен непосредственно на​ форматов выбираем наименование​ подобных расчетов, то​анализ оборотного капитала, активов​ дифференцированный способ.​ (предприниматели, компании, частные​​ Microsoft Excel существует​​ в пустые элементы​

      Результат вычисления в калькуляторе на основе макроса запущен в Microsoft Excel

    11. ​ как сумма оплаты​Затем, как уже говорилось​ по телу займа,​ годовую ставку, а​ ежеквартальный вид оплаты,​ Excel будет закрыто.​. Затем щелкаем по​ кнопке​. Таким образом, в​​ листе Excel. Для​​«Книга Excel с поддержкой​ актуальным становится вопрос​​ и основных средств;​​Проведем расчет процентов по​

      Переход в окно макросов в программе Microsoft Excel

    12. ​ лица и т.д.).​ функция «СУММ».​ столбца с помощью​ по телу займа​​ выше, нам следует​​ а сколько составляет​

      Переход в параметры макроса в Microsoft Excel

    13. ​ вернее ссылку на​ то в этом​ Чтобы запустить калькулятор,​ кнопке​«OK»​ данную ячейку можно​ создания этого инструмента​ макросов (*.xlsm)»​ организации необходимых для​источники финансирования;​ кредиту в Excel​Быстро сориентироваться в мудреных​Выделяем ячейку, в которую​ маркера заполнения.​ и процентам.​ скопировать данную формулу​​ величина процентов. Для​​ ячейку, в которой​ случае годовую ставку​ нужно кликнуть на​​«OK»​​.​ будет вводить только​ будут применяться встроенные​. После данного шага​ этого инструментов прямо​анализ рисков;​ и вычислим эффективную​ формулах, рассчитать проценты,​​ хотим, чтобы выводилась​​Помесячный расчет остатков к​Теперь нужно добавить данные​​ на остальные ячейки​​ этих целей чертим​ она содержится, на​​ нужно разделить на​​ одноименный значок, который​

      Окно параметров макроса в Microsoft Excel

    14. ​.​Происходит открытие окна аргументов​ действительные числа (включая​ функции Эксель.​ клацаем по кнопке​

    Закрытие окна макросов в Microsoft Excel

    ​ на листе, что​прогнозные отчеты (окупаемость, ликвидность,​ процентную ставку, имея​​ суммы выплат, переплату​​ сумма. Кликаем по​ оплате по кредиту​ в столбец, где​ столбца с помощью​ в Экселе таблицу,​ число​

    ​4​ теперь располагается на​

    Способ 2: применение функций

    ​После этого перемещаемся во​ оператора​ дробные), которые больше​Для примера создадим инструмент​«Сохранить»​ значительно повысит скорость​ платежеспособность, финансовая устойчивость​ следующую информацию по​ позволяют функции программы​ кнопке «Вставить функцию»,​

    ​ сделан за весь​ будет ежемесячно отображаться​ маркера заполнения. Для​ которую будем заполнять​12​​и т.д.​​ панели быстрого доступа.​ вкладку​ПРЕОБР​ нуля.​ конвертации величин массы.​в нижней части​ вычислений и уровень​ и т.д.).​

    ​ предлагаемому банком кредиту:​

    ​ Microsoft Excel.​​ расположенной слева от​ кредитный период. Как​ остаток суммы по​ этого устанавливаем курсор​ данными. Строки этой​, соответствующее количеству месяцев​

    ​«Кпер»​​После этого инструмент​«Рецензирование»​. В поле​После этого перемещаемся во​ В процессе его​ окна.​

    ​ удобства для пользователя.​​Чтобы проект вызывал доверие,​Рассчитаем ежемесячную процентную ставку​Ежемесячные выплаты зависят от​ строки формул.​ и положено, на​ кредиту, который ещё​ в нижний правый​

    ​ таблицы будут отвечать​ в году. Деление​обозначает общее количество​«Калькулятор»​и жмем на​«Число»​ вкладку того же​ создания нами будет​После этого можно закрывать​

    • ​ Давайте выясним, как​​ все данные должны​
    • ​ и платежи по​​ схемы погашения кредита.​
    • ​Открывается окно Мастера функций.​​ конец срока эта​
    • ​ требуется заплатить. В​​ угол ячейки, в​
    • ​ соответствующему периоду, то​​ выполняем прямо в​
    • ​ периодов выплат по​​будет запущен. Функционирует​
    • ​ иконку​​следует ввести координаты​

    ​ окна​ использована функция​ окно редактора макросов,​ сделать подобный калькулятор​ быть подтверждены. Если​ кредиту:​ Различают аннуитетные и​

    1. ​ В списке функций​ сумма равна нулю.​ первой ячейке столбца​ которой содержится формула.​
      • ​ есть, месяцу. Учитывая,​​ поле окна аргументов.​
      • ​ кредиту. То есть,​​ он, как обычный​
      • ​«Защитить лист»​​ ячейки под наименованием​
      • ​«Сообщение для ввода»​​ПРЕОБР​

      ​ просто нажав на​ в Экселе.​ у предприятия несколько​Заполним таблицу вида:​ дифференцированные платежи:​ ищем функцию «СУММ».​

      ​Таким образом, мы произвели​​«Остаток к выплате»​​ Курсор преобразуется при​​ что период кредитования​​В поле​​ если заём берется​​ физический аналог, только​, которая расположена в​«Конвертируемая величина»​​. Тут можно дать​​. Данный оператор относится​ стандартный значок закрытия​

      Заготовка калькулятора конвертации массы в Microsoft Excel

    2. ​Скачать последнюю версию​ статей доходов, то​​Комиссия берется ежемесячно со​​Аннуитет предполагает, что клиент​ Выделяем её, и​ не просто расчет​расчет будет самый​ этом в крестик,​ у нас составляет​«Кпер»​ на один год​​ на кнопки нужно​​ блоке инструментов​. Для этого ставим​​ пояснение, что именно​​ к инженерному блоку​​ в виде красного​​ Excel​

      Переход к проверке данных в Microsoft Excel

    3. ​ прогноз составляется отдельно​​ всей суммы. Общий​​ вносит каждый месяц​ жмем на кнопку​​ оплаты по кредиту,​​ простой. Нам нужно​​ который называется маркером​​24​устанавливается срок кредитования.​​ с ежемесячной оплатой,​​ нажимать курсором мышки,​​«Изменения»​​ в курсор в​ нужно вводить пользователю.​ встроенных функций Эксель.​​ квадрата с белым​​Особенно насущной данная задача​​ по каждой.​​ платеж по кредиту​​ одинаковую сумму.​​ «OK».​ а организовали своеобразный​ отнять от первоначальной​ заполнения. Зажимаем левую​месяца, то и​ Он у нас​

      Окно проверки вводимых значений в Microsoft Excel

    4. ​ то число периодов​ её левой кнопкой.​.​​ поле и кликаем​​ Он его увидит​ Его задачей является​ крестиком в его​ становится в случае​Финансовая модель – это​ – это аннуитетный​При дифференцированной схеме погашения​​В открывшемся окне аргументов​​ кредитный калькулятор. Который​​ величины займа, которая​ кнопку мыши и​​ количество строк тоже​

      Сообщение для ввода в окне проверки вводимых значений в Microsoft Excel

    5. ​ равен​​ считается​​Как видим, в Экселе​​Открывается окно установки защиты​​ левой кнопкой мыши​ при выделении ячейки​ преобразование величин одной​ правом верхнем углу.​ необходимости постоянно проводить​​ план снижения рисков​ платеж плюс комиссия.​​ долга перед финансовой​ функции вводим координаты​ будет действовать по​ указана в таблице​ тянем его вниз​ будет соответствующим. В​​24​​12​

      Сообщение об ошибке в окне проверки вводимых значений в Microsoft Excel

    6. ​ существует очень много​ листа. В поле​ по этой ячейке.​

      Подсказка для ввода при выделении ячеки в Microsoft Excel

    7. ​ ввода величины. В​ меры измерения в​Чтобы запустить вычислительный инструмент​ однотипные вычисления и​ при инвестировании. Детализация​ Сумма основного долга​ организацией проценты начисляются​​ ячеек, сумму которых​​ аннуитетной схеме. Если​

      Сообщение об ошибке в Microsoft Excel

    8. ​ с первичными данными,​ до конца таблицы.​

      Корректная величина введена в Microsoft Excel

    9. ​ столбцах указана выплата​​месяцам. Можно занести​​, если на два​ вариантов создания калькуляторов​«Пароль для отключения защиты​ Её адрес тут​ поле​ другую. Синтаксис данной​ при помощи макроса,​ расчеты, связанные с​ и реалистичность –​​ и сумма процентов​​ на остаток кредитной​ собираемся подсчитать. Конечно,​

      ​ в исходной таблице​ платеж по телу​​В итоге все ячейки​​ тела займа, выплата​ в поле число​​ года, то число​​ для различных нужд.​

      Переход к проверке данных в программе Microsoft Excel

    10. ​ листа»​ же отображается в​«Сообщение»​​ функции следующий:​​ находясь во вкладке​​ определенным видом деятельности.​​ обязательные условия. При​​ – составляющие части​​ суммы. Поэтому ежемесячные​​ вручную вводить координаты​​ мы, например, поменяем​ кредита за первый​​ столбца заполнены. Теперь​​ процентов, общий ежемесячный​24​ периодов –​​ Особенно эта возможность​​вводим пароль, с​ поле. Таким же​напишем следующее:​​=ПРЕОБР(число;исх_ед_изм;кон_ед_изм)​​«Разработчик»​

      Окно проверки вводимых значений в программе Microsoft Excel

    11. ​ В целом все​ составлении проекта в​​ аннуитетного платежа.​​ платежи будут уменьшаться.​ неудобно, поэтому кликаем​ величину займа и​ месяц в расчетной​ мы имеем график​ платеж, который является​вручную, но мы,​

      Список с наименованием единиц измерения массы в Microsoft Excel

    12. ​24​ полезна при проведении​​ помощью которого при​​ образом вводим координаты​«Введите величину массы, которую​​«Число»​​, клацаем по значку​ калькуляторы в Excel​ программе Microsoft Excel​Сумма основного долга =​

      Второй список едниц измерения в Microsoft Excel

    13. ​Чаще применяется аннуитет: выгоднее​ по кнопке, которая​​ годовой процентной ставки,​​ таблице. Но, учитывая​ выплаты тела займа​​ суммой предыдущих двух​​ как и в​. Если кредит берется​ узкопрофильных вычислений. Ну,​ необходимости в будущем​​ в поля​​ следует преобразовать»​

      Переход в Мастер функций в в Microsoft Excel

    14. ​— это аргумент,​​«Макросы»​​ можно разделить на​ соблюдают правила:​​ аннуитетный платеж –​​ для банка и​ располагается справа от​​ то в итоговой​​ тот факт, что​ помесячно. Как и​​ колонок, а также​​ предыдущем случае, указываем​

      Переход в окно аргументов функции ПРЕОБР в Microsoft Excel

    15. ​ на два года​ а для обычных​​ можно будет снять​​«Исходная единица измерения»​​.​​ имеющий вид числового​на ленте в​​ две группы: универсальные​​исходные данные, расчеты и​ проценты.​ удобнее для большинства​ поля ввода данных.​ таблице произойдет автоматический​ одно из чисел​ говорилось уже выше,​ оставшаяся сумма к​ ссылку на месторасположение​ с ежеквартальной оплатой,​​ потребностей можно воспользоваться​​ защиту. Остальные настройки​​и​​Затем перемещаемся во вкладку​ значения той величины,​ блоке инструментов​ (используются для общих​ результаты находятся на​

      ​Сумма процентов = остаток​ клиентов.​После этого, окно аргументов​​ пересчет данных. Поэтому​​ у нас уже​

      окно аргуметов функции ПРЕОБР в Microsoft Excel

    16. ​ величина оплаты по​ выплате.​ данного показателя в​​ то число периодов​​ и встроенным инструментом​ можно оставить без​«Конечная единица измерения»​«Сообщение об ошибке»​

      Результат вычисления функции ПРЕОБР в Microsoft Excel

    17. ​ которую надо конвертировать​«Код»​​ математических вычислений) и​​ разных листах;​​ долга * месячную​​Ежемесячная сумма аннуитетного платежа​​ функции сворачивается, а​​ её можно использовать​ идет со знаком​ данной статье с​Для определения величины оплаты​ исходной таблице.​ равно​

      Повторный вычисления функции ПРЕОБР в Microsoft Excel

    18. ​ программы.​ изменений. Жмем на​. Только на этот​. В поле​ в другую меру​.​ узкопрофильные. Последняя группа​структура расчетов логичная и​ процентную ставку.​ рассчитывается по формуле:​ мы можем выделить​ не только один​«-»​ каждым новым периодом​ по телу займа​В поле​8​Автор: Максим Тютюшев​ кнопку​ раз кликаем по​«Сообщение»​ измерения.​После этого запускается окно​ делится на множество​ «прозрачная» (никаких скрытых​Остаток основного долга =​

      ​А = К * S​ те ячейки, или​ раз для конкретного​, то их следует​ увеличивается.​ используем функцию​«Пс»​.​Прежде, чем брать заем,​«OK»​ ячейкам с такими​нам следует написать​«Исходная единица измерения»​ макросов. Выбираем наименование​ видов: инженерные, финансовые,​ формул, ячеек, цикличных​ остаток предыдущего периода​где:​

      ​ массивы ячеек, сумму​ случая, а применять​ не отнять, а​Теперь нам нужно сделать​ОСПЛТ​указывается первоначальная величина​«Пс»​ неплохо было бы​.​ же названиями, как​ ту рекомендацию, которую​​— аргумент, который​​ того макроса, который​

      Переход в формат ячеек в Microsoft Excel

    19. ​ кредитные инвестиционные и​ ссылок, ограниченное количество​ – сумму основного​​А – сумма платежа​​ значений которых хотим​ в различных ситуациях​​ сложить. Делаем это​​ месячный расчет оплаты​, которая как раз​​ займа. Она равна​​указывает приведенную стоимость​

      Снятие защиты с ячеек в Microsoft Excel

    20. ​ рассчитать все платежи​Затем открывается ещё одно​ у этих полей.​ увидит пользователь, если​ определяет единицу измерения​ мы только что​ т.д. Именно от​​ имен массивов);​​ долга в предыдущем​

      Переход в формат ячеек в программе Microsoft Excel

    21. ​ по кредиту;​ подсчитать. После того,​​ для расчета кредитных​​ и жмем на​ по процентам. Для​ предназначена для этих​​500000 рублей​​ на настоящий момент.​ по нему. Это​​ небольшое окошко, в​​После того, как все​

      Установка защиты ячейки в Microsoft Excel

    22. ​ введет некорректные данные.​ величины, подлежащую конвертации.​​ создавали, выделяем его​​ функциональных возможностей калькулятора,​столбцы соответствуют друг другу;​​ периоде.​​К – коэффициент аннуитетного​ как массив выделен,​​ вариантов по аннуитетной​​ кнопку​

      Установка защиты листа в Microsoft Excel

    23. ​ этих целей будем​ целей. Устанавливаем курсор​​. Как и в​ Говоря простыми словами,​​ убережет заёмщика в​ котором следует повторить​ данные введены, жмем​ Напишем следующее:​ Он задается специальным​ и жмем на​ в первую очередь,​в одной строке –​​Опираясь на таблицу ежемесячных​​ платежа;​

      Окно защиты листа в Microsoft Excel

    24. ​ и его адрес​ схеме.​Enter​ использовать оператор​ в ячейку, которая​ предыдущих случаях, указываем​​ это общая величина​​ будущем от различных​

      Повторный ввод пароля в Microsoft Excel

    25. ​ ввод пароля. Делаем​ на кнопку​«Вводимое значение должно быть​ кодом, который соответствует​ кнопку​ зависит выбор алгоритма​ однотипные формулы.​

    Сообщение о невозможности вносить изменения в ячейку в Microsoft Excel

    ​ платежей, рассчитаем эффективную​S – величина займа.​ появился в специальном​Урок:​.​

    ​ПРПЛТ​ находится в строке​ ссылку на элемент​ займа на начало​ неожиданных неприятностей и​ это и жмем​«OK»​

    ​ положительным числом».​ определенной единице измерения.​

    Способ 3: включение встроенного калькулятора Excel

    ​«Выполнить»​ его создания.​​ процентную ставку:​Формула коэффициента аннуитета:​ поле, жмем на​Финансовые функции в Excel​А вот вычисление остатка​. Выделяем первую пустую​

    1. ​«1»​ листа, в котором​​ кредитования, то есть,​​ разочарований, когда выяснится,​

      Переход во вкладку Файл в Microsoft Excel

    2. ​ на кнопку​.​​После этого, чтобы​​«Конечная единица измерения»​

      Перемещение в окно параметров в Microsoft Excel

    3. ​.​Прежде всего, рассмотрим алгоритмы​Для оценки эффективности инвестиций​​взяли кредит 500 000​​К = (i *​

      Переход в подраздел Панель быстрого доступа окна параметраметров в Microsoft Excel

    4. ​ кнопку справа от​Как видим, при помощи​ к выплате после​ ячейку в столбце​и в столбце​ содержится данный показатель.​ та сумма, которую​ что переплата слишком​«OK»​Как только мы выполнили​ завершить работу в​— аргумент, определяющий​После выполнения данного действия​

      ​ создания пользовательских калькуляторов.​ применяются две группы​​ руб.;​​ (1 + i)^n)​ этого поля.​​ программы Excel в​​ второго и последующих​«Выплата по процентам»​«Выплата по телу кредита»​​В поле​​ вы берете взаймы,​ большая. Помочь в​.​ последнее действие, в​ окне проверки вводимых​ единицу измерения той​

      ​ запускается калькулятор, созданный​ Начнем с создания​​ методов:​​вернули в банк –​ / ((1+i)^n-1)​

      • ​Мы опять возвращаемся в​
      • ​ домашних условиях можно​

      ​ месяцев будет несколько​. Жмем на кнопку​. Жмем на кнопку​«Бс»​ без учета процентов​ данном расчете могут​

      ​После этого при попытке​ окошке ячейки​ значений и сохранить​​ величины, в которую​​ на основе макроса.​ простейшего универсального калькулятора.​​статистические (PP, ARR);​​ 684 881,67 руб.​где i – процентная​ окно аргументов функции.​

      Добавление калькулятора на панель быстрого доступа в Microsoft Excel

    5. ​ без проблем рассчитать​​ сложнее. Для этого​​«Вставить функцию»​«Вставить функцию»​указывается величина займа,​​ и других дополнительных​​ инструменты программы Excel.​

      Закртие окна параметров в Microsoft Excel

    6. ​ внесения любых изменений​«Результат конвертации»​ введенные нами настройки,​ преобразуется исходное число.​Для того, чтобы произвести​ Данный инструмент будет​динамические (NPV, IRR, PI,​

      Запуск калькулятора в Microsoft Excel

    7. ​ (сумма всех платежей​​ ставка за месяц,​​ Если нужно добавить​ общий ежемесячный кредитный​ нам нужно отнять​.​.​ после полной его​

    Калькулятор запущен в Microsoft Excel

    ​ выплат.​ Давайте выясним, как​ в ячейку вывода​тут же отобразился​ жмем на кнопку​ Он также задается​ в нем вычисление,​ выполнять элементарные арифметические​ DPP).​ по кредиту);​ результат деления годовой​

    ​ ещё один массив​

    lumpics.ru

    Вычисление аннуитетного платежа в Microsoft Excel

    Аннуитетный платеж по кредиту в Microsoft Excel

    ​ платеж по аннуитетной​ от тела кредита​В запустившемся окне​Переходим в​ оплаты. Как помним,​«Бс»​ рассчитать аннуитетные платежи​ результата действия будут​ результат преобразования величины,​«OK»​ с помощью специальных​ записываем в поле​ действия: сложение, умножение​Срок окупаемости:​переплата составила 184 881,​ ставки на 12;​

    ​ данных в общую​ схеме, используя для​

    Расчет оплаты

    ​ на начало кредитования​Мастера функций​Мастер функций​

    • ​ это значение практически​
    • ​— это будущая​

    ​ по кредиту в​ блокироваться, о чем​ согласно ранее введенным​.​ кодов.​ необходимое действие. Удобнее​ вычитание, деление и​Коэффициент PP (период окупаемости)​ 67 руб.;​n – срок кредита​ сумму, то повторяем​ этих целей оператор​ общую сумму платежей​в категории​

    ​. В категории​ всегда равно нулю.​ стоимость. Эта величина,​ этой программе.​ сообщается в появляющемся​ данным.​Как видим, при выделении​Нам следует подробнее остановиться​ всего использовать для​ т. д. Он​ показывает временной отрезок,​процентная ставка – 184​ в месяцах.​ те же действия,​ПЛТ​ по телу займа​«Финансовые»​«Финансовые»​ Устанавливаем в данном​ которую будет составлять​Скачать последнюю версию​ диалоговом окне.​Давайте изменим данные в​ ячейки появляется подсказка​ на этих кодах,​ этих целей числовой​ реализован с помощью​ за который окупятся​ 881, 67 /​В программе Excel существует​

    ​ о которых говорилось​. Кроме того, при​ за предыдущий период.​производим выделение наименования​отмечаем наименование​ поле число​ тело займа на​ Excel​Таким образом, мы создали​ ячейках​ для ввода.​ так как они​ блок клавиатуры, который​ макроса. Поэтому прежде,​ первоначальные вложения в​

    Этап 1: расчет ежемесячного взноса

    ​ 500 000 *​ специальная функция, которая​ выше, но только​ помощи функций​ Устанавливаем знак​​ПРПЛТ​​«ОСПЛТ»​«0»​ момент завершения кредитного​Прежде всего, нужно сказать,​

    ​ полноценный калькулятор для​

    ​«Конвертируемая величина»​Попробуем ввести туда некорректное​ нам понадобятся в​ расположен справа. После​ чем приступить к​ проект (когда вернутся​

    ​ 100, или 37%.​​ считает аннуитетные платежи.​​ в поле с​ОСПЛТ​«=»​. Выполняем щелчок по​и жмем кнопку​. Хотя этот аргумент​ договора. В большинстве​ что существует два​​ конвертации величины массы​​,​ значение, например, текст​ дальнейшем при создании​ того, как выражение​ процедуре создания, нужно​ инвестированные деньги).​Безобидная комиссия в 1​​ Это ПЛТ:​​ параметром «Число 2».​

    ​и​​во второй ячейке​ кнопке​«OK»​ можно вообще опустить.​ случаев данный аргумент​ вида кредитных платежей:​ в различные единицы​«Исходная единица измерения»​​ или отрицательное число.​​ калькулятора. Конкретно нам​ введено, жмем на​ удостовериться, что у​​Экономическая формула расчета срока​​ % обошлась кредитополучателю​Заполним входные данные для​ При необходимости, подобным​ПРПЛТ​ столбца​​«OK»​​.​

    ​В поле​​ равен​Дифференцированные;​ измерения.​и​ Как видим, появляется​ понадобятся коды единиц​ кнопку​ вас включены макросы​ окупаемости:​ очень дорого.​ расчета ежемесячных платежей​

    ​ образом можно вводить​​можно произвести расчет​«Остаток к выплате»​.​Запускается окно аргументов оператора​«Тип»​«0»​Аннуитетные.​Кроме того, в отдельной​​«Конечная единица измерения»​​ сообщение об ошибке​ измерения массы. Вот​«OK»​ и панель разработчика.​где IC – первоначальные​Эффективная процентная ставка кредита​ по кредиту. Это​ адреса практически неограниченного​ величины платежей по​

    ​. Далее указываем ссылку​​Происходит запуск окна аргументов​​ ОСПЛТ. Он имеет​указываем в начале​, так как заемщик​При дифференцированной схеме клиент​ статье рассказывается о​​. Как видим, функция​​ и ввод блокируется.​ их перечень:​​.​​ Если это не​ вложения инвестора (все​ без комиссии составит​ сумма займа, проценты​ количества массивов. После​ телу кредита и​ на ячейку, в​ функции​ следующий синтаксис:​

    ​ или в конце​ на конец срока​ вносит в банк​ создании ещё одного​ при изменении параметров​ Жмем на кнопку​g​Затем на экране появляется​ так, то обязательно​​ издержки),​​ 13%. Подсчет ведется​​ и срок.​​ того, как все​ по процентам за​​ которой содержится первоначальная​​ПРПЛТ​=ОСПЛТ(Ставка;Период;Кпер;Пс;Бс)​ месяца производится оплата.​

    1. ​ кредитования должен полностью​ ежемесячно равную долю​ вида узкопрофильного калькулятора​ автоматически пересчитывает результат.​«Отмена»​​– грамм;​​ небольшое окошко, которое​ следует активировать работу​

      Переход в Мастер функций в Microsoft Excel

    2. ​CF – денежный поток,​​ по той же​​Составим график погашения кредита.​​ аргументы функции занесены,​​ указанный период. Применяя​​ сумма кредита. Делаем​​. Её синтаксис выглядит​Как видим, аргументы данной​​ У нас, как​​ рассчитаться с кредитором.​

      Переход в окно аргументов функции ПЛТ в Microsoft Excel

    3. ​ выплат по телу​ в Экселе для​​ Это говорит о​​.​

      ​kg​​ содержит в себе​​ макросов.​ или чистая прибыль​ схеме.​ Пока пустой.​ жмем на кнопку​ весь этот багаж​ её абсолютной, выделив​ следующим образом:​ функции почти полностью​ и в большинстве​ Указанный аргумент не​ кредита плюс платежи​ расчета платежей по​ том, что наш​А вот корректная величина​– килограмм;​ ответ решения заданного​После того, как указанные​ (за определенный период).​Согласно Закону о потребительском​В первую ячейку столбца​ «OK».​ функций вместе, существует​ и нажав на​​=ПРПЛТ(Ставка;Период;Кпер;Пс;Бс)​​ совпадают с аргументами​ случаев, она производится​ является обязательным. Поэтому,​ по процентам. Величина​

      ​ кредитам.​​ калькулятор полностью функционирует.​​ вводится без проблем.​mg​ выражения. Для его​​ выше предварительные настройки​​Расчет окупаемости инвестиционного проекта​ кредите для расчета​​ «Платежи по кредиту»​​После этого, в ячейке,​ возможность создать мощный​ клавишу​Как видим, аргументы данной​ оператора​ в конце месяца.​

      ​ если он опускается,​​ процентных выплат каждый​​Урок: Расчет аннуитетного платежа​Но мы не сделали​​Теперь переходим к полю​​– миллиграмм;​ закрытия жмем на​ выполнены, перемещаемся во​ в Excel:​ полной стоимости кредита​

      ​ вводиться формула расчета​​ в которую мы​​ кредитный калькулятор, который​F4​ функции абсолютно идентичны​ПЛТ​ Поэтому устанавливаем число​ то считается равным​ месяц уменьшается, так​​ в Экселе​​ одну важную вещь.​«Исходная единица измерения»​

      ​lbm​​ кнопку​​ вкладку​Составим таблицу с исходными​ (ПСК) теперь применяется​ кредита аннуитетными платежами​ установили вывод результатов,​ можно будет использовать​. Затем ставим знак​ аналогичным элементам оператора​​, только вместо необязательного​​«0»​ нулю.​ как уменьшается тело​Кроме того, в Экселе​ Ячейки для ввода​. Тут мы сделаем​– английский фунт;​«OK»​«Разработчик»​

      ​ данными. Стоимость первоначальных​ новая формула. ПСК​ в Excel: =ПЛТ($B$3/12;​​ отобразиться общая сумма​​ не один раз​

      Окно аргументов функции ПЛТ в Microsoft Excel

    4. ​«+»​ОСПЛТ​ аргумента​. Как и в​Аргумент​ займа, с которого​ имеется собственный встроенный​ данных у нас​​ так, что пользователь​​ozm​.​. Жмем на иконку​ инвестиций – 160000​ определяется в процентах​ $B$4; $B$2). Чтобы​ данных всех указанных​ для вычисления аннуитетного​

      Результат расчета ежемесячного платежа в Microsoft Excel

    5. ​, так как второе​. Поэтому просто заносим​«Тип»​ случае с предыдущим​«Тип»​ они рассчитываются. Таким​ универсальный калькулятор. Правда,​ защищены от введения​​ будет выбирать значение​​– унция;​Но согласитесь, что довольно​​«Visual Basic»​​ рублей. Ежемесячно поступает​ с точностью до​ закрепить ячейки, используем​ ячеек.​ платежа.​​ значение у нас​​ в окно те​

      Общая величина выплат в Microsoft Excel

    6. ​добавлен обязательный аргумент​ аргументом, в данное​определяет время расчета:​ образом и общий​ по умолчанию кнопка​ некорректных значений, а​ из списка, состоящего​sg​ неудобно каждый раз,​, которая размещена на​ 56000 рублей. Для​ третьего знака после​ абсолютные ссылки. Можно​​Сумму данных в ячейках​​Автор: Максим Тютюшев​ и так будет​ же данные, которые​«Период»​ поле можно ничего​ в конце или​ ежемесячный платеж тоже​​ его запуска отсутствует​​ вот элемент для​

    Сумма переплаты по кредиту в Microsoft Excel

    ​ из тех семи​​– слэг;​

    Этап 2: детализация платежей

    ​ когда потребуется произвести​ ленте в блоке​ расчета денежного потока​ запятой по следующей​ вводить в формулу​ в программе Microsoft​Во время работы в​ отрицательным. После этого​ мы вводили в​. Он указывает на​ не вводить, тогда​ в начале периода.​ уменьшается.​ на ленте или​ вывода данных никак​ величин массы, перечень​u​ вычислительные действия, переходить​​ инструментов​​ нарастающим итогом была​ формуле:​ непосредственно числа, а​ Excel можно подсчитать​ программе Microsoft Excel​ кликаем по кнопке​ предыдущем окне аргументов.​ номер периода выплаты,​ программа по умолчанию​ В первом случае​При аннуитетной схеме используется​

    Таблица выплат в Microsoft Excel

    1. ​ на панели быстрого​ не защищен. А​ которых был приведен​​– атомная единица.​​ в окно макросов.​«Код»​ использована формула: =C4+$C$2.​ПСК = i *​ не ссылки на​​ также с использованием​​ часто требуется подбить​​«Вставить функцию»​​ Не забываем при​​ а в нашем​​ будет считать, что​

      Вставить функцию в Microsoft Excel

    2. ​ он принимает значение​​ несколько другой подход.​​ доступа. Рассмотрим, как​​ ведь в него​​ выше при описании​​Нужно также сказать, что​​ Давайте упростим реализацию​​.​​Рассчитаем срок окупаемости инвестированных​

      Переход в окно аргументов функции ОСПЛТ в Microsoft Excel

    3. ​ ЧБП * 100;​ ячейки с данными.​ простой формулы сложения.​

      ​ сумму в столбцах​

      ​.​ этом, что ссылка​ конкретном случае на​ в нем расположено​​«0»​​ Клиент ежемесячно вносит​ активировать её.​​ вообще нельзя ничего​​ аргументов функции​​ все аргументы данной​​ запуска окна вычислений.​Запускается окно редактора VBA.​ средств. Использовали формулу:​где i – процентная​ Тогда она примет​

      ​ Для этого, выделяем​ и строках таблиц,​Запускается​​ в поле​​ номер месяца.​ значение равное нулю.​, а во втором​​ одинаковую сумму общего​​После запуска программы Excel​ вводить, иначе формула​ПРЕОБР​ функции можно задавать,​ Для этого, находясь​ Если центральная область​ =B4/C2 (сумма первоначальных​ ставка базового периода;​ следующий вид: =ПЛТ(18%/12;​ ячейку, в которой​ а также просто​Мастер функций​«Период»​Заполняем уже знакомые нам​После того, как все​ –​ платежа, который состоит​​ перемещаемся во вкладку​​ вычисления будет просто​. Ввести другие значения​ как значениями, так​ во вкладке​ у вас отобразилась​ инвестиций / сумма​​ЧБП – число базовых​​ 36; 100000).​

      Окно аргументов функции ОСПЛТ в Microsoft Excel

    4. ​ должна находиться сумма,​ определить сумму диапазона​, в котором нужно​должна быть относительной,​​ поля окна аргументов​​ данные введены, жмем​​«1»​​ из выплат по​«Файл»​ удалена и калькулятор​​ не получится.​​ и ссылками на​«Разработчик»​ серым цветом, а​​ ежемесячных поступлений).​​ периодов в календарном​Ячейки окрасились в красный​ и ставим в​ ячеек. Программа предоставляет​ переместиться в категорию​ а во всех​ функции​ на кнопку​. Большинство банковских учреждений​

      ​ телу кредита и​.​ придет в нерабочее​Выделяем ячейку, которая находится​ ячейки, где они​​, щелкаем по уже​​ не белым, то​

      Аргумент Период в окне аргументов функции ОСПЛТ в Microsoft Excel

    5. ​Так как у нас​ году.​ цвет, перед числами​ ней знак «=».​ несколько инструментов для​«Математические»​​ других полях координаты​​ОСПЛТ​

      Результат вычисления функции ОСПЛТ в Microsoft Excel

    6. ​«OK»​ используют именно вариант​ оплаты процентов. Изначально​Далее в открывшемся окне​ состояние. По ошибке​ под наименованием​ размещены.​ знакомой нам иконке​ это означает, что​ дискретный период, то​Возьмем для примера следующие​ появился знак «минус»,​ После этого, поочередно​ решения данного вопроса.​. Там выделяем надпись​ нужно привести к​теми самыми данными,​

      Маркер заполнения в Microsoft Excel

    7. ​.​ с оплатой в​ процентные взносы насчитываются​ переходим в раздел​ в эту ячейку​«Исходная единица измерения»​Прежде всего, делаем заготовку.​«Макросы»​ поле введения кода​ срок окупаемости составит​

      Величина оплаты тела кредита помесячно в Microsoft Excel

    8. ​ данные по кредиту:​ т.к. мы эти​ кликаем по каждой​ Давайте разберемся, как​«СУММ»​​ абсолютному виду. После​​ что были использованы​После этого в ячейку,​​ конце периода. Этот​​ на всю сумму​​«Параметры»​​ можете ввести данные​

      Переход в Мастер функций в программе Microsoft Excel

    9. ​. Снова клацаем по​​ У нашего вычислительного​​.​​ отсутствует. Для включения​​ 3 месяца.​​Для расчета полной стоимости​​ деньги будем отдавать​ ячейке, из тех,​​ суммировать ячейки в​​и жмем на​

      Переход в окно аргументов функции ПРПЛТ в Microsoft Excel

    10. ​ этого щелкаем по​ для функции​​ которую мы выделили​​ аргумент тоже является​ займа, но по​

      ​.​

      ​ и вы сами,​ иконке​ инструмента будет четыре​​Затем в окне макросов​​ его отображения переходим​Данная формула позволяет быстро​ кредита нужно составить​ банку, терять.​ сумму значений которых​ Excel.​ кнопку​ кнопке​​ПЛТ​​ в первом пункте​ необязательным, и если​ мере того, как​После запуска окошка параметров​ не говоря уже​«Проверка данных»​ поля:​​ выбираем наименование нужного​​ в пункт меню​

      Окно аргументов функции ПРПЛТ в Microsoft Excel

    11. ​ найти показатель срока​ график платежей (порядок​​ вам нужно посчитать.​Скачать последнюю версию​

      Результат вычисления функции ПРПЛТ в Microsoft Excel

    12. ​«OK»​«OK»​. Только учитывая тот​ данного руководства, выводится​ его опустить считается,​ тело уменьшается, сокращается​ Excel перемещаемся в​ о сторонних пользователях.​.​Конвертируемая величина​ объекта. Щелкаем по​«View»​

      График выплат по процентам за кредит в Microsoft Excel

    13. ​ окупаемости проекта. Но​ см. выше).​Дифференцированный способ оплаты предполагает,​ После того, как​ Excel​.​.​ факт, что в​ результат вычисления. Как​ что он равен​​ и начисление процентов.​​ подраздел​​ В этом случае​​В открывшемся окне проверки​;​​ кнопке​​и жмем по​ использовать ее крайне​​Нужно определить базовый период​​ что:​ адрес ячейки добавлен​Самый известный и удобный​Запускается окно аргументов функции​​Затем результат расчета суммы​​ будущем будет применяться​​ видим, величина ежемесячного​​ нулю.​

      Сумма общего ежемесячного платежа в Microsoft Excel

    14. ​ Но общая сумма​«Панель быстрого доступа»​ придется заново записывать​ данных переходим во​Исходная единица измерения​«Параметры…»​ надписи​ сложно, т.к. ежемесячные​ (БП). В законе​сумма основного долга распределена​ в строку формул,​​ в использовании инструмент​​СУММ​ оплаты по процентам​ копирование формулы посредством​​ общего платежа по​​Теперь настало время перейти​ оплаты остается неизменной​.​ всю формулу. Нужно​ вкладку​;​

      Общая сумма ежемесячного платежа в Microsoft Excel

    15. ​.​«Code»​ денежные поступления в​ сказано, что это​ по периодам выплат​ вводим знак «+»​ для определения суммы​​. Указанный оператор служит​​ за кредит за​ маркера заполнения, нужно​ займу составляет​ к конкретному примеру​ за счет ежемесячного​Перед нами открывается окно,​ заблокировать любой ввод​«Параметры»​Результат конвертации​После этого запускается окошко​в появившемся списке.​ реальной жизни редко​ стандартный временной интервал,​ равными долями;​​ с клавиатуры, и​​ данных в ячейках​ для того, чтобы​ первый месяц выводится​ сделать все ссылки​23536,74 рубля​​ расчета ежемесячного взноса​​ увеличения величины выплат​

      Остаток к выплате после первого месяца кредитования в Microsoft Excel

    16. ​ правая часть которого​ данных сюда.​. В поле​;​ ещё меньше предыдущего.​ Можно вместо этих​ являются равными суммами.​ который встречается в​проценты по кредиту начисляются​ так после ввода​ в программе Microsoft​ суммировать данные в​​ в соответствующую ячейку.​​ в полях абсолютными,​. Пусть вас не​​ при помощи функции​​ по телу кредита.​ разделена на две​Проблема состоит в том,​«Тип данных»​Конечная единица измерения​ В нем мы​ манипуляций нажать функциональную​​ Более того, не​​ графике погашения чаще​​ на остаток.​​ координат каждой ячейки.​ Excel – это​ ячейках, что нам​Применив маркер заполнения, производим​ чтобы они не​​ смущает знак «-»​​ ПЛТ. Для расчета​

      Вставить функцию в программе Microsoft Excel

    17. ​ Таким образом, с​​ области. В правой​​ что блокировка устанавливается​устанавливаем параметр​​.​​ можем задать сочетание​​ клавишу​​ учитывается инфляция. Поэтому​ всего. В примере​​Формула расчета дифференцированного платежа:​​Когда адреса всех ячеек​

      Переход в окно аргументов функции СУММ в Microsoft Excel

    18. ​ австосумма.​​ и нужно выполнить​​ копирование формулы в​ менялись. Для этого​ перед данной суммой.​ используем таблицу с​ течением времени удельный​ ее части расположены​​ на лист в​​«Список»​Устанавливаем заголовки, под которыми​

      ​ горячих клавиш, при​

      ​F7​ показатель применяется вкупе​ БП = 28​ДП = ОСЗ /​ введены, жмем кнопку​​Для того, чтобы подсчитать​​ в столбце​ остальные элементы столбца,​ требуется поставить знак​ Так Эксель указывает​ исходными данными, где​​ вес процентов в​​ инструменты, которые уже​ целом. Но если​. В поле​ будут размещаться данные​ нажатии на которые​. В любом случае​ с другими критериями​ дней.​ (ПП + ОСЗ​ Enter на клавиатуре.​ данным способом сумму,​«Выплата по телу кредита»​ таким способом получив​ доллара перед каждым​ на то, что​ указана процентная ставка​ общем ежемесячном платеже​​ добавлены на панель​​ мы заблокируем лист,​«Источник»​ поля, и выделяем​ будет запускаться калькулятор.​ поле для ввода​ оценки эффективности.​Далее находим ЧБП: 365​ * ПС)​ После этого, в​ кликаем по крайней​. Он имеет следующий​ помесячный график оплат​ значением координат по​​ это расход денежных​​ по кредиту (​

      Окно аргументов функции СУММ в Microsoft Excel

    19. ​ падает, а удельный​ быстрого доступа. В​ то не сможем​через точку с​ их форматированием (заливкой​ Важно, чтобы данное​ кода появится.​ARR, ROI – коэффициенты​ / 28 =​

      Маркер заполнения в программе Microsoft Excel

    20. ​где:​ указанной ячейке выводится​ незаполненной ячейке столбца​ синтаксис:​ по процентам за​ вертикали и горизонтали.​ средств, то есть,​

    Расчет остатка к выплате по телу кредита в Microsoft Excel

    ​12%​ вес оплаты по​ левой представлен весь​ вводить данные в​ запятой (​ и границами) для​ сочетание не использовалось​Тут в центральной области​ рентабельности, показывающие прибыльность​ 13.​ДП – ежемесячный платеж​ общая сумма введенных​ или строки, и,​=СУММ(число1;число2;…)​ заём. Как видим,​ Но легче это​ убыток.​), величина займа (​ телу растет. При​ набор инструментов, который​ поля ввода. Поэтому​;​

    Исходные данные изменены в программе Microsoft Excel

    ​ более наглядной визуализации.​​ для вызова других​

    ​ нам нужно записать​ проекта без учета​Теперь можно найти процентную​ по кредиту;​ данных.​ находясь во вкладке​В качестве аргументов выступают​ как и было​​ сделать, просто выделив​​Для того, чтобы рассчитать​500000 рублей​​ этом сам общий​​ доступен в Excel,​​ нам нужно будет​​) перечисляем коды наименований​В поля​ процессов. Поэтому первые​ сам код макроса.​ дисконтирования.​ ставку базового периода:​ОСЗ – остаток займа;​Главный недостаток этого способа​ «Главная», жмем на​ ссылки на ячейки,​ сказано ранее, из​ координаты и нажав​ общую сумму оплаты​

    ​) и срок кредита​

    lumpics.ru

    Программа Microsoft Excel: подсчет суммы

    Сумма в Microsoft Excel

    ​ ежемесячный платеж на​ включая отсутствующие на​ в свойствах формата​ величин массы для​«Конвертируемая величина»​ символы алфавита использовать​ Он имеет следующий​Формула расчета:​У нас имеются все​ПП – число оставшихся​ состоит в том,​ кнопку «Автосумма».​ в которых содержатся​

    ​ месяца в месяц​ на функциональную клавишу​

    Автосумма

    ​ за весь срок​ (​ протяжении всего срока​ ленте.​ ячеек снять возможность​ функции​,​

    ​ не рекомендуется. Первую​ вид:​где CFср. – средний​ необходимые данные –​ до конца срока​ что адрес каждой​Программа выводит формулу в​ числа. Мы устанавливаем​

    Запуск автосуммы в Microsoft Excel

    ​ величина данного вида​F4​

    Автосумма в Microsoft Excel

    ​ кредитования с учетом​24 месяца​ кредитования не меняется.​Над левой областью в​

    Результат автосуммы в Microsoft Excel

    ​ блокировки со всех​ПРЕОБР​«Исходная граница измерения»​ клавишу сочетания задает​Sub Calculator()​ показатель чистой прибыли​ подставляем их в​ погашения периодов;​ ячейки приходится вводить​ ячейку.​

    Автосумма ячеек в Microsoft Excel

    ​ курсор в поле​ платежа уменьшается.​

    Результат подсчета автосуммы в Microsoft Excel

    ​. Знак доллара будет​ погашения тела займа​). При этом оплата​Как раз на расчете​ поле​ элементов листа, потом​, о которых шел​и​ сама программа Эксель.​Dim strExpr As​ за определенный период;​ формулу ПСК: =B9*B8​ПС – процентная ставка​ отдельно, и нельзя​Для того, чтобы посмотреть​«Число1»​Теперь нам предстоит рассчитать​

    ​ расставлен в нужных​ и ежемесячных процентов,​ производится ежемесячно в​

    Автосумма для нескольких строк и столбцов Microsoft Excel

    ​ аннуитетного платежа мы​«Выбрать команды»​ вернуть эту возможность​ разговор выше. Далее​«Конечная граница измерения»​ Это клавиша​

    Результат автосуммы для нескольких строк и столбцов Microsoft Excel

    Функция «СУММ»

    ​ String​IC – первоначальные вложения​Примечание. Чтобы получить проценты​ за месяц (годовую​ выделить сразу целый​ результат, нужно нажать​

    ​. Затем зажимаем левую​ общий ежемесячный платеж.​ местах автоматически. Также​ достаточно перемножить величину​ конце каждого периода.​ и остановимся. Тем​

    Переход к вставке функции в Microsoft Excel

    ​из перечня выбираем​ только ячейке для​ жмем на кнопку​нами будут вводиться​Ctrl​’ Введение данных​

    Мастер функций в Microsoft Excel

    ​ инвестора.​ в Excel, не​ ставку делим на​ диапазон ячеек.​ на кнопку Enter​ кнопку мыши и​ Для этого вычисления​ не забываем, что​ ежемесячного платежа (​

    Окно аргументов функции в Microsoft Excel

    ​Выделяем элемент на листе,​ более, это актуально,​ пункт​ вывода результата и​«OK»​ данные, а в​. Следующую клавишу задает​ для расчета​Пример расчета в Excel:​ нужно умножать на​ 12).​Также, в программе Microsoft​ на клавиатуре.​

    Выделение диапазона в Microsoft Excel

    ​ выделяем на листе​ не следует прибегать​ годовую ставку нужно​23536,74 рубля​ в который будет​ так как в​«Команды не на ленте»​ уже после этого​.​ поле​ пользователь. Пусть это​strExpr = InputBox(«Введите​Изменим входные данные. Первоначальные​ 100. Достаточно выставить​Составим график погашения предыдущего​ Excel имеется возможность​Можно сделать и немного​ первые две ячейки​ к какому-либо оператору,​

    Переход к подсчету суммы в Microsoft Excel

    ​ разделить на​) на количество месяцев​ выводиться результат расчета,​ настоящее время большинство​. После этого в​ заблокировать лист.​

    Сумма подсчитана в Microsoft Excel

    Использование формулы

    ​Как видим, теперь, если​«Результат конвертации»​ будет клавиша​ данные»)​ вложения в размере​ для ячейки с​ кредита по дифференцированной​ просмотреть сумму выделенных​ по-другому. Если мы​ столбца​ так как можно​12​ (​ и щелкаем по​ банков используют именно​ списке инструментов левой​Кликаем левой кнопкой мыши​ выделить поле​— выводиться конечный​V​’ Вычисление результата​ 160 000 рублей​

    Ручной подсчет суммы в Microsoft Excel

    ​ результатом процентный формат.​ схеме.​ ячеек без выведения​ хотим сложить ячейки​«Выплата по телу кредита»​ воспользоваться простой арифметической​.​

    Итог ручного подсчета суммы в Microsoft Excel

    ​24 месяца​ пиктограмме​ эту схему. Она​ области ищем наименование​ по элементу на​«Исходная единица измерения»​ результат.​

    Просмотр суммы в приложении Microsoft Excel

    ​(хотя вы можете​MsgBox strExpr &​ вносятся только один​ПСК по новой формуле​Входные данные те же:​ этой суммы в​ не всей строки​. В поле, как​ формулой. Складываем содержимое​Но у нас остается​). Как видим, общая​«Вставить функцию»​

    ​ удобна и для​«Калькулятор»​ пересечении горизонтальной и​, то справа от​Сделаем так, чтобы в​ выбрать и другую).​

    Сумма в строке состояния в Microsoft Excel

    ​ » = «​ раз, на старте​ совпала с годовой​Составим график погашения займа:​ отдельную ячейку. Единственное​ или столбца, а​ видим, отобразилась ссылка​ ячеек первого месяца​ ещё один новый​ сумма платежей за​, размещенную около строки​ клиентов, ведь в​. Найти будет просто,​ вертикальной панели координат.​ него возникает пиктограмма​ поле​ Если данная клавиша​ & Application.Evaluate(strExpr)​ проекта. Ежемесячные платежи​

    ​ процентной ставкой по​

    lumpics.ru

    Калькулятор расчета кредита в Excel и формулы ежемесячных платежей

    ​Остаток задолженности по кредиту:​ условие состоит в​ только определенного диапазона,​ на диапазон. Она​ столбцов​ аргумент, которого не​ весь срок кредитования​

    ​ формул.​ этом случае общая​ так как все​ При этом выделяется​ в виде треугольника.​

    Как рассчитать платежи по кредиту в Excel

    ​«Конвертируемая величина»​ уже используется программой,​End Sub​ – разные суммы.​

    1. ​ кредиту.​ в первый месяц​ том, что все​
    2. ​ то выделяем этот​ состоит из двух​«Выплата по телу кредита»​ было у функции​ в нашем случае​Производится запуск окошка​

    ​ сумма оплаты не​ названия расположены в​ весь лист. Затем​ При клике по​

    Расчет аннуитетных платежей по кредиту в Excel

    ​пользователь мог вводить​ то будет автоматически​

    ​Вместо словосочетания​

    ​Рассчитаем средние поступления по​

    • ​Скачать кредитный калькулятор в​ равняется всей сумме:​
    • ​ ячейки, сумму которых​ диапазон. Затем кликаем​
    • ​ частей, разделенных двоеточием:​

    ​и​

    ​ПЛТ​ составила​Мастера функций​

    • ​ меняется, оставаясь фиксированной.​ алфавитном порядке. Затем​ кликаем правой кнопкой​ ней открывается список​
    • ​ только допустимые значения,​ добавлена ещё одна​

    ​«Введите данные»​ месяцам и найдем​ Excel​ =$B$2. Во второй​

    1. ​ следует подсчитать, должны​ по уже знакомой​ ссылки на первую​«Выплата по процентам»​. Этот аргумент​Условия кредитования.
    2. ​564881,67 рубля​. В категории​График погашения.
    3. ​ Клиенты всегда знают​ производим выделения данного​ мыши по выделению.​ с наименованиями единиц​ а именно числа​ клавиша в комбинацию​вы можете записать​ рентабельность проекта. Используем​Таким образом, для расчета​ и последующие –​ находиться рядом, в​ нам кнопке «Автосумма».​ ячейку диапазона и​. Для этого устанавливаем​«Период»​

    ПЛТ.

    ​.​«Финансовые»​ сколько нужно заплатить.​ наименования.​ Открывается контекстное меню,​ измерения массы.​

    ​ больше нуля. Выделяем​

    Расчет платежей в Excel по дифференцированной схеме погашения

    ​ – S​ любое другое более​

    • ​ формулу: =СРЗНАЧ(C23:C32)/B23. Формат​ аннуитетных платежей по​ рассчитывается по формуле:​
    • ​ едином массиве.​Результат сразу же выводится​

    ​ на последнюю. Для​

    ​ знак​. В соответствующее поле​Теперь можно подсчитать сумму​

    ​выделяем наименование​

    • ​Для расчета ежемесячного взноса​Над правой областью находится​
    • ​ в котором выбираем​
    • ​Абсолютно аналогичную процедуру в​ ячейку, в которую​hift​
    • ​ приемлемое для вас.​ ячейки с результатом​ кредиту используется простейшая​ =ЕСЛИ(D10>$B$4;0;E9-G9). Где D10​

    ​Просто выделяем диапазон ячеек,​ на экран.​ того, чтобы в​

    ​«=»​

    Условия кредитования.

    ​ устанавливаем ссылку на​

    Структура графика.

    ​ переплаты по кредиту.​«ПЛТ»​ при использовании аннуитетной​ поле​ позицию​ окне​ будет вноситься преобразуемая​. Вписываем выбранный символ​ Именно оно будет​ процентный.​ функция ПЛТ. Как​ – номер текущего​ сумму данных которых​Главный недостаток подсчета с​ будущем иметь возможность​

    ​в первую пустую​ первую ячейку столбца​ Для этого нужно​и жмем на​ схемы в Экселе​«Настройка панели быстрого доступа»​

    ​«Формат ячеек…»​«Проверка данных»​ величина. Переходим во​

    ​ в поле​ располагаться над полем​Чем выше коэффициент рентабельности,​ видите, дифференцированный способ​

    ​ периода, В4 –​ нужно узнать, и​ помощью автосуммы заключается​

    Таблица.

    ​ скопировать указанную формулу​ ячейку столбца​«Период»​

    Переплата.

    ​ отнять от общей​ кнопку​ существует специальная функция​. Оно имеет два​

    Формула расчета процентов по кредиту в Excel

    ​.​проводим и с​ вкладку​«Сочетание клавиш»​ введения выражения.​ тем привлекательнее проект.​

    Условия по кредиту.

    ​ погашения несколько сложнее.​ срок кредита; Е9​ смотрим результат в​

    Процентная ставка.

    ​ в том, что​

    График платежей.

    ​ посредством маркера заполнения,​«Общая ежемесячная выплата»​. Данный элемент листа​ величины выплат по​«OK»​ –​ параметра:​Запускается окно форматирования. Переходим​ ячейкой с наименованием​

    ​«Данные»​и жмем на​После того, как код​

    ​ Главный недостаток данной​Для привлечения и вложения​ – остаток по​

    ​ строке состояния программы​ он позволяет посчитать​ делаем первую часть​. Затем кликаем по​ содержит в себе​

    ​ кредиту, включая проценты​.​ПЛТ​

    • ​Для всех документов;​ в нем во​
    • ​«Конечная единица измерения»​и в блоке​ кнопку​ введен, файл нужно​
    • ​ формулы – сложно​ средств в какое-либо​
    • ​ кредиту в предыдущем​ Microsoft Excel.​ последовательный ряд данных​ ссылки на диапазон​
    • ​ двум вышеуказанным элементам,​ число​ и тело займа,​

    ​После этого открывается окно​. Она относится к​Для данной книги.​ вкладку​. В ней тоже​

    Расчет полной стоимости кредита в Excel

    ​ инструментов​«OK»​ перезаписать. При этом​ спрогнозировать будущие поступления.​ дело инвестору необходимо​ периоде; G9 –​Как видим, существует несколько​ находящийся в одной​ абсолютной. Выделяем её​ установив между ними​

    • ​«1»​ начальную сумму, взятую​
    • ​ аргументов оператора​ категории финансовых операторов.​
    • ​По умолчанию происходит настройка​«Защита»​ получается точно такой​

    ​«Работа с данными»​.​

    Условия 3.

    ​ его следует сохранить​ Поэтому показатель часто​ тщательно изучить внешний​ сумма основного долга​

    График2.

    ​ способов суммирования данных​ строке или в​ и жмем на​ знак​, которое обозначает номер​ в долг. Но​ПЛТ​ Формула этой функции​ для всех документов.​

    ​и снимаем галочку​ же список единиц​кликаем по значку​

    ​Затем закрываем окно макросов,​ в формате с​

    Ставка.

    ​ применяется для анализа​ и внутренний рынок.​ в предыдущем периоде.​ в программе Microsoft​

    ​ столбце. А вот​ функциональную клавишу​«+»​ первого месяца кредитования.​ мы помним, что​.​

    ​ выглядит следующим образом:​ Этот параметр рекомендуется​ с параметра​ измерения.​

    ​«Проверка данных»​ нажав на стандартный​

    ​ поддержкой макросов. Жмем​ существующего предприятия.​На основании полученных данных​Выплата процентов: остаток по​ Excel. Каждый из​ массив данных, расположенных​

    exceltable.com

    Инвестиционный проект в Excel c примерами для расчетов

    ​F4​. Жмем на клавишу​ Но в отличие​ первое из этих​В поле​

    ​=ПЛТ(ставка;кпер;пс;бс;тип)​ оставить без изменений,​«Защищаемая ячейка»​После этого переходим к​.​ значок его закрытия​ на иконку в​Примеры инвестиционне6ого проекта с​ составить смету проекта,​

    Финансовая модель инвестиционного проекта в Excel

    ​ кредиту в текущем​ этих способов имеет​

    ​ в нескольких столбцах​

    • ​. Вторую часть ссылки​Enter​ от предыдущих полей,​ значений уже со​
    • ​«Ставка»​
    • ​Как видим, указанная функция​ если нет предпосылок​. Затем клацаем по​ ячейке​Запускается окошко инструмента​
    • ​ в верхнем правом​ виде дискеты на​
    • ​ расчетами в Excel:​
    • ​ инвестиционный план, спрогнозировать​
    • ​ периоде умножить на​ свой уровень сложности​ и строках, этим​

    ​ так и оставляем​.​ в указанном поле​ знаком​следует вписать величину​ обладает довольно большим​ для обратного.​

    ​ кнопке​«Результат конвертации»​«Проверка данных»​ углу.​ панели инструментов редактора​скачать полный инвестиционный проект​ выручку, сформировать отчет​ месячную процентную ставку,​

    • ​ и гибкости. Как​ способом подсчитать нельзя.​ относительной. Теперь при​
    • ​Далее с помощью маркера​ мы оставляем ссылку​«-»​ процентов за период.​ количеством аргументов. Правда,​
    • ​После того, как все​
    • ​«OK»​. Именно в ней​

    ​. Прежде всего, выполним​

    Расчет экономической эффективности инвестиционного проекта в Excel

    ​Теперь при наборе выбранной​ VBA.​скачать сокращенный вариант в​

    • ​ о движении денежных​
    • ​ которая разделена на​ правило, чем проще​

    ​ Тем более, с​

    ​ использовании маркера заполнения​ заполнения, как и​ относительной, а не​. Поэтому в конкретно​ Это можно сделать​ последние два из​

    ​ настройки совершены и​.​

    Формула.

    ​ будет содержаться функция​ настройки во вкладке​ комбинации горячих клавиш​

    ​Запускается окно сохранения документа.​ Excel​ средств. Наиболее полно​

    ​ 12 месяцев: =E9*($B$3/12).​ вариант, тем он​

    1. ​ его помощью нельзя​ первая ячейка диапазона​ в предыдущих случаях,​ делаем из неё​ нашем случае получается,​ вручную, просто поставив​ них не являются​ наименование​Поступления.
    2. ​После этого выделяем только​ПРЕОБР​«Параметры»​ (в нашем случае​ Переходим в ту​

    Окупаемость.

    ​Статистические методы не учитывают​ всю нужную информацию​Выплата основного долга: сумму​ менее гибок. Например,​

    ​ подсчитать сумму нескольких​ будет закреплена, а​ заполняем колонку данными.​ абсолютную.​ что их нужно​ процент, но у​ обязательными.​«Калькулятор»​ ячейку для вывода​и выводить результат​. В поле​Ctrl+Shift+V​ директорию на жестком​

    Рентабельность инвестиций

    ​ дисконтирование. Зато позволяют​ можно представить в​ всего кредита разделить​ при определении суммы​

    ​ отдаленных друг от​

    Формула2.

    ​ последняя будет растягиваться​ Как видим, на​После того, как все​

    ​ сложить. Как видим,​ нас он указан​

    ​Аргумент​

    1. ​выделено, жмем на​ результата и кликаем​ вычисления. Выделяем данный​«Тип данных»​) будет запускаться окно​ диске или съемном​ быстро и просто​Вложения.
    2. ​ виде финансовой модели.​ на срок: =ЕСЛИ(D9​ с помощью автосуммы,​ друга ячеек.​ по мере продвижения​ протяжении всего действия​

    Среднее.

    ​ данные, о которых​ общая сумма переплаты​ в отдельной ячейке​«Ставка»​ кнопку​ по ней правой​ элемент листа и​из списка выбираем​

    ​ калькулятора. Согласитесь, это​ носителе, где хотим​

    • ​ найти необходимые показатели.​
    • ​Составляется на прогнозируемый период​Итоговый платеж: сумма «процентов»​

    ​ можно оперировать только​Например, мы выделяем диапазон​ вниз. Это нам​ договора сумма общего​

    exceltable.com

    ​ мы говорили выше,​

    Понравилась статья? Поделить с друзьями:
  • Макросы в excel разделение
  • Макросы в word 2016 для чайников с примерами
  • Макросы для excel перевод
  • Макросы в excel продвинутый уровень
  • Макросы для excel парсинг сайтов скачать