Переформатирование данных таблицы Excel - VBA
Формулировка задачи:
Добрый день! Помогите, пожалуйста, решить задачку.
Еженедельно с терминалов контроля доступа выгружается Excel-файл с данными о "приходе" и "уходе" сотрудников. К сожалению функции программного обеспечения этих терминалов не позволяют настроить выгрузку в том виде, в котором её хочет видеть "хозяин".
Во вложении пример файла, каким он выгружается, и в нём же Образец, как должно быть.
Я не спец в подобных вещах, покопав интернет нашёл несколько, примерно, похожих кодов, но на отдельный куски.
У меня в голове сложился следующий алгоритм:
1. Создание нового листа в книге с заполненной шапкой как в Образце (с этим разобрался)
2. Разделение столбца Дата, на собственно Дату и Время (тоже разобрался)
Далее все сложно)
3. Копирование ячеек из нового столбца с Временем в столбцы Приход и Уход в соответствии с содержимым в соседнем столбце Событие.
4. И по какой-то аналогии с п. 3, копировать Дату и ФИО.
Вот тут у меня вообще не срабатывает мозг))
Пожалуйста, подскажите с какой стороны мне к этому подойти.
P.S. Я в конторе новый сис. админ. Бывший админ форматировал сие дело вручную, каждый понедельник. Думаю этот процесс у него занимал не менее часа. Вот я и решил немножко оптимизировать процесс.
Спасибо!
Решение задачи: «Переформатирование данных таблицы Excel»
textual
Листинг программы
Sub tt() Dim a, i&, ii&, col1 As New Collection, col2 As New Collection Dim d As Date, x&, t$ With CreateObject("scripting.dictionary"): .comparemode = 1 a = [a1].CurrentRegion.Value On Error Resume Next For i = 2 To UBound(a) d = a(i, 2) col1.Add Int(d), CStr(Int(d)) col2.Add a(i, 1), CStr(a(i, 1)) t = Int(d) & "|" & a(i, 1) .Item(t) = 0& 'это для определения что нужно добавлять строку при выводе .Item(t & "|" & a(i, 3)) = CDate(d - Int(d)) Next On Error GoTo 0 'проверка что в словаре ' Dim k ' For Each k In .keys ' Debug.Print k & "=" & .Item(k) ' Next ReDim a(1 To col1.Count * col2.Count, 1 To 4) 'с запасом, но карман не тянет ведь... For i = 1 To col1.Count For ii = 1 To col2.Count t = col1(i) & "|" & col2(ii) If .exists(t) Then 'были дата и ФИО x = x + 1 a(x, 1) = col1(i) a(x, 2) = col2(ii) If .exists(t & "|" & "приход") Then a(x, 3) = .Item(t & "|" & "приход") If .exists(t & "|" & "уход") Then a(x, 4) = .Item(t & "|" & "уход") End If Next Next End With [f3].Resize(x, 4) = a End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д