close

Вход

Забыли?

вход по аккаунту

?

otchet po praktike Kushnir M

код для вставкиСкачать
ПРИДНЕСТРОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ им. Т.Г. ШЕВЧЕНКО РЫБНИЦКИЙ ФИЛИАЛ
КАФЕДРА "ФИЗИКИ, МАТЕМАТИКИ И ИНФОРМАТИКИ "
Отчет
по производственно-технологической практике на тему "Автоматизированный переход между семестрами в электронных журналах"
(место прохождения: филиал Приднестровского Государственного Университета им. Т.Г. Шевченко в г. Рыбница)
Руководитель практики от вуза:
ст. преподаватель Глазов А.Б.
Выполнила:
студентка V курса
специальности "ПОВТ и АС"
Кушнир М.Л.
г. Рыбница
2013 г.
Содержание
ВВЕДЕНИЕ3
ГЛАВА 1. СТРУКТУРА ПРЕДПРИЯТИЯ, ВИДЫ ЕГО ДЕЯТЕЛЬНОСТИ5
1.1. Кафедра "Физики, Математики и Информатики"5
1.2. Состав кафедры ФМИ7
1.3. Основные задачи кафедры8
ГЛАВА 2. ТЕОРЕТИЧЕСКИЙ РАЗДЕЛ11
2.1. Описание и постановка задачи11
2.2. Обзор существующих аналогичных программных систем, методов и применяемых технологий12
ГЛАВА 3. ПРАКТИЧЕСКИЙ РАЗДЕЛ18
3.1. Автоматическая переброска списков студентов прошлого учебного года и импорт расписания групп в журналы-шаблоны18
3.2. Ввод в эксплуатацию электронных журналов22
3.3. Исследование возможности формирования списков групп первого курса, по данным приемной комиссии24
ЗАКЛЮЧЕНИЕ31
СПИСОК ЛИТЕРАТУРЫ32
ПРИЛОЖЕНИЕ33
ВВЕДЕНИЕ
В настоящее время одной из проблем во всех ВУЗах является посещаемость и успеваемость студентов. В ВУЗах уже давно ввели так называемый контроль успеваемости студентов, представленный в виде обычных журналов. Однако модернизация высшего профессионального образования в условиях перехода на двухуровневую систему требует разработки новых подходов к автоматизации учебного процесса, что обусловливает актуальность выбранной темы исследования.
Существует много подходов и алгоритмов для решения поставленной проблемы. Они могут быть написаны на разных языках программирования и разрабатываются с учетом специфики конкретного учебного заведения. Для данной разработки использовался язык Visual Basic for Applications (VBA), который считается хорошим средством быстрой разработки прототипов программы, для разработки приложений баз данных и вообще для компонентного способа создания программ, работающих под управлением операционных систем семейства Microsoft Windows.
Целью практики является создание программного продукта, который позволит осуществить автоматизированный переход между семестрами в электронных журналах. Данная разработка должна обеспечить пользователю электронного журнала возможность автоматического ввода списков студентов и расписание групп.
Для реализации программного продукта необходимо выполнить следующие задачи:
> изучить предметную область. Разработать предложения по реализации системы. Постановка задачи;
> рассмотреть существующие аналогичные программные системы, методы и применяемые технологий;
> осуществить автоматическую переброску списков студентов и учебный план прошлого учебного года;
> импортировать расписания групп в журналы-шаблоны;
> ввести в эксплуатацию электронные журналы;
> исследовать возможность формирования списков групп первого курса, по данным приемной комиссии;
> разработать программный продукт;
> протестировать, отладить и внедрить программный продукт. ГЛАВА 1. СТРУКТУРА ПРЕДПРИЯТИЯ, ВИДЫ ЕГО ДЕЯТЕЛЬНОСТИ
1.1. Кафедра "Физики, Математики и Информатики"
Кафедра "Физика, математика и информатика" образована в 1994 году и обеспечивает преподавание дисциплин информационно-математического и общетехнического профиля. За эти годы создана учебно-материальная база, собран педагогический коллектив.
Кафедра "Физика, математика и информатика" готовит студентов по специальностям:
* "Программное обеспечение вычислительной техники и автоматизированных систем" (230105);
* "Информатика" с дополнительной специальностью "Английский язык" (030100.00).
С сентября 2012 года кафедра ФМИ начала готовить бакалавров по направлению 050100 "Педагогическое образование", профиль "Информатика" с дополнительным профилем "Иностранный язык" и бакалавров-инженеров по направлению 231000 "Программная инженерия".
На кафедре ФМИ преподаются дисциплины, которые строят надежный и достаточно обширный "фундамент" знаний будущего инженера-программиста. Точные предметы, такие как математический анализ, дискретная математика, алгебра и геометрия, математическая статистика и др., позволяют акцентировать внимание обучающихся на том факте, что многое в нашей жизни можно математически оформить, структурировать. А значит, есть шанс заставить компьютер взять на себя ответственность по выполнению части человеческой работы.
При организации учебного процесса преподаватели широко используют методические пособия, лабораторные практикумы, позволяющие учиться в индивидуальном темпе. Практические занятия в компьютерных классах и физической лаборатории закрепляют полученные на лекциях теоретические знания. Способные студенты привлекаются для проведения лабораторных занятий, участвуют в творческих проектах. Огромное внимание в учебном процессе уделяется современным информационным ресурсам. В частности, создана локальная сеть, благодаря которой можно получить информацию из электронной библиотеки филиала. В нашем филиале студентам и преподавателям предоставляется постоянный доступ к ресурсам сети Интернет. Это значит, что для обучения студентов помимо традиционных видов обучения используются интернет-технологии. Многие выпускники защитили дипломные проекты, связанные с работой в глобальной сети.
На кафедре функционирует научный кружок "Системное программирование", в состав которого входят студенты с I по V курсы специальностей ПОВТ и Информатика, а также ученики СОШ г. Рыбница. Основное направление научно-исследовательской работы кафедры ФМИ - "Система электронного документооборота образовательного учреждения". Результаты научных исследований широко используются в учебном процессе филиала, школ города и района, при составлении учебно-методических пособий, при разработке рабочих программ, в организации работы студенческого научного кружка, а также находит отражение в дипломных работах.
Продолжает работу филиал кафедры в МОУ "Рыбницкая русская средняя школа №6 с лицейскими классами". В прошлом году оказана помощь в создании обучающих программ необходимых в учебном процессе, ведется работа над созданием сайта школы.
Ведется активное сотрудничество ППС кафедры с Рыбницким городским и районным Советом народных депутатов, с МОУ "УПК", с МОУ "Рыбницкий политехнический техникум", с СОШ №№ 6,8,1 и гимназией.
Четверым сотрудникам кафедры выданы авторские свидетельства на программу ЭВМ "Электронная библиотека встраиваемой базы данных "SPAD", "Построение модели технологического процесса" и "Визуализатор", которые зарегистрированы в Государственном реестре Министерства юстиции ПМР.
С целью регулирования вопросов студенческой жизни студенты нашей кафедры принимают активное участие в функционирующих органах студенческого самоуправления (студенческого комитета, студенческого профсоюза, старостата и др.). Благодаря их работе не остаются без внимания, нуждающиеся в помощи студенты. Организовываются различные мероприятия как образовательного, так и развлекательного характера.
1.2. Состав кафедры ФМИ
Cотрудники кафедры физики, математики и информатики: Глазов Анатолий Борисович - зав. кафедрой ст. преподаватель, Тягульская Людмила Анатольевна - к.э.н. доцент, Балан Лилия Александровна- ст. преподаватель, Борсуковский Сергей Иванович - ст. преподаватель, Гук Александр Владимирович - ст. преподаватель, Козак Людмила Ярославовна - ст. преподаватель, Лозовский Вадим Ефимович - ст. преподаватель, Ляху Александр Анатольевич - ст. преподаватель, Сташкова Ольга Витальевна - ст.преподаватель, Шестопал Оксана Викторовна - ст. преподаватель, Бармина Елена Сергеевна - преподаватель, Анненков Андрей Александрович - преподаватель, Глазова Наталья Сергеевна - преподаватель, Дорош Анатолий Петрович - преподаватель, Кардаш Людмила Федоровна- преподаватель, Муляр Андрей Федорович - преподаватель, Панченко Татьяна Александровна -преподаватель, Цвинкайло Петр Станиславович - преподаватель, Чернега Наталья Владимировна - преподаватель, Станьковская Алена Александровна - ст. лаборант, Пешкин Дана Борисовна - ст. лаборант, Луценко Игорь Владимирович - инженер-программист, Патлатый Дмитрий Васильевич - инженер-программист.
1.3. Основные задачи кафедры
Основные текущие задачи и направления развития кафедры:
* Внедрить вводимую в Российском образовательном пространстве двухуровневую систему подготовки кадров по специальностям "Информатика" с дополнительным профилем "Иностранный язык" (квалификация (степень) "бакалавр") и "Программная инженерия" (квалификация (степень) "бакалавр-инженер").
* Разработать и усовершенствовать документацию, учебные планы и рабочие программы по ФГОС-3.
* Совершенствовать систему внедрения новой специальности инженерного направления в соответствии с потребностями работодателей и возможностями осуществления образовательного процесса при наличии соответствующей материально-технической базы и кадрового обеспечения.
* Обеспечить первый выпуск бакалавров в рамках новых стандартов.
* Повысить качественный рост преподавателей через аспирантуру, соискательство.
* Успешно сдать кандидатский минимум сотрудниками кафедры, зачисленными в аспирантуру.
* Успешно защитить диссертаций ППС кафедры.
* Расширить научно-исследовательскую работу, в частности, создание научной лаборатории по внедрению компьютерных технологий в учебный процесс, организация постоянно действующих научно-методических семинаров, создание банка дидактических, методических и информационных материалов, компьютерного сопровождения курсов.
* На основе исследовательской работы подготовить к изданию материалы (в виде монографий, книг, учебников) и внедрение их в учебный процесс.
* Участвовать в республиканских, международных и научных конференциях, семинарах, с целью совершенствования профессионального уровня и обмена научно-методической информацией.
* Выпускать методическую литературу по направлениям кафедры.
* Работать над технологиями дистанционного обмена информации.
* Разработка системы документооборота филиала ПГУ им. Т.Г. Шевченко в г. Рыбница (деканат, отдел кадров, кафедры, бухгалтерия и т.д.).
* Расширение связей в научном, творческом сотрудничестве с ВУЗами России, Украины, Молдовы и т.д.
* Заключение новых договоров с предприятиями, образовательными учреждениями города и района.
* Обеспечение социальной защиты студентов из социально-незащищенной категории.
* Повышение уровня привлечения студенческой молодежи к общественной жизни филиала
* Обновление материальной базы кафедры, приобретение нового оборудования для аудиторий, компьютерных классов.
* Укрепление научной, учебно-методической базы кафедры.
* Создание новых баз для прохождения производственно-технологической, преддипломной и педагогической практик.
* Расширение профориентационной работы по всем направлениям (сотрудничество с предприятиями, средне-специальными заведениями, средними школами республики, города и района).
* Обновление сайта кафедры, популяризация специальностей в средствах массовой информации. ГЛАВА 2. ТЕОРЕТИЧЕСКИЙ РАЗДЕЛ
2.1. Описание и постановка задачи
В Рыбницком филиале ПГУ создана система учетов посещаемости студентов [1-3]. Она состоит из электронных журналов, заполняемых лаборантами каждой кафедры еженедельно и программы их обработки у заместителя директора по учебной работе. Электронный журнал - это современный инструмент для заместителя декана и лаборантов, который облегчает их каждодневную бумажную рутину, также помогает контролировать успеваемость и посещаемость студентов.
Чтобы сформировать электронные журналы для групп на новый семестр необходимо подготовить журналы-шаблоны, которые состоят из трех листов: списка студентов, учебного плана и расписания групп. Для формирования журналов-шаблонов программист вручную копирует списки студентов, учебный план и расписание для каждой группы. Так как в рыбницком филиале ПГУ им. Т.Г. Шевченко 43 группы дневного обучения, существенна скорость формирования готовых электронных журналов.
Автоматическая переброска списков студентов и учебного плана прошлого учебного года позволит быстрее сформировать электронные журналы. Для заполнения электронных журналов каждый год требуется список студентов, поступивших на первый курс. Такой список можно получить из данных приемной комиссии, но эти данные заполняются в удаленную базу MS SQL, находящуюся в г.Тирасполь, к которой у авторов нет доступа. В Рыбнице имеются только рабочие места с интерфейсом ввода этих данных. 2.2. Обзор существующих аналогичных программных систем, методов и применяемых технологий
Программы для записи действия мыши и клавиатуры, которые были рассмотрены:
> Automatic Mouse and Keyboard - эта утилита предназначена для автоматизации часто повторяемых действий на клавиатуре и с помощью мыши (рис.1). Данное приложение позволяет автоматически вводить текст, открывать файл, устанавливать курсор в определенное положение. Программа может записывать клавиатурные макросы и в точности их повторять, а также запоминать жесты мыши. Между выполняемыми в программе командами можно устанавливать задержку во времени [9].
Недостатки: при записи макроса программа записывает только позицию мыши, фиксирует нажатие мыши, фиксирует ввод с клавиатуры текста, но только по буквам. Пример ввода данных с клавиатуры:
Delay : 81 ms
Key Up : П
Delay : 95 ms
Key Down : Р
Delay : 71 ms
Key Up : И
Delay : 117 ms
Key Down : B
Delay : 84 ms
Key Up : B
Delay : 245 ms
Key Down : Е
Delay : 73 ms
Key Up : Е
Delay : 187 ms
Key Down : T
Delay : 70 ms
Key Up : T
Повторяет с точностью действия пользователя, но не подходит для рассматриваемой задачи.
Рис. 1. Программа-шпион "Automatic Mouse and Keyboard"
> MouseRobot - программа предназначена для автоматизации повторяющихся действий в любых программах с графическим интерфейсом (рис. 2). MouseRobot умеет нажимать на кнопки, выбирать пункты меню, набирать текст, запускать программы, перетаскивать файлы и работать с web-страницами - то есть делать все, что можно выполнить вручную, используя клавиатуру и мышь, но только автоматически [10].
Ввод текста с клавиатуры:
qwerty{WAIT 1.9}
{MPOS 479,411}
{MKEY LEFT,CLICK}
Рис. 2. Программа-шпион "MouseRobot"
Все действия пользователя для записи разбиваются на отдельные шаги, такие как - запустить программу, найти кнопку на экране, нажать кнопку, ввести текст. Это затрудняет отбор информации из записанного макроса. Программа работает не вскрытом режиме. При записи макроса в момент наведения мыши на объект появляется подсказка в виде красного или зеленого прямоугольника с текстом, что в свою очередь, отвлекает пользователя от работы. Данная программа не подходит для решения поставленной задачи.
> AutoItMacroGenerator - записывает в реальном времени действия пользователя в AutoIt код (рис. 3). Недостатком является тот факт, что данная программа не работает в скрытом режиме. Если ее свернуть, действия, которые выполняет пользователь, записаны не будут [4]. Рис. 3. Программа-шпион " AutoItMacroGenerator "
> Ghost Automizer - Программа имитирует действия мышки и нажатия клавиш на клавиатуре по ранее записанному алгоритму в определенное время (рис.4). Все действия записываются в отдельную программу-алгоритм, которую можно сохранить (и в дальнейшем отредактировать в любом текстовом редакторе), можно отредактировать прямо в окне программы, а можно запустить на исполнение.
Данная программа была выбрана для работы в приемной комиссии. Были написаны макросы на Autoit start.au3 и stot.au3, который, соответственно, запускают при включении компьютера и закрывают программу Ghost Automizer.
Посредством программы было записано несколько файлов, которые в последствии были обработаны программой getStud. Программа getStud обрабатывает файлы, записанные программой Ghost Automizer, и вытаскивает нужную нам информацию о студенте (ФИО, специальность, форма обучения, все, что вводит секретарь приемной комиссии в Базу Данных). Ряд проблем при тестировании программой getStud: при расшифровке файлов информация, вводимая с клавиатуры, была не полной, т.е. иногда получалось так, что выводилось не полное ФИО или адрес. Эти проблемы были связаны с программой - шпион AutoItMacroGenerator. При подробной изучение программы было установлено, что когда пользователь (секретарь приемной комиссии) вводит информацию при помощи клавиатуры и нажимает <Enter>, то тогда записывается вся информация в файл, а если же просто щелкает мышкой в другом месте, то тогда в файл записывается не полная информация. Рис. 4. Программа-шпион " Ghost Automizer "
> ScriptWriter - записывает действия в реальном времени, преобразует все клики и набор на клавиатуре в код для AutoIt и формирует файл со скриптом (рис. 5).
Рис. 5. Программа-шпион " ScriptWriter "
Для выполнения какой-либо задачи предоставляется комбинация испытанных методов, включающих в себя - симуляцию нажатий комбинаций клавиш клавиатуры, перемещения указателя мыши и управления окнами и его визуальными элементами [7]. Были рассмотрены и другие программы-шпионы: Easy Macro Recorder, MegaMouse2, Hot keyboard , Keylogger, Expert Home [5], но было принято решение использовать программу ScriptWriter, так как она больше всего подходила по критериям эффективности. ГЛАВА 3. ПРАКТИЧЕСКИЙ РАЗДЕЛ
3.1. Автоматическая переброска списков студентов прошлого учебного года и импорт расписания групп в журналы-шаблоны
Во время практики было создано приложение, которое автоматически перебрасывает списки студентов прошлого учебного года и расписание (рис.6).
Приложение AvtomaticRaspAndSpis, циклично выбирает данные из журналов-шаблонов прошлого учебного года и копирует их на рабочий лист "спис" журналов-шаблонов текущего учебного года, а так же копирует расписание групп на рабочий лист "расп". На листе "вр00" находятся два функциональных элемента, визуально выделенных оранжевым цветом. Они позволяют выполнить следующие действия:
1. "Списки" - программа проходит по всем журналам - шаблонам прошлого года и формирует журнал - шаблон текущего года, копируя список групп, план сохраняется с прошлого года без изменения. Эти данные сохраняются на листах: "план", "спис".
2. "Расписание" - программа проходит по всем журналам - шаблонам текущего года и на основе имеющегося в деканате расписания, формирует расписание групп. Эти данные сохраняются на листе - "расп".
На листе "вр00" в столбце D можно проследить наличие журналов-шаблонов, если журнал-шаблон есть и список группы скопировался, то ячейка окрашивается в оранжевый цвет, а если журнала-шаблона нет, то ячейка напротив журнала не окрашивает. Это не касается первого курса, для первого курса списки групп вводились вручную.
В столбце E напротив журнала ячейка окрашивается в голубой цвет, если расписание для группы было сформировано и не окрашивается, если не было сформировано. Рис.6. "Модуль AutomaticRaspAndSpis"
Приложение AvtomaticRaspAndSpis состоит из рабочего листа "вр00" и одного модуля. Модуль содержит два основных макроса:
> AvtomaticSpis - копирует списки студентов из журналов шаблонов прошлого учебного. Для этого макрос циклично проходит по всем строчкам столбца B, открывает журнал-шаблон прошлого года в пути "D:\wm\Шаблоны 2012-2013 Iполугодие\", копирует список студентов, затем открывает журнал-шаблон на курс старше текущего года в пути "D:\wm\Шаблоны 2013-2014 Iполугодие\ " и сохраняет список на рабочем листе "спис". Функций, которые использует в данном макросе:
* Function NoDir(kol, DirNom As Integer, DirNomEnd As Integer) As Integer - возвращает количество не найденных папок.
kol - количество папок в пути;
DirNom - номер строки начала наименований директорий на листе "вр00";
DirNomEnd - номер строки конца наименований директорий на листе "вр00";
* Function IsDir(DirName As String) As Integer - возвращает кол-во найденных папок.
DirName - наименование директории.
* Function FindFillJurn(ShJurNameShab, NomCol, NomColor) As Integer - ищет журнал и окрашивает ячейку напротив него в оранжевый или голубой цвет.
ShJurNameShab - наименование журнала шаблона;
NomCol - номер колонки;
NomColor - код цвета для окраски ячейки; > GeneratRasp - формирует расписание групп на основании имеющегося в деканате расписания. Макрос открывает файл с расписанием в пути "D:\wm\Расписание\", затем циклично проходит по всем строчкам столбца B, открывает журнал-шаблон текущнго года в пути "D:\wm\Шаблоны 2013-2014 Iполугодие\ ", копирует расписание группы из файла и сохраняет в журнал - шаблон на рабочем листе "расп". Функции, используемые в макросе:
* Function Raspisanie(RowR, ColRasp, JurName, FilNameRasp) As String - отрезает наименование предмета из файла с расписанием.
RowR - номер строки начала расписания; ColRasp - номер столбца с названием группы; JurName - наименование журнала-шаблона; FilNameRasp - наименование файла с расписанием.
* Function ReplaceMoreSpaseToOne(str) As String - заменяет несколько пробелов одним.
Str - строка, название предмета.
* Function FindPodStr(BegRasp) As Integer - ищет подстроки: "доц.", "ст.", "преп.", "проф".
BegRasp - строка с названием предмета, фамилией преподавателя и номером аудитории.
* Function testUnitCells(RowRasp, ColRasp, BegRasp) - проверяет объединены ли ячейки.
RowRasp - номер строки с названием предмета; ColRasp - номер столбца с названием предмета;
BegRasp - строка с названием предмета, фамилией преподавателя и номером аудитории.
Для правильного функционирования макроса AutomaticRaspAndSpis на диске " D:\wm\ " должны быть папки:
> "D:\wm\Шаблоны 2012-2013 Iполугодие\ " - в пути папки с файлами шаблонами (ИЗО, ИНЯЗ, СЭД, ФМИ, ПИ);
> "D:\wm\Шаблоны 2013-2014 Iполугодие\" - в пути папки с файлами шаблонами (ИЗО, ИНЯЗ, СЭД, ФМИ, ПИ).
Если какой-либо директории не будет, то программа выдаст предупреждение (рис. 7).
Рис.7. Предупреждения модуля "AutomaticRaspAndSpis"
3.2. Ввод в эксплуатацию электронных журналов
Электронный журнал практически полностью (с добавлением первых 3-х листов) копирует структуру академического журнала группы (рис.8). Он состоит из следующих листов:
Таблица 1 Семантика сущностей рабочей книги
Наименование рабочего листаСемантика хранимых данныхВр00общие сведенья для заполнения журналаОписинструкция для работы с журналомСодесодержание журнала, обеспечивающее навигацию между листами при помощи гиперссылокПланучебный план группы за семестрСписличные данные каждого студента группыРаспрасписание занятийСводданные по посещаемостиАттеаттестация студентов за семеструч01, уч02, ... уч19листы учета посещаемости и успеваемости студентов (Источник: авторская разработка)
Электронный журнал формируется следующим образом. Предварительно заполняются базовые данные о группах и студентах, которые хранятся в журналах-шаблонах (состоят из трех листов - список студентов, расписание группы, учебный план).
Рис.8. Электронный журнал
Основной модуль циклично выбирает данные из журналов-шаблонов, копирует их на рабочий лист "вр00", в последствии эти данные используются для автоматического заполнения рабочих листов. Сформированные журналы сохраняются с именем "жрНомергруппы.xls " (например,жр520. xls).
Электронные журналы групп хранятся на рабочих местах лаборантов рабочих кафедр, которые располагаются в разных узлах сети. Следовательно, вопрос синхронизации старых и новых версий программного продукта, является актуальным. Итерационный процесс программы подразумевает возможное изменение старого кода и добавление нового. В среде VBA синхронизация версии программы связана с некоторыми затруднениями, так как этот процесс не должен влиять на работу конечного пользователя.
3.3. Исследование возможности формирования списков групп первого курса, по данным приемной комиссии
Рыбницкий филиал ПГУ им. Т.Г.Шевченко проводит прием абитуриентов на 9 специальностей по результатам тестирования, олимпиад, вступительных экзаменов.
Летом 2013 года авторы исследовали возможность одновременного ввода данных приемной комиссии в таблтицу MSExcel в Рыбнице.
Для этого требуется перехватить действия оператора приемной комиссии при заполнении документов абитуриента. Специализированные программы перехвата событий такого рода позволяют сохранять в лог-файл коды нажатых клавиш и перемещения мыши. По результатам сравнения их эффективности был выбран ScriptWriter. Проблема получения данных по журналу кейлоггера осложнялась разнообразием способов их ввода на рабочем месте приемной комиссии.
Программный комплекс оператора приемной комиссии содержит 11 вкладок: Заявление, Анкета, Место проживания, Паспорт, Образование, Школьные оценки, Документы, Сертификаты, Администратор, Устные экзамены, Отчеты. Внешний вид приложения показан на рис.9. Рис. 9. Общий вид рабочего места приемной комиссии Поля ввода данных на различных вкладках весьма разнообразны по типу. Имеются текстовые поля простого ввода, выпадающие списки значений для выбора, чекбоксы (CheckBox), и т.д.
Была поставлена задача: на основании данных кейлоггера (программы - шпиона) получить максимально возможное количество информации в текстовой форме. Для этого, во-первых, на скриптовом языке Autoit были написаны макросы на start.au3 и stop.au3, которые, соответственно, запускают при включении компьютера и закрывают перед выключением программу ScriptWriter. Сама эта программа и обработчик скриптов Autoit были установлены на рабочее место оператора и с их помощью были зафиксированы операции ввода данных по нескольким абитуриентам. Для анализа полученных логов и реконструирования на их основе текстовых полей информации авторами была написана программа getStud. При ее написании, в частности, был выполнен детальный анализ программного комплекса "Приемная комиссия", исследован интерфейс, размещение вкладок и элементов на этих вкладках. Для точного определения попадания мыши в элемент на экране были необходимы координаты четырех угловых точек элемента (для выпадающих списков еще и их высота), которые были получены с помощью программы Pixie [8] и занесены в программу getStud.
Pixie - это бесплатная маленькая программка (11,5 килобайт), специально созданная для Web-дизайнеров и художников (рис. 10). Она следит за перемещением курсора мышки и показывает цвет точки, на которую он указывает. Рис. 10. Программа Pixie
Программа getStud построчно обрабатывает лог-файлы, записанные ScriptWriter, и на основании анализа событий и предварительно сформированных списков значений элементов выдает данные о каждом абитуриенте (рис. 11). Рис. 11. Программа getStud
С ее помощью удалось собрать следующие данные об абитуриенте: факультет, специальность, форма обучения, язык обучения, пол, Фамилию Имя Отчество, семейное положение, наличие родителей, паспортные данные адрес (частично) и др. Этих данных вполне достаточно для заполнения списков студентов в электронном журнале (рис. 12).
Рис. 12. Список студентов в программе getStud
Программа getStud состоит из одного модуля и трех листов:
* "Stud" - содержит информацию о студентах первого курса, которая заносится в таблицу со следующими значениями полей: факультет, специальность, форма обучения, язык обучения, пол, Фамилию Имя Отчество и др ; * "elem" - содержит перечень выпадающих списков, их значения и координаты четырех угловых точек; * "script" - содержит перечень вкладок, элементов и координаты четырех их угловых точек, а так же в столбце Q содержимое лог - файла. Расшифровка лог- файла показана в следующих столбцах:
- в столбце R показаны вкладки, на которые нажимал пользователь;
- в столбец S программа выводит названия элементов на вкладках;
- в столбце T отображены значения выпадающих списков;
- в столбец U выводится информация, набранная пользователем с клавиатуры.
Для получения необходимых данных об абитуриенте нас интересуют строки: * MouseMove(232,73) - происходит при перемещении указателя мыши по элементу управления;
* MouseDown("left") - возникает при левой кнопки мыши, если указатель мыши находится на элементе;
* MouseUp("left") - происходит при отпускании левой кнопки мыши над данным элементом;
* Send("{SHIFTDOWN}{SHIFTUP}reheibyf") - эмулирует нажатие клавиш ;
Если программа нашла нужные нам строки (содержат события MouseMove и Send), тогда:
* для вкладки - программа проверяет, входят ли координаты X и Y, полученные из события MouseMove (X, Y), с координатами четырех угловых точек в столбцах F, G, H, I. Если входят, значит пользователь нажимал на данную вкладку. Затем программа проверяет все элементы на этой вкладке, пока не найдет другую вкладку.
* Для элемента - программа проходит по всем строкам столбца
K и проверяет входят ли координаты X и Y, полученные из события MouseMove (X, Y), с координатами элементов в диапазон четырех угловых точек в столбцах L, M, N, O. * для текста - программа находит событие Send() и переводит ASCII код в текст.
Модуль содержит основной макрос getFile, который перебирает все лог-файлы и формирует информацию о первокурсниках. Он содержит следующие функций:
> Макрос determELem () - расшифровывает лог-файл, распознает все действия, которые делал пользователь: выбор вкладки, элемента, значения из выпадающего списка.
> Function getCoord (str As String) As String - возвращает координаты, найденные в строке лог-файла.
str - строка в лог-файле.
> Function inRect (x, y, nomRowRect, nomColRect) As Boolean - возвращает True - если x,y внутри квадрата , False - если x,y не в квадрате.
x - координата х в строке лог-файла; y - координата у в строке лог-файла;
nomRowRect - номер строки начала вкладки или элемента; nomColRect - номер столбца начала вкладки или элемента.
> Function getStrVklad(nomVklad As Integer) - возвращает номер первой и последней строки каждой вкладки.
nomVklad - номер вкладки.
> Function getText(str As String) As String - возвращает координаты, найденные в строке лог-файла.
Str - строка в лог-файле.
> Function translate(simvol) As String - возвращает расшифрованный символ.
Simvol - символ в строке.
> Function handle(TransString, SpecBut) As String - расшифровывает спецклавиши.
TransString - результат расшифровки спецклавиши;
SpecBut - наименование спецклавиши.
> Function getStrElem(NameElem As String) - возвращает номер первой и последней строки каждого элемента
> Макрос FormListStud(nomRowElemStud As Integer) - формирует список студентов на листе "Stud".
nomRowElemStud - номер строки с информацией о студенте.
> Function FindElem(ElemStud As String, nomRowNameElem) As Integer - возвращает номер строки с наименованием элемента.
ElemStud - элемент на листе "stud"
nomRowNameElem - номер строки с наименованием элемента.
В процессе эксплуатации было обнаружено, что в программном комплексе "Приемная комиссия" имеются выпадающие списки, содержащие большой перечень строк. Чтобы выбрать нужную строку секретарь приемной комиссии прокручивает колесиком мыши в выпадающем списке. А прокрутка не фиксируется программой ScriptWriter, поэтому некоторые элементы мы распознать не можем. Кроме того, проблемы возникли при вводе наименования улицы. Секретарь приемной комиссии вводит первые буквы названия улицы, программа сразу подсвечивает подходящее название и секретарь нажимает <ENTER> , это тоже программа ScriptWriter не отслеживает. ЗАКЛЮЧЕНИЕ
Система "Автоматизированный переход между семестрами в электронных журналах" прошла тестирование, не все удалось извлечь по результатам приемной комиссии, но показана возможность извлечения текстовых данных из различных компонентов интерфейса сторонней программы. Электронные журналы групп отправлены по кафедрам и еженедельно заполняются и отсылаются в деканат по системе электронной доставки документа. Поставленная цель была достигнута, так как был создан программный продукт, который позволяет осуществлять автоматизированный переход между семестрами в электронных журналах. Реализованы следующие задачи:
3. Изучена предметная область. 4. Осуществлена автоматическая переброска списков студентов прошлого учебного года;
5. Импортировано расписание групп в электронные журналы;
6. Введены в эксплуатацию электронные журналы всех групп;
7. Исследована возможность формирования списков групп первого курса, по данным приемной комиссии.
Внедрение спроектированного модуля автоматизирует процесс ввода данных в электронные журналы, ускорит процесс работы пользователя электронных журналов.
В планах развития системы стоит задача усовершенствовать электронный журнал, сохранять несколько заполненных листов, а не весь журнал, и отправлять их в деканат. Это позволит уменьшить трафик сети и обеспечит доставку журналов без ошибок в деканат.
СПИСОК ЛИТЕРАТУРЫ
1. Глазов А.Б., Тягульская Л. А., Кушнир М.Л., Зух А.В. Элементы автоматизированного учета посещаемости и успеваемости студентов // Вестник науки Приднестровья. - Тирасполь, 2012. - С. 192 - 200.
2. Глазов А. Б., Кушнир М.Л. Электронный журнал как средство учета посещаемости учебных занятий и успеваемости студентов в вузе // Сборник материал VII Международной научно-практической конференции "Михайло-Архангельские чтения". - Рыбница, 2012. - С. 211-213.
3. Глазов А. Б., Кушнир М.Л. Автоматическая обработка данных по посещаемости студентов//Студенческий научный журнал. - Рыбница, 2012. - С. 24 - 32.
4. AutoItMacroGenerator [Электронный ресурс]. - Режим доступа: http://autoit-script.ru/index.php?topic=220.0 5. Expert Home [Электронный ресурс]. - Режим доступа: http://adrenali-soft.ucoz.ru/load/programmi/expert_home_3_2/1-1-0-33
6. Keylogger Lite [Электронный ресурс]. - Режим доступа: http://soft.oszone.net/program/9812/Keylogger_Lite/
7. [Электронный ресурс]. - Режим доступа: http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=80
8. [Электронный ресурс]. - Режим доступа: http://bignesson.ru/programmy/pixie-besplatnaya-programma-dlya-opredeleniya-koda-cveta
9. [Электронный ресурс]. - Режим доступа: http://soft.mydiv.net/win/download-Automatic-Mouse-and-Keyboard.html
10. [Электронный ресурс]. - Режим доступа: http://www.mouserobot.ru/
ПРИЛОЖЕНИЕ
1. Возможность формирования списков первого курса по итогам приемной комиссии
Dim CoordX, CoordY As Integer '-- кординаты x и y в строке
Dim nomVklad, strVkladBeg, strVkladEnd As Integer '-- номер вкладки, начальная строка с координатами вкладок, последняя строка с координатами вкладок
Dim nomRowRect, nomColRect As Integer '-- номер строки и номер колонки в квадрате координат
Dim Bool As Boolean '-- True - если x,y внутри квадрата , False если x,y не в квадрате
Dim TransString, TransStr As String
Dim ButtonSpec As String '-- специальная клавиша
Dim strElemBeg, strElemEnd, nomRowNameElem, nomRowElemStud As Integer
Dim ElemScrip, ElemStud As String
'--перебирает все лог-файлы и формирует информацию о первокурсниках
Sub getFile()
nomRowElemStud = 2 'номер начала строки элементов на листе stud
'-- перебирает файлы
FilThis = ActiveWorkbook.Path + "\" 'путь к файлам
Application.DisplayAlerts = False
'очищяем лист Stud
Sheets("Stud").Select
Rows("3:116").Select
Selection.ClearContents
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
'-- получение первого файла
Fil = Dir(FilThis + "*.au3")
Do While Fil <> ""
'--очищаем столбцы в файле getStud.xls
Sheets("script").Select
Columns("Q:W").Select
Application.CutCopyMode = False
Selection.ClearContents
FilTmpl = FilThis & Fil
Workbooks.Open Filename:=FilTmpl
'-- копируем строки файла
Windows(Fil).Activate
Columns("A:A").Select
Selection.Copy
'--втавляет строки файла
Windows("getStud.xls").Activate
Columns("Q:Q").Select
ActiveSheet.Paste
Selection.ColumnWidth = 27
Range("R1").Select
ActiveCell.FormulaR1C1 = " "
Selection.AutoFill Destination:=Range("R1:R2071"), Type:=xlFillDefault
Range("R1:R2071").Select
Windows(Fil).Activate
'-- закрываем Файл
ActiveWindow.Close
'-- расшифровывает файл
Sheets("script").Select
Call determELem
'-- формируем список абитуриентов
Sheets("Stud").Select
Call FormListStud(nomRowElemStud)
nomRowElemStud = nomRowElemStud + 1
Fil = Dir
Loop
'-- сохраняем getStud.xls
ActiveWorkbook.Save
End Sub
'-распознает элементы и вкладки Sub determELem()
Dim str As String
Dim rowStr, colStr As Integer
rowStr = 2 '-- номер строки со строками из файла
colStr = 17 '-- номер ряда со строками из файла
nomVklad = 1 '-- изначально вкладка 1
rowVkl = 2 '-- номер строки с название вкладок
NameVklad = Trim(Sheets("script").Cells(rowVkl, 5).Text)
getStrVklad (nomVklad) '-- определяет первую строку для вкладки и последнюю строку
str = Trim(Sheets("script").Cells(rowStr, colStr).Text) '-- вытаскивает строку из ряда 17
'-- цикл по всем строкам из файла
While str <> ""
'-- координатам присваем значение 0
CoordX = 0
CoordY = 0
'-- ищет координаты в строке
getText (str) '-- находит в строке текст, вводимый с клавиатуры
If TransString <> "" Then
Cells(rowStr, 21) = TransString
End If
getCoord (str)
If CoordX <> 0 And CoordY <> 0 Then
While str <> "MouseUp(""left"")"
rowStr = rowStr + 1 '-- увеличиваем строку на 1
str = Trim(Sheets("script").Cells(rowStr, colStr).Text)
Wend
'-- проверяем по вкладкам
For rowVkl = 2 To 63
blT = inRect(CoordX, CoordY, rowVkl, 6)
If Bool = True Then Exit For
Next
If CoordX = 145 And CoordY = 156 Then
CoordX = CoordX + 0
End If
Label:
If rowVkl <= 63 Then '-- нашли вкладку
'-- взять номер новой вкладки
nomNewVklad = Sheets("script").Cells(rowVkl, 4).Value
NameVklad = Trim(Sheets("script").Cells(rowVkl, 5).Text)
If nomNewVklad <> nomVklad Then
'-- хранит новую вкладку
Cells(rowStr, 18) = NameVklad
nomVklad = nomNewVklad
If nomVklad = 12 Then nomVklad = 1
getStrVklad (nomVklad)
End If
Else '-- проверяем на элемент внутри вкладки
For rowElem = strVkladBeg To strVkladEnd
bl = inRect(CoordX, CoordY, rowElem, 12)
NameElem = Trim(Sheets("script").Cells(rowElem, 11).Text)
If Bool = True Then Exit For
Next
If rowElem <= strVkladEnd Then '-- нашли элемент
Cells(rowStr, 19) = NameElem
CoordVipadSpis = Trim(Sheets("script").Cells(rowElem, 16).Text)
If CoordVipadSpis <> "" Then
rowStr = rowStr + 1 '-- увеличиваем строку на 1
str = Trim(Sheets("script").Cells(rowStr, colStr).Text)
'-- проверяем элемент из выпадающего списка
getStrElem (NameElem)
If strElemBeg <> 0 And strElemEnd <> 0 Then
CoordX = 0
CoordY = 0
'-- ищет координаты в строке
getCoord (str)
While str <> "MouseUp(""left"")"
rowStr = rowStr + 1 '-- увеличиваем строку на 1
str = Trim(Sheets("script").Cells(rowStr, colStr).Text)
Wend
If CoordX <> 0 And CoordY <> 0 Then
For rowElem = strElemBeg To strElemEnd
bl = inRectEl(CoordX, CoordY, rowElem, 4)
Elem = Sheets("elem").Cells(rowElem, 3).Text
If Bool = True Then Exit For
Next
If rowElem <= strElemEnd Then '-- нашли элемент
Sheets("script").Cells(rowStr, 20) = Elem
Else
GoTo Label
End If
End If
End If
End If End If
rowStr = rowStr + 1 '-- увеличиваем строку на 1
str = Trim(Sheets("script").Cells(rowStr, colStr).Text)
Wend
End Sub
Function getCoord(str As String) As String
'-- возвращает координаты, найденные в строке
Dim PosStringX, SpacePosX, PosStringY, SpacePosY As Integer
PosString = InStr(1, str, "MouseMove(") '-- ищет подстроку "MouseMove("
CommaPos = InStr(PosStringX + 10, str, ",") '-- ищет подстроку ","
If PosString <> 0 And CommaPos <> 0 Then
'-- координаты точки x
CoordX = CInt(Mid(str, PosString + 10, CommaPos - (PosString + 10)))
End If
SkobkaPos = InStr(1, str, ")") ' находим позицию символа ")"
If PosString <> 0 And SkobkaPos <> 0 Then
'-- координаты точки y
CoordY = CInt(Mid(str, CommaPos + 1, SkobkaPos - (CommaPos + 1)))
End If
End Function
Function inRect(x, y, nomRowRect, nomColRect) As Boolean
'-- возвращает True - если x,y внутри квадрата , False - если x,y не в квадрате
Dim xLeft, xRight, yTop, yBottom, exitWh As Integer
xLeft = Sheets("script").Cells(nomRowRect, nomColRect).Value
xRight = Sheets("script").Cells(nomRowRect, nomColRect + 1).Value
yTop = Sheets("script").Cells(nomRowRect, nomColRect + 2).Value
yBottom = Sheets("script").Cells(nomRowRect, nomColRect + 3).Value
'-- проверка вхождения в диапазон
If (x >= xLeft) And (x <= xRight) And (y >= yTop) And (y <= yBottom) Then
Bool = True
Else
Bool = False
End If
inRect = Bool
End Function
Function getStrVklad(nomVklad As Integer)
'-- возращает номер первои и последней строки каждой вкладки
Dim RowNomVklad, ColNomVklad As Integer
strVkladBeg = 0
strVkladEnd = 0
ColNomVklad = 4 '-- столбец с номерами вкладок
RowNomVklad = 2 '-- строка с номерами вкладок
'-- вытаскиваем номер вкадки
Vkladka = Sheets("script").Cells(RowNomVklad, ColNomVklad).Value
'-- ищем нужную вкладку nomVklad
While Vkladka <> "" And ExitWhil = 0
If Vkladka = nomVklad Then
strVkladBeg = RowNomVklad '-- сохраняем номер первой строки для вкладки
While Vkladka = nomVklad
RowNomVklad = RowNomVklad + 1
Vkladka = Sheets("script").Cells(RowNomVklad, ColNomVklad).Value
Wend
strVkladEnd = RowNomVklad - 1 '-- сохраняем номер последней строки для вкладки
ExitWhil = 1
End If
RowNomVklad = RowNomVklad + 1
Vkladka = Sheets("script").Cells(RowNomVklad, ColNomVklad).Value
Wend
End Function
Function getText(str As String) As String
'-- возвращает координаты, найденные в строке
Dim SpacePosKey, rowStrCode, colStrCode, startPosText As Integer
rowStrCode = 2
colStrCode = 2
l = Len(str)
TransString = ""
PosTextSend = InStr(1, str, "Send(") '-- ищет подстроку "Send("
If PosTextSend <> 0 Then
startPosText = PosTextSend + 6 '-- начало текста
For i = startPosText To l - 2
simvol = Mid(str, i, 1)
'-- ищем специальные клавиши
If simvol = "{" Then
i_end = InStr(i + 1, str, "}")
SpecBut = Mid(str, i + 1, i_end - 1 - i)
TransString = handle(TransString, SpecBut)
i = i_end
Else
simvol = translate(simvol)
TransString = TransString + simvol
End If
Next
End If
End Function
Function translate(simvol) As String
Dim pos As Integer
For pos = 2 To 34
If simvol = Trim(Cells(pos, 2).Text) Then
simvol = Trim(Cells(pos, 1).Text)
Exit For
End If
Next
translate = simvol
End Function
Function handle(TransString, SpecBut) As String
Select Case SpecBut
Case "SPACE"
TransString = TransString + " "
Case "BACKSPACE"
TransString = Left(TransString, Len(TransString) - 1)
End Select
handle = TransString
End Function
Function getStrElem(NameElem As String)
'-- возращает номер первои и последней строки каждого элемента
Dim RowNomVklad, ColNomVklad As Integer
strElemBeg = 0
strElemEnd = 0
ColNomElem = 2 '-- столбец с номерами элемента
RowNomElem = 2 '-- строка с номерами элемента
'-- вытаскиваем номер вкадки
Elem = Sheets("elem").Cells(RowNomElem, ColNomElem).Text
'-- ищем нужную вкладку nomVklad
While Elem <> "" And ExitWhil = 0
If Elem = NameElem Then
strElemBeg = RowNomElem '-- сохраняем номер первой строки для элемента
While Elem = NameElem
RowNomElem = RowNomElem + 1
Elem = Sheets("elem").Cells(RowNomElem, ColNomElem).Text
Wend
strElemEnd = RowNomElem - 1 '-- сохраняем номер последней строки для элемента
ExitWhil = 1
End If
RowNomElem = RowNomElem + 1
Elem = Sheets("elem").Cells(RowNomElem, ColNomElem).Text
Wend
End Function
Function inRectEl(x, y, nomRowRect, nomColRect) As Boolean
'-- возвращает True - если x,y внутри квадрата , False - если x,y не в квадрате
Dim xLeft, xRight, yTop, yBottom, exitWh As Integer
xLeft = Sheets("elem").Cells(nomRowRect, nomColRect).Value
xRight = Sheets("elem").Cells(nomRowRect, nomColRect + 1).Value
yTop = Sheets("elem").Cells(nomRowRect, nomColRect + 2).Value
yBottom = Sheets("elem").Cells(nomRowRect, nomColRect + 3).Value
'-- проверка вхождения в диапазон
If (x >= xLeft) And (x <= xRight) And (y >= yTop) And (y <= yBottom) Then
Bool = True
Else
Bool = False
End If
inRectEl = Bool
End Function
Sub FormListStud(nomRowElemStud As Integer)
' формирует список студентов
Dim nomRowElemScrip As Integer
nomRowElemScrip = 2 'номер начала строки элементов на листе scrip
nomColElemStud = 3 'номер начала столбца элементов на листе stud
ElemStud = Sheets("Stud").Cells(2, nomColElemStud).Text ' элемент на листе stud
nomRowNameElem = 2 'номер начала ряда с найденым элементом
While ElemStud <> ""
' поиск элемента на листе scrip
nomRowNameElem = FindElem(ElemStud, nomRowNameElem) 'элемента на листе scrip
ElemScrip = Sheets("script").Cells(nomRowNameElem, 19).Text ExW = 0
' определяет выбор
NameElem = FindNameElem(nomRowNameElem, ElemScrip) If NameElem <> "" Then
'сохраняем данные на лист Stud
Sheets("Stud").Cells(nomRowElemStud + 1, nomColElemStud).Value = NameElem
End If
nomColElemStud = nomColElemStud + 1
ElemStud = Sheets("Stud").Cells(2, nomColElemStud).Text
Wend
drawGrid (nomRowElemStud + 1)
End Sub
Function FindElem(ElemStud As String, nomRowNameElem) As Integer
Dim NameElem As String
nomRowNameElemNew = nomRowNameElem
ElemScrip = Sheets("script").Cells(nomRowNameElem, 19).Text ' элемент на листе scrip
StrScrip = Sheets("script").Cells(nomRowNameElem, 17).Text ' строка файла на листе scrip
While StrScrip <> "" And ExW = 0
If ElemScrip = ElemStud Then
ExW = 1
End If
nomRowNameElem = nomRowNameElem + 1
ElemScrip = Sheets("script").Cells(nomRowNameElem, 19).Text
StrScrip = Sheets("script").Cells(nomRowNameElem, 17).Text
Wend
If ExW = 0 Then
nomRowNameElem = nomRowNameElemNew
End If
FindElem = nomRowNameElem '- 1
End Function
Function FindNameElem(nomRowNameElem, ElemScrip) As String
nomRowNameElemOld = nomRowNameElem
nomColNameElem = 20
' наименоваие выбранного значения у элемента
NameElem = Sheets("script").Cells(nomRowNameElem, nomColNameElem).Text While NameElem = "" And ElemScrip = ""
nomRowNameElem = nomRowNameElem + 1
NameElem = Sheets("script").Cells(nomRowNameElem, nomColNameElem).Text
' наименоваие элемента на листе script
ElemScrip = Sheets("script").Cells(nomRowNameElem, 19).Text Wend
If NameElem = "" Then
NameElem = Sheets("script").Cells(nomRowNameElemOld, nomColNameElem + 1).Text
ElemScrip = Sheets("script").Cells(nomRowNameElemOld, 19).Text
While NameElem = "" And ElemScrip = ""
nomRowNameElemOld = nomRowNameElemOld + 1
NameElem = Sheets("script").Cells(nomRowNameElemOld, nomColNameElem + 1).Text
ElemScrip = Sheets("script").Cells(nomRowNameElemOld, 19).Text
Wend
End If
FindNameElem = NameElem
End Function
'- рисует границы таблицы
Function drawGrid(rowGrid As Integer)
Range("C" + CStr(rowGrid) + ":X" + CStr(rowGrid)).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.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(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End Function
2. Осуществляет автоматическую переброску списков студентов и расписание
Dim PosSimvo, N, BegRowJurn, EndRowJurn, kol, RowRasp, ColRasp As Integer
Dim Path, PathNameOld, PathNameNew, DirectoriesShab(20), IsDirectories(20), Directories(20), NoDirectories(20) As String
Dim Folders$()
Sub AvtomaticSpis()
'- автоматически перебрасывает список студентов прошлого года
Dim Directory, Fil As String
Dim DirectoryShab, FilShab As String
Dim ShJurName, JurName, DirNom, DirLast, strDir As String
Dim RowCur As Integer
kol = 0
Application.DisplayAlerts = False '-- "запрещает" системе задавать лишние вопросы
' очищаем столбец "D"
Columns("D:E").Select
Selection.Interior.ColorIndex = xlNone
RowCur = 7 '-- начало списка имен каталогов поиска
Directory = Trim(Sheets("вр00").Cells(RowCur, 1).Text)
Path = "d:\wm\"
PathNameOld = "d:\wm\Шаблоны 2012-2013 Iполугодие"
PathNameNew = "d:\wm\Шаблоны 2013-2014 Iполугодие"
'ищет папки в пути "d:\wm\"
DirectoryOld = Dirs(Path)
NameNew = ""
NameOld = ""
'-массив папок в пути For i = 1 To N
PathName = Folders(i)
If PathName = PathNameOld Then 'папка Шаблоны 2012-2013 Iполугодие
NameOld = PathNameOld
End If
If PathName = PathNameNew Then 'папка Шаблоны 2013-2014 Iполугодие
NameNew = PathNameNew
End If
Next
If NameOld <> "" Then ' есть путь к старым шаблонам
If NameNew <> "" Then ' есть путь к новым шаблонам
'-- Формируем список каталогов для поиска журнала
RowCur = 27 '-- начало списка имен каталогов поиска
Directory = Trim(Sheets("вр00").Cells(RowCur, 1).Text)
DirNom = 0
DirectoryPath = Dirs(PathNameOld + "\")
While Directory <> ""
DirNom = DirNom + 1
Directories(DirNom) = Directory
RowCur = RowCur + 1
Directory = Trim(Sheets("вр00").Cells(RowCur, 1).Text)
Wend
DirLast = DirNom '-- номер последнего каталога
DirectoryOld = Dirs(PathNameOld + "\") ' ищет папки в пути "d:\wm\Шаблоны 2012-2013 Iполугодие"
kol = IsDir(DirectoryOld + "\") ' есть папки
ColKaf = 5 ' 5 кафедр
strDir = " "
If kol <> ColKaf And kol < ColKaf Then
k = NoDir(kol, 6, 10) ' нет папок
For i = 1 To k
strDir = strDir & Chr(13) & NoDirectories(i)
Next
MsgBox ("У вас нет директории " + strDir) ' нет дерикторий
End If
strDir = " "
DirectoryNew = Dirs(PathNameNew + "\") ' ищет папки в пути "d:\wm\Шаблоны 2013-2014 Iполугодие"
kol = IsDir(DirectoryNew + "\") ' есть папки в пути
If kol <> ColKaf And kol < ColKaf Then ' 5 кафедр
k = NoDir(kol, 1, 5) ' нет папок в пути
For i = 1 To k
strDir = strDir & Chr(13) & NoDirectories(i)
Next
MsgBox ("У вас нет директории " + strDir) ' нет дерикторий
End If
RowCurrent = 7 '-- начало списка имен журналов
ShJurName = Trim(Cells(RowCurrent, 2).Text)
JurName = ShJurName + ".xls"
' ищем курс на один старше
ShJurNameShab = Trim((str(Val(ShJurName)) + 100)) + ".xls"
EndRowJurn = 39
Nom = 1 ' номер строки с началом списка новых журналов шаблонов
For BegRowJurn = 7 To EndRowJurn
'-- ищем журнал по всем каталогам
For DirNom = 6 To DirLast
Directory = Directories(DirNom)
DirectoryShab = Directories(Nom)
Fil = Directory + JurName
FilShab = DirectoryShab + ShJurNameShab
Application.ScreenUpdating = False ' Отключаем "мерцание" окна
If Dir(Fil) <> "" Then
If Dir(FilShab) <> "" Then
'-- нашли нужный файл
'== заполняем нужный лист данными из журнала
'-- читаем нужный лист из журнала
Workbooks.Open Filename:=Fil 'шаблон старый
Workbooks.Open Filename:=FilShab 'шаблон новый
'-- удаляем список
Windows(ShJurNameShab).Activate
Sheets("спис").Select
Rows("4:100").Select
Selection.Delete Shift:=xlUp
'-- удаляем расписание
Sheets("расп").Select
Range("C2:C150").Select
Selection.ClearContents
'-- копируем расписание
Windows(JurName).Activate
Sheets("спис").Select
Range("A4:J63").Select
Selection.Copy
'-- сохраняем расписание
Windows(ShJurNameShab).Activate
Sheets("спис").Select
Range("A4").Select
ActiveSheet.Paste
'-- закрываем старый шаблон
Windows(JurName).Activate
ActiveWindow.Close
'-- закрываем новый шаблон
Windows(ShJurNameShab).Activate
ActiveWorkbook.Save
ActiveWindow.Close
'-- возвращаемся на лист "вр00" в AvtomaticSpis
Windows("AvtomaticRaspAndSpis.xls").Activate
Sheets("вр00").Select
Application.ScreenUpdating = True ' Отключаем "мерцание" окна
f = FindFillJurn(Mid(ShJurNameShab, 1, 3), 4, 40)
Cells(RowCurrent, 7).Select
Else
MsgBox ("У вас нет директории-" + FilShab)
End If
End If
Nom = Nom + 1
Next DirNom
Nom = 1
'-- переходим к следующему журналу-шаблону
RowCurrent = RowCurrent + 1
ShJurName = Trim(Cells(RowCurrent, 2).Text)
JurName = ShJurName + ".xls"
ShJurNameShab = Trim((str(Val(ShJurName)) + 100)) + ".xls"
Next BegRowJurn
Else ' если нет пути
MsgBox ("У вас нет директории d:\wm\Шаблоны 2013-2014 Iполугодие\")
End If
Else ' если нет пути
MsgBox ("У вас нет директории d:\wm\Шаблоны 2012-2013 Iполугодие\")
End If
End Sub
'- автоматически формирует расписание групп
Sub GeneratRasp()
Dim DirectoryShab, DirectoriesShab(20), FilShab As String
Dim ShJurName, JurName As String
Dim RowCur, EndRowJurn, BegRowJurn As Integer
Dim varMergeCells As Variant, objC As Range
RowCurShab = 27 '-- начало списка имен каталогов поиска
DirectoryShab = Trim(Sheets("вр00").Cells(RowCurShab, 1).Text)
DirNomShab = 0
'Формируем список каталогов для поиска новых журналов-шаблонов
For DirNomShab = 1 To 5 '
DirectoriesShab(DirNomShab) = DirectoryShab
RowCurShab = RowCurShab + 1
DirectoryShab = Trim(Sheets("вр00").Cells(RowCurShab, 1).Text)
Next DirNomShab
DirLastShab = DirNomShab '-- номер последнего каталога
RowRasp = 38 '-- номер строки пути к папке расписпние
Windows("AvtomaticRaspAndSpis.xls").Activate
DirectoryRasp = Trim(Sheets("вр00").Cells(RowRasp, 1).Text) '-- путь к папке расписпние
If Dir(DirectoryRasp) <> "" Then
'RowGroupCod = 7 'номер ряда с названием групп
RowRasp = 8 'номер ряда с названием групп
ColRasp = 3 'столбец начала расписания
FilNameRasp = Dir(DirectoryRasp + "*.xls") ' Маска файлов с нужным расширением
FilName = DirectoryRasp + FilNameRasp
Do While FilNameRasp <> ""
' открываем расписание
Workbooks.Open Filename:=FilName
GroupCod = Trim(Cells(RowRasp, ColRasp).Text) ' название и код групп
Windows("AvtomaticRaspAndSpis.xls").Activate
RowCurrent = 7 '-- начало списка имен журналов
ShJurName = Trim(Cells(RowCurrent, 2).Text) 'название журнала-шаблона
CodeJurn = Trim(Cells(RowCurrent, 3).Text) ' код журнала-шаблона
JurName = ShJurName + ".xls"
Application.ScreenUpdating = False ' Отключаем "мерцание" окна
While ShJurName <> ""
'-- ищем новый журнал-шаблон по всем каталогам
For DirNomShab = 1 To DirLastShab
DirectoryShab = DirectoriesShab(DirNomShab)
FilShab = DirectoryShab + JurName
If Dir(FilShab) <> "" Then
'-- нашли нужный файл
Windows(FilNameRasp).Activate
GroupCod = Trim(Cells(RowRasp, ColRasp).Text)
WExit = 0 ' выход из цикла
'проходим по всем группа в файле Расписание.xls
While GroupCod <> "" And WExit <> 1
Lendht = Len(GroupCod) ' длина наименования групп
For i = 1 To Lendht ' по всей длине наименования группы
' вытаскивает символ из наименования группы
simvol = Mid(GroupCod, i, 1)
' если символ = "Р" тогда выризает код группы до конца
If simvol = "Р" Then
Code = Mid(GroupCod, i, Lendht - i + 1)
i = Lendht
End If
Next
'если коды групп из расписания и AvtomaticRaspAndSpis.xls совпадают
If Code = CodeJurn Then
Workbooks.Open Filename:=FilShab ' открываем шаблон новый
'-- удаляем расписание
Sheets("расп").Select
Range("C2:C150").Select
Selection.ClearContents
' расписание активно
Windows(FilNameRasp).Activate
'RowRasp = RowRasp + 1
CellsActiv = Cells(RowRasp + 1, ColRasp).Select
' отрезает только наименование предмета
Ras = Raspisanie(RowRasp + 1, ColRasp, JurName, FilNameRasp)
'шаблон активен
Windows(JurName).Activate
ActiveWorkbook.Save 'сохраняет шаблон
ActiveWindow.Close 'закрывает шаблон
Windows("AvtomaticRaspAndSpis.xls").Activate
f = FindFillJurn(Mid(JurName, 1, 3), 5, 37)
WExit = 1
End If
ColRasp = ColRasp + 1
GroupCod = Trim(Cells(RowRasp, ColRasp).Text)
Wend
End If
Next DirNomShab
ColRasp = 3
RowCurrent = RowCurrent + 1
Windows("AvtomaticRaspAndSpis.xls").Activate
' переход к следующей группе в файле
ShJurName = Trim(Cells(RowCurrent, 2).Text)
CodeJurn = Trim(Cells(RowCurrent, 3).Text)
JurName = ShJurName + ".xls"
Wend
FilNameRasp = Dir(DirectoryRasp + "*.xls")
FilNameRasp = Dir
Loop
Else
MsgBox ("Нет директории d:\wm\Расписание\")
End If
End Sub
Function ReplaceMoreSpaseToOne(str) As String
'-заменяет несколько пробелов одним
Dim strSTR As String
Dim strNew As String
Dim pos As Integer
Dim SpacePos As Integer
Dim StrToSpace As String
Dim EndStr As String
strSTR = str
pos = 1
SpacePos = 1
strNew = ""
Do
SpacePos = InStr(pos, strSTR, " ") '-- ищем первое вхождение пробела
If SpacePos = 0 Then '-- если не нашли - значит побелов нет
ReplaceMoreSpaseToOne = strNew + strSTR
Exit Function
Else
StrToSpace = Mid(strSTR, 1, (SpacePos))
If StrToSpace = " " Then
'-- пропускаем лишние пробелы
EndStr = Mid(strSTR, SpacePos + 1, Len(strSTR) - (SpacePos + 1) + 1)
Else
'-- формируем новую строку
strNew = strNew + StrToSpace
EndStr = Mid(strSTR, SpacePos + 1, Len(strSTR) - (SpacePos + 1) + 1)
End If
strSTR = EndStr '-- продолжаем с тем, что ещё не обработали
End If
Loop
End Function
'-вырезает только название предмета
Function Raspisanie(RowR, ColRasp, JurName, FilNameRasp) As String
Dim str As String
RowCurrent = 3
BegRasp = Trim(Cells(RowR, ColRasp).Text)
Step = 1
CellsActiv = Cells(RowR, ColRasp).Select
' расписание одной группы в столбце, проходит до конца
For Row = 9 To 49
Lendht = Len(BegRasp)
CellsActiv = Cells(RowR, ColRasp).Select
If Lendht = 0 Then
If Selection.MergeCells = True Then
BegRasp = testUnitCells(RowR, ColRasp, BegRasp)
possimvol = FindPodStr(BegRasp)
If possimvol <> 0 Then
str = Mid(BegRasp, 1, possimvol - 1)
str = ReplaceMoreSpaseToOne (str)
Windows(JurName).Activate
Sheets("расп").Select
' сохраняет предмет
Application.ScreenUpdating = True ' включение "мерцание" окна
Cells(RowCurrent, 3).Value = str
Application.ScreenUpdating = False
RowCurrent = RowCurrent + 1
Step = Step + 1
End If
Else
Windows(JurName).Activate
Sheets("расп").Select
' сохраняет предмет
Cells(RowCurrent, 3).Value = BegRasp
RowCurrent = RowCurrent + 1
Step = Step + 1
'если все 5 пар , тогда увеличеваем строку на 1
If Step = 6 Then
Step = 1
RowCurrent = RowCurrent + 1
End If
End If
Else
For i = 1 To Lendht
If Step < 6 Then
Windows(FilNameRasp).Activate
' только предмет
possimvol = FindPodStr(BegRasp)
If possimvol <> 0 Then
str = Mid(BegRasp, i, possimvol - 1)
str = ReplaceMoreSpaseToOne (str)
Windows(JurName).Activate
Sheets("расп").Select
' сохраняет предмет
Application.ScreenUpdating = True ' включение "мерцание" окна
Cells(RowCurrent, 3).Value = str
Application.ScreenUpdating = False
Step = Step + 1
i = Lendht
End If
If Step = 6 Then
Step = 1
RowCurrent = RowCurrent + 1
End If
End If
RowCurrent = RowCurrent + 1
Next
End If
Application.ScreenUpdating = False ' включение "мерцание" окна
Windows(FilNameRasp).Activate
RowR = RowR + 1
BegRasp = Trim(Cells(RowR, ColRasp).Text)
Next Row
End Function
Function FindPodStr(BegRasp) As Integer
'-- ищет подстроки
Dim posPrep As Integer
posPrep = InStr(1, BegRasp, "доц")
If posPrep = 0 Then '-- не доцент
posPrep = InStr(1, BegRasp, "ст.")
If posPrep = 0 Then '-- не старший
posPrep = InStr(1, BegRasp, "преп")
If posPrep = 0 Then '-- не препер
posPrep = InStr(1, BegRasp, "проф")
End If
End If
End If
FindPodStr = posPrep
End Function
Function LeftDubl()
'--- реакция на двойной клик по ячейке ---
'--- отрабатывает по разному в зависимости от листа и позиции ---
Dim RowCur, ColCur As Integer
RowCur = ActiveCell.Row
ColCur = ActiveCell.Column
If Left(ActiveSheet.Name, 4) = "вр00" And RowCur = 9 And ColCur = 1 Then
'-- формирует список
Call AvtomaticSpis
LeftDubl = True
ElseIf Left(ActiveSheet.Name, 4) = "вр00" And RowCur = 11 And ColCur = 1 Then
'-- формирует расписание
Call GeneratRasp
LeftDubl = True
Else
LeftDubl = False
End If
End Function
Function Dirs(Path) As String
'ищет папки в дириктории
Dim Name$
N = 0
Name = Dir(Path, vbDirectory)
Do While Name <> ""
If GetAttr(Path & Name) = vbDirectory And Name <> "." And Name <> ".." Then
N = N + 1
Dim Preserve Folders(1 To N)
Folders(N) = Path & Name
End If
Name = Dir()
Loop
For i = 1 To N
Dirs = Folders$(i)
Next
End Function
'-красит ячейку напротив журнала
Function FindFillJurn(ShJurNameShab, NomCol, NomColor)
Dim EndRow, BegRow As Integer
EndRow = 48
RowCurrent = 7 '-- начало списка имен журналов
ShJurName = Trim(Cells(RowCurrent, 2).Text)
While ShJurName <> ""
If ShJurName = ShJurNameShab Then
' закрашивает в оранжевый цвет
Cells(RowCurrent, NomCol).Select
With Selection.Interior
.ColorIndex = NomColor
.pattern = xlSolid
End With
End If
RowCurrent = RowCurrent + 1
ShJurName = Trim(Cells(RowCurrent, 2).Text)
Wend
End Function
'-- есть папки в пути
Function IsDir(DirName As String) As Integer
kol = 0 ' кол-во папок в дириктории
DirNom = 0
RowCur = 27 '-- начало списка имен каталогов поиска
Directory = Trim(Sheets("вр00").Cells(RowCur, 1).Text)
For i = 1 To N
For DirCol = 1 To 10 ' ко-во дириктории
DirNom = DirNom + 1
d = 0
DirectoryPath = Folders(i) + "\" ' есть в дериктори папки
If DirectoryPath = Directories(DirNom) Then
d = 1
kol = kol + 1
IsDirectories(kol) = DirectoryPath ' нашли папку
End If
RowCur = RowCur + 1
Directory = Trim(Sheets("вр00").Cells(RowCur, 1).Text)
Next
DirCol = 1
DirNom = 0
Next
IsDir = kol
End Function
'-- нет папки в пути
Function NoDir(kol, DirNom As Integer, DirNomEnd As Integer) As Integer
k = 0 ' кол-во не найденных папок
For DirNom = DirNom To DirNomEnd
d = 0
For i = 1 To kol
If Directories(DirNom) <> IsDirectories(i) Then
d = d + 1 ' кол-во не совпадений
End If
Next
If d = kol Then ' нашли не существующую папку
k = k + 1
NoDirectories(k) = Directories(DirNom)
End If
Next
NoDir = k
End Function
Function testUnitCells(RowRasp, ColRasp, BegRasp)
'-- проверяет объдененны ли ячейки
Dim TopRow, DownRow, LeftCol, RightCol As Integer
TopRow = RowRasp - 1 ' ряд на один выше
LeftCol = ColRasp - 1 ' столбец влево
ActivTopRow = Cells(TopRow, ColRasp).Select
If Selection.MergeCells = True Then
BegRasp = Cells(TopRow, ColRasp).Value
End If
ActivLeftCol = Cells(RowRasp, LeftCol).Select
If Selection.MergeCells = True Then
BegRasp = Cells(RowRasp, LeftCol).Value
End If
testUnitCells = BegRasp
End Function
2
Документ
Категория
Рефераты
Просмотров
73
Размер файла
1 930 Кб
Теги
kushnir, praktike, otchet
1/--страниц
Пожаловаться на содержимое документа