Pull to refresh

MS Excel, на что способны макросы или спасибо Биллу от преподавателей

Reading time 4 min
Views 14K
image
Идея использовать MS Excel в обучении возникла давно. На форумах с аналогичной тематикой по программированию VBA встречаешь упоминание что Макросы всемогущи. Так ли это?

Предупреждение
Данная статья будет бесполезна, не интересна, противна и непонятна более чем 99,9999999% жителей планеты земля включая самого Билла, а также большинство преподавателей любого учебного заведения.

Постановка задачи


Как известно, Болонский процесс шагает по Российским альма-матер семимильными шагами. И многие уже перешли на балльно-рейтинговую систему (БРС) оценок знаний (http://study.engr.pfu.edu.ru/). А это дополнительно накладывает на преподавателей дополнительную трудовую повинность: вести учёт успеваемости и постоянно публиковать данные в интернет.

Причём первое присутствовало и до БРС, но последнее требует постоянный подсчёт баллов и скрупулезное введение многочисленного массива данных по каждому ведомому предмету. А в дисциплине может присутсвовать несоколько потоков, человек 60 запросто. Т.е ежемесечно в среднем 100 записей проставляются в интернет каждым сотрудником. Занимает это «удовольствие» у всех по-разному. У меня, например, примерно час и ещё половина на проверку. И это не только в институтах. В школах тенденция знать оценки своих чад онлайн проглядывается также. Конечно, это никак не оплачивается. Давайте попробуем автоматизировать данный процесс.

Excel придёт на помощь


Билл, хотя тебя и не любят, но от преподавателей, пользующихся хакнутой версией Винды и Офиса, тебе большое российское СПАСИБО!
image
Как видно из картинки, каждый студент может найти своё место в ячейке в табеле о рангах. При этом даже без макросов по формулам автоматом подсчитываюся заработанные баллы.

Осталось написать кусок кода публикующий весь этот беспорядок на сайт. Кратко расскажу о методах достижения нашей цели.
Для публикации необходимо вначале запарсить html код страницы назначения и определить в каком поле расположен тот или иной студент.

Получить html
Function JabberGET(ByVal Urlka As String) As String
Dim objHTTP As Object
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
objHTTP.Open "GET", Urlka, False
objHTTP.setRequestHeader "Accept", "text/html"
objHTTP.setRequestHeader "Accept-Language", "ru-ru,ru"
objHTTP.setRequestHeader "Accept-Encoding", "gzip,deflate"
objHTTP.setRequestHeader "Accept-Charset", "windows-1251"
objHTTP.setRequestHeader "Keep-Alive", "115"
objHTTP.setRequestHeader "Connection", "keep-alive"
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.Send Empty
Debug.Print objHTTP.responseText
JabberGET = objHTTP.responseText
End Function


Парсинг выполняется регулярными выражениями:
Dim RegEx As RegExp, RegMatch As MatchCollection
Dim myMatch As Match
Set RegEx = New RegExp
'String to parse
With RegEx
.MultiLine = True
.IgnoreCase = True
.Global = True
End With
RegEx.Pattern = "discipline_id..value=.\d{3,4}.|\s>\s.*<..>"
Set RegMatch = RegEx.Execute(MyStr)
If RegMatch.Count > 0 Then
For Each myMatch In RegMatch
тело запроса
Next
End If


Затем пишем код отрывающий Internet Explorer и следующий по кнопкам «Далее» до нужной нам формы:
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
Application.DisplayAlerts = False
url = "http://study.engr.pfu.edu.ru/index.php"
IE.Navigate "http://study.engr.pfu.edu.ru/tutor/logout.php"
While IE.Busy: DoEvents: Wend 'wait until IE is done loading page.

IE.Navigate url
Do Until IE.ReadyState = READYSTATE_COMPLETE: Loop

While IE.Busy: DoEvents: Wend 'wait until IE is done loading page.
IE.Visible = True
'ie is now done loading the page
IE.Document.all("valid_tutor_login").Value = getpass(0)
IE.Document.all("valid_tutor_password").Value = getpass(1)

Call ckickBtn("Войти", IE)
While IE.Busy: DoEvents: Wend 'wait until IE is done loading page.
SubjCod = CoursGroupNumber(2, GroupNum)

For Each btn In IE.Document.all.tags("Input")
X = btn.Value
If btn.Value = SubjCod Or btn.Value = CourseNum Then
Call btn.Click
End If
Next btn
Call ckickBtn("Далее>>", IE)

Кликаем по кнопкам следующей функцией:
Function ckickBtn(btm As String, IE As InternetExplorer)
For Each btn In IE.Document.all.tags("Input")
X = btn.Value
If btn.Value = btm Then
Call btn.Click
End If
Next btn
While IE.Busy: DoEvents: Wend 'wait until IE is done loading page.
Do Until IE.ReadyState = READYSTATE_COMPLETE: Loop 'Loop unitl ie page is fully loaded
End Function


image

Форма открыта и данные вводятся на сайт автоматом в соответсвии с полями, полученными на стадии парсинга. Просто и со вкусом.

Итог


Перечислим возможности, которых удалось достичь при помощи макросов:
• Автоматический подсчёт баллов обучающихся
• Автоматическая публикация баллов на сайт инженерного факультета http://study.engr.pfu.edu.ru/
• Создание новых рабочих листов с уточненными списками студентов для следующего семестра
• Ведение шаблонов для новых списков в соответствии с предметом и расписанием
• Быстрая фильтрация студентов по нескольким критериям, в том числе и по баллам
• Возможность задать вопрос своему создателю (переписка с поддержкой)
• Программа всегда в курсе последних изменений на сайте инженерного факультета и сама обновляет списки студентов и предметов
• Статистика среднего балла для всех преподавателей инженерного факультета с учётом аттестации и без
• Статистика среднего балла для всех курсов инженерного факультета с учётом аттестации и без

Замечу только, что все перечисленное выше доступно любому пользователю Excel без установки каких-либо дополнительных модулей. Запускается программа не из *.xls, а как *.exe файл, что допускает работать с отключёнными на машине макросами, плюс автоматически создаётся резервная копия.

Ну и напоследок блок-схемка
image

P.S.
Как быстро ввести баллы на сайт из Excel?
image

Как быстро создать список студентов на следующий семестр?
image
Tags:
Hubs:
-9
Comments 22
Comments Comments 22

Articles