Переформатирование данных таблицы 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д