Выборка в excel средствами VBA

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

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

Добрый времени суток, товарищи Профессионалы! Прошу Вас помощи в нелегкой мне задачи! Я совсем не силен в тонкостях VBA! Объясняю мою проблему! Есть книга Excel, нужно: на отдельном листе сделать выборку с листа "ТЕСТ". Оставить: - последнее звание - последнюю должность при увольнении - посчитать периоды службы - выделить цветом сотрудников, которым когда-либо было присвоено звание рядовой - должно работать на любом количестве сотрудников Если можно составить такой макрос с пояснениями. Поскольку выборка штатными средствами типа сортировки - не вариант. Заранее благодарен Вам!!!

Решение задачи: «Выборка в excel средствами VBA»

textual
Листинг программы
  1. Sub Выборка_данных()
  2.     Dim i&, j&, k&, q&, LastRow&, A, S$, ArStolbcy, SrokY%, SrokM%, SrokD%, Date2 As Date
  3.     A = Worksheets("ТЕСТ").UsedRange.Value ' Переносим в массив А, все значения из заполненной области листа с исходными данными
  4.                     ' звание,тип,место службы,служба,должность,конец службы,причина увольнения
  5.    ArStolbcy = Array(2, 3, 7, 8, 9, 11, 12)  ' Столбцы для проверки непустых значений
  6.    Worksheets("ТЕСТ").Copy After:=Worksheets("ТЕСТ") ' Копируем лист - будем использовать для вывода результатов
  7.    ActiveSheet.UsedRange.Offset(1, 0).Clear ' Очищаем старые данные ниже шапки
  8.    Columns("A:A").NumberFormat = "@" 'Текстовый формат стлбца A
  9.    Columns("J:K").NumberFormat = "DD.MM.YYYY" ' Форматирование столбцов J K - дата.
  10.    Columns("M:M").NumberFormat = "@" 'Текстовый формат стлбца M
  11.    k = 1 ' Нумерация строк на листе результатов, пропускаем заголовки
  12.    For i = 2 To UBound(A) ' Перебираем массив А по строкам
  13.        S = Trim(A(i, 4) & A(i, 5) & A(i, 6)) ' Соединяем строку Фамилия + Имя + Отчество
  14.        If S <> "" Then
  15.             ' Если ФИО не пустые, то появился новый человек номер k, работаем с ним, заносим в ячейку активного листа
  16.            k = k + 1
  17.             q = k ' Первая строка, в которой будет выводиться человек
  18.            Cells(k, 1) = format(A(i, 1), "#.") ' порядковый номер
  19.            Cells(k, 4) = A(i, 4) ' фамилию
  20.            Cells(k, 5) = A(i, 5) ' имя
  21.            Cells(k, 6) = A(i, 6) ' отчество
  22.            Cells(k, 10) = A(i, 10) ' начало службы
  23.        End If
  24.         'Непустые данные из всех последующих строк текущего человека опять заносим в строку k
  25.        If Trim(UCase(A(i, 2))) = "РЯДОВОЙ" Then
  26.             ' Если элемент массива A(i, 2) содержит слово рядовой , то
  27.            Cells(k, 1).Resize(1, 13).Interior.color = 16764057 ' красим фон диапазона в голубой цвет
  28.        End If
  29.         For j = 0 To 1 '  перебираем столбцы, номера которых в массиве ArStolbcy
  30.            ' Если данные не пустые  , заносим их в первую строку по человеку q
  31.            If Trim(A(i, ArStolbcy(j))) <> "" Then Cells(q, ArStolbcy(j)) = A(i, ArStolbcy(j))
  32.         Next j
  33.         If Trim(Cells(k, 12)) <> "" And Trim(A(i, 4)) = "" And Trim(A(i, 7)) <> "" Then
  34.             ' Если ранее "причина увольнения" была заполнена и нет новой фамилии и есть не пустое место службы, то для человека добавляем еще 1 строку
  35.            k = k + 1
  36.             Cells(k, 1) = Cells(k - 1, 1) ' порядковый номер
  37.        End If
  38.         For j = 2 To UBound(ArStolbcy) '  перебираем столбцы, номера которых в массиве ArStolbcy
  39.            ' Если данные не пустые  , заносим их
  40.            If Trim(A(i, ArStolbcy(j))) <> "" Then Cells(k, ArStolbcy(j)) = A(i, ArStolbcy(j))
  41.         Next j
  42.         If IsEmpty(Cells(k, 10)) And A(i, 10) > 0 Then
  43.             ' Если ранее "начало службы"  не было заполнена и не пуcтые текущие данные, то
  44.            Cells(k, 10) = A(i, 10) ' начало службы
  45.        End If
  46.     Next i
  47.     For k = 2 To k
  48.         'Считаем текущий срок службы по строке k в формате "ГГ-ММ-ДД"
  49.        If Cells(k, 10) > 0 And Cells(k, 11) > 0 Then 'Если обе даты заполнены
  50.            SrokY = DateDiff("yyyy", Cells(k, 10), Cells(k, 11)) 'Находим разницу дат целое число лет
  51.            Date2 = DateAdd("yyyy", SrokY, Cells(k, 10)) 'Прибавляем к дате из 10-того столбца целое число лет
  52.            SrokM = DateDiff("m", Date2, Cells(k, 11)) 'Находим разницу дат целое число месяцев
  53.            If SrokM < 0 Then ' Если отрицательное число месяцев
  54.                Date2 = DateAdd("yyyy", -1, Date2) 'уменьшаем  Date2  на 1 год
  55.                SrokY = SrokY - 1 ' Уменьшаем число лет на 1
  56.                SrokM = DateDiff("m", Date2, Cells(k, 11)) ' Заново считаем число месяцев
  57.            End If
  58.             Date2 = DateAdd("m", SrokM, Date2) 'Прибавляем к дате Date2  целое число месяцев
  59.            SrokD = Cells(k, 11) - Date2
  60.             If SrokD < 0 Then ' Если отрицательное число дней
  61.                Date2 = DateAdd("m", -1, Date2) 'уменьшаем  Date2  на 1 месяц
  62.                SrokM = SrokM - 1 ' Уменьшаем число месяцев на 1
  63.                SrokD = Cells(k, 11) - Date2 ' Заново считаем число дней
  64.            End If
  65.             Cells(k, 13) = format(SrokY, "00-") & format(SrokM, "00-") & format(SrokD, "00") ' Вносим выслугу в формате YY-MM-DD ( "ГГ-ММ-ДД")
  66.        End If
  67.    Next k
  68. End Sub

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


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

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

11   голосов , оценка 4.091 из 5

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

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

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