Переформатирование данных таблицы 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

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


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

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

12   голосов , оценка 4.083 из 5
Похожие ответы