Лабораторная работа № 8. 1. Применение функций в работе с Exel Разработаем функцию, предназначенную для решения такой задачи. Пусть заданы величина h и числовой массив M, элементы которого находятся в ячейках таблицы Excel. Требуется определить, сколько элементов массива М больше h. Функция должна превосходящих h. возвращать количество элементов массива, Активизируем новую книгу, а затем откроем окно VB. Вставим модуль в личную книгу макросов. В окно кода введем следующий текст пользовательской функции: В четвертой строке фигурирует функция TypeName, возвращающая (в виде строки) тип аргумента. С помощью этой функции проверяется тип переменной М. При безошибочном использовании функции Func8 переменная М имеет тип Range (Диапазон). В пятой и шестой строках значения М.Rows.Count и М.Columns.Count равны числу строк и столбцов в диапазоне М. В седьмой строке выражение M(i, j) означает ссылку на соответствующую ячейку диапазона М. Пользовательская функция Func8 используется следующим образом. 1. Вводим числа, например, в ячейки D5:E8 листа Лист4. 2. этого: Присваиваем этому диапазону ячеек, например, имя Test8; для • выделяем диапазон и щелкаем на нем правой кнопкой мышки; • в открывшемся контекстном меню выполняем команду Имя диапазона; • в открывшемся окне Создание имени в текстовое поле Имя вводим Test8, в текстовое поле Область вводим Лист4 с помощью скрытого списка и щелкаем на кнопке ОК. 3. Вводим, например, в ячейку Е11 формулу = Func8(Test8;2) В обращении к функции Excel аргументы отделяются друг от друга символом «точка с запятой», а не запятой, как это принято в Visual Basic. Либо можно воспользоваться мастером функций: для этого нажмите на кнопку Вставить функцию Определенные пользователем функцию Func8. В открывшемся диалоговом окне Щелкнуть по кнопке ОК. и выберите из категории заполните поля аргументов. В результате в ячейке E11 появится результат - количество чисел в ячейках D5:E8, превосходящих 2. 2. Автоматическое разбиение одного столбца с данными на несколько Итак, имеем столбец с данными, которые надо разделить на несколько отдельных столбцов. Самые распространенные жизненные примеры: • ФИО в одном столбце (а надо в трех отдельных, чтобы сортировать по имени) • полное описание товара в одном столбце (а надо отдельный столбец под фирму-изготовителя, отдельный - под модель и т.д.). Способ 1. Без программирования Выделите ячейки, которые будем делить и выберите в меню Данные Текст по столбцам (Data - Text to columns). Появится окно Мастера текстов: На первом шаге Мастера выбираем формат нашего текста. Или это текст, в котором какой-либо символ отделяет друг от друга содержимое наших будущих отдельных столбцов (с разделителями) или в тексте с помощью пробелов имитируются столбцы одинаковой ширины (фиксированная ширина). На втором шаге Мастера, если мы выбрали формат с разделителями (как в нашем примере) - необходимо указать какой именно символ является разделителем: И, наконец, на третьем шаге для каждого из получившихся столбцов, выделяя их предварительно в окне Мастера, необходимо выбрать формат: • общий - оставит данные как есть - подходит в большинстве случаев • дата - необходимо выбирать для столбцов с датами, причем формат даты (день-месяц-год, месяц-день-год и т.д.) уточняется в выпадающем списке • текстовый - для чисто текстовой информации: Осталось нажать кнопку Готово, утвердительно ответить на вопрос о замене конечных ячеек, который выдаст Excel и насладиться результатом: Способ 2. С программированием Идея подсмотрена на сайте John Walkenbach. Напишем простую пользовательскую функцию ExtractElement, которая будет в общем случае делить любую строку по любому указанному разделителю. Выберите в меню Сервис - Макрос - Редактор Visual Basic (Tools Macro - Visual Basic Editor). В открывшемся окне редактора выберите в меню Insert - Module и в появившийся пустой модуль скопируйте и вставьте следующие строки: Закройте редактор и вернитесь в Excel командой File - Close and return to Microsoft Excel. Теперь в любой ячейке листа Вы можете использовать эту функцию через меню Вставка - Функция - категория Определенные пользователем, где в аргументах: • Txt - ячейка с текстом, который надо разделить, • n - порядковый номер извлекаемого элемента, • Separator - символ-разделитель. 3. Быстрое склеивание текста из нескольких ячеек Способ 1 (простой). Функция СЦЕПИТЬ В категории Текстовые есть функция СЦЕПИТЬ (CONCATENATE), которая соединяет содержимое нескольких ячеек (до 255) в одно целое, позволяя комбинировать их с произвольным текстом. Например, вот такой вариант применения этой функции даст надпись, которую я все свое детство видел на заборе около дома: Способ 2 (красивый). Символ для склеивания текста (&) Для суммирования содержимого нескольких ячеек используют знак плюс "+", а для склеивания содержимого ячеек используют знак "&" (расположен на большинстве клавиатур использовании небходимо помнить, что: на цифре "7"). При его • Этот символ надо ставить в каждой точке соединения, т.е. на всех "стыках" текстовых строк также, как вы ставите несколько плюсов при сложении нескольких чисел (2+8+6+4+8) • Если нужно приклеить произвольный текст (даже если это всего лишь точка или пробел, не говоря уж о целом слове), то этот текст надо заключать в кавычки. В предыдущем примере с функцией СЦЕПИТЬ о кавычках заботится сам Excel - в этом же случае их надо ставить вручную. Вот, например, как можно собрать ФИО в одну ячейку из трех с добавлением пробелов: Если сочетать это с функцией извлечения из текста первых букв ЛЕВСИМВ (LEFT), то можно получить фамилию с инициалами одной формулой: Способ 3 (VBA). Макрос для объединения ячеек без потери текста. Имеем текст в нескольких ячейках и желание - объединить эти ячейки в одну, слив туда же их текст. Проблема в одном - кнопка "Объединить и поместить в центре" на панели инструментов "Форматирование" в Excel объединять-то ячейки умеет, а вот с текстом сложность - в живых остается только текст из верхней левой ячейки. Дети, поднимите руки, кто на это нарывался? (Лес рук). Отлично! Теперь откроем редактор Visual Basic через меню Сервис - Макрос - Редактор Visual Basic(Tools - Macro - Visual Basic Editor), вставим в нашу книгу новый программный модуль (меню Insert Module) и скопируем туда текст такого простого макроса: Теперь, если выделить несколько ячеек и запустить этот макрос в меню Сервис - Макрос - Макросы (там же можно повесить его на сочетание клавиш для скорости), то Excel объединит выделенные ячейки в одну, слив туда же и текст. Задание 1. Написать функцию реализующую данную задачу. 4. Случайная выборка из списка Многим пользователям Excel приходится сталкиваться с такой задачей: выбрать из массива данных (списка) случайным образом N элементов. Это может быть связано с тем, что полный объем данных слишком велик, поэтому мы удовлетворяемся анализом случайной выборки из полного набора данных. Или же это может быть выбор, например, победителей из числа участников какого-либо конкурса или лотереи. В любом случае перед нами стоит задача отобрать случайным образом заданное количество элементов из какого-либо набора (например, вот такого): Способ 1. Случайная сортировка Добавить к нашему списку еще один столбец и вставить в него функцию генерации случайных чисел СЛЧИС (RAND). Затем отсортировать наш список по добавленному столбцу (Данные - Сортировка) и взять N первых элементов из получившейся таблицы: Минусы такого способа очевидны - придется вручную каждый раз пересортировывать список, если нам необходимо будет сделать другую случайную выборку. В плюсах - простота и доступность. Способ 2. Функция НАИМЕНЬШИЙ Этот способ заключается в использовании функции НАИМЕНЬШИЙ (SMALL) для выбора из списка N позиций с наименьшим случайным числом в столбце А: После выбора пяти (в нашем примере) наименьших случайных чисел из столбца А, мы вытаскиваем имена, которые соответствуют этим числам с помощью функцииВПР (VLOOKUP). Способ 3. Функция Lotto на VBA Можно создать простую функцию на VBA, которая будет выдавать заданное количество случайных чисел из нужного интервала. Откроем редактор Visual Basic (Сервис - Макрос - Редактор Visual Basic), вставим новый модуль через меню Insert - Module и скопируем туда текст вот такой функции: У этой функции будет три аргумента: • Bottom - нижняя граница интервала случайных чисел • Top - верхняя граница интервала случайных чисел • Amount - количество случайных чисел, которое мы хотим отобрать из интервала Т.е., например, чтобы отобрать 5 случайных чисел от 10 до 100, нужно будет ввести =Lotto(10;100;5) Теперь эту функцию легко использовать для отбора случайных значений. Добавим к нашему списку столбец с нумерацией и будем отбирать людей по случайным номерам, которые генерирует функция Lotto: Обратите внимание, что наша функция Lotto должна быть введена как функция массива, т.е. сначала необходимо выделить диапазон ячеек результатов (D2:D6) затем нажать кнопку fx или выбрать в меню Вставка Функция - категория Определенные пользователем - функция Lotto, и после ввода аргументов функции нажать Ctrl+Shift+Enter, чтобы ввести эту функцию именно как функцию массива во все выделенные ячейки. Ну, а дальше останется при помощи уже знакомой функции ВПР (VLOOKUP) вытащить имена из списка, соответствующие случайным номерам. Задание 2. Написать построчный комментарий к листингу программы.