Переформатирование данных таблицы Excel - VBA

Узнай цену своей работы

Формулировка задачи:

Добрый день! Помогите, пожалуйста, решить задачку. Еженедельно с терминалов контроля доступа выгружается Excel-файл с данными о "приходе" и "уходе" сотрудников. К сожалению функции программного обеспечения этих терминалов не позволяют настроить выгрузку в том виде, в котором её хочет видеть "хозяин". Во вложении пример файла, каким он выгружается, и в нём же Образец, как должно быть. Я не спец в подобных вещах, покопав интернет нашёл несколько, примерно, похожих кодов, но на отдельный куски. У меня в голове сложился следующий алгоритм: 1. Создание нового листа в книге с заполненной шапкой как в Образце (с этим разобрался) 2. Разделение столбца Дата, на собственно Дату и Время (тоже разобрался) Далее все сложно) 3. Копирование ячеек из нового столбца с Временем в столбцы Приход и Уход в соответствии с содержимым в соседнем столбце Событие. 4. И по какой-то аналогии с п. 3, копировать Дату и ФИО. Вот тут у меня вообще не срабатывает мозг)) Пожалуйста, подскажите с какой стороны мне к этому подойти. P.S. Я в конторе новый сис. админ. Бывший админ форматировал сие дело вручную, каждый понедельник. Думаю этот процесс у него занимал не менее часа. Вот я и решил немножко оптимизировать процесс. Спасибо!

Решение задачи: «Переформатирование данных таблицы Excel»

textual
Листинг программы
  1. Sub tt()
  2.     Dim a, i&, ii&, col1 As New Collection, col2 As New Collection
  3.     Dim d As Date, x&, t$
  4.  
  5.     With CreateObject("scripting.dictionary"): .comparemode = 1
  6.         a = [a1].CurrentRegion.Value
  7.         On Error Resume Next
  8.         For i = 2 To UBound(a)
  9.             d = a(i, 2)
  10.             col1.Add Int(d), CStr(Int(d))
  11.             col2.Add a(i, 1), CStr(a(i, 1))
  12.             t = Int(d) & "|" & a(i, 1)
  13.             .Item(t) = 0&    'это для определения что нужно добавлять строку при выводе
  14.            .Item(t & "|" & a(i, 3)) = CDate(d - Int(d))
  15.         Next
  16.         On Error GoTo 0
  17.         'проверка что в словаре
  18.        '                Dim k
  19.        '                For Each k In .keys
  20.        '                Debug.Print k & "=" & .Item(k)
  21.        '                Next
  22.  
  23.         ReDim a(1 To col1.Count * col2.Count, 1 To 4)    'с запасом, но карман не тянет ведь...
  24.        For i = 1 To col1.Count
  25.             For ii = 1 To col2.Count
  26.                 t = col1(i) & "|" & col2(ii)
  27.                 If .exists(t) Then    'были дата и ФИО
  28.                    x = x + 1
  29.                     a(x, 1) = col1(i)
  30.                     a(x, 2) = col2(ii)
  31.                     If .exists(t & "|" & "приход") Then a(x, 3) = .Item(t & "|" & "приход")
  32.                     If .exists(t & "|" & "уход") Then a(x, 4) = .Item(t & "|" & "уход")
  33.                 End If
  34.             Next
  35.         Next
  36.  
  37.     End With
  38.  
  39.     [f3].Resize(x, 4) = a
  40.  
  41. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы