Как использовать Excel VBA для условного добавления и удаления определенных строк в таблице - PullRequest
0 голосов
/ 15 июня 2019

У меня есть таблица со следующими столбцами

Дата, Имя сотрудника, Задание №, Часы, день месяца

каждая строка содержит информацию для всех столбцов.

Все, что я пытаюсь сделать, это объединить (найти СУММ часов) определенные строки на основе следующих критериев / условий:

добавлять и комбинировать строки, когда выполняется следующее значение

  1. имеет ту же дату
  2. имеет такое же имя сотрудника
  3. строк, содержащих задачу №, начинающуюся с «LBR», кроме «LBR 30», «LBR 28» (в моем коде есть еще несколько исключений LBR #)

    ИЛИ в строках есть только исключение LBR (LBR 30, LBR 28 ..)

    ИЛИ строки, в которых есть только задача без LBR #

другими словами, для определенной даты и имени сотрудника я хочу иметь строки только для трех разных категорий

1) общее количество часов «LBR» (без исключений) (определяется по столбцу «Задача №»)

2) общее количество часов «LBR» (только исключение один раз) (определяется по столбцу «Задача №»)

3) всего не "LBR" часов

* +1034 * Пример: * * одна тысяча тридцать пять
Date        Employee            Task    Hrs Dom
6/4/2019,   Wright  , Stephen,  CND05,  30, 4   
6/1/2019,   Wimberly, Robert,   LBR16,  30, 1    
6/1/2019,   Wimberly, Robert,   CNRWK,  30, 1    
6/1/2019,   Wimberly, Robert,   A02060, 30, 1    
6/2/2019,   Wimberly, Robert,   LBR16,  30, 2    
6/2/2019,   Wimberly, Robert,   A03000, 30, 2    
6/2/2019,   Wimberly, Robert,   A03000, 30, 2    
6/2/2019,   Wimberly, Robert,   LBR30,  30, 2    
6/2/2019,   Wimberly, Robert,   LBR28,  30, 2    
6/2/2019,   waja,               A02060  30, 2    
6/2/2019,   waja,               A02060, 30, 2

Я хочу преобразовать это в:

Date        Employee            Task    Hrs Dom
6/4/2019,   Wright, Stephen     CND05,  30, 4   
6/1/2019,   Wimberly, Robert,   LBR16,  30, 1    
6/1/2019,   Wimberly, Robert,   CNRWK,  60, 1    
6/2/2019,   Wimberly, Robert,   LBR16,  30, 2    
6/2/2019,   Wimberly, Robert,   A03000, 60, 2    
6/2/2019,   Wimberly, Robert,   LBR 30, 60, 2    
6/2/2019,   waja    ,       ,   A02060, 60, 2

То, что я сделал, - это любые две строки с одинаковыми датой, именем и категорией задачи (одна из трех категорий), я взял сумму их часов и сохранил одну строку (удалил кого-либо, а другой оставил) (ПРИМЕЧАНИЕ: это может быть более двух рядов, которые необходимо объединить).

Сначала я отсортировал таблицу по дате, имени и заданию # и реализовал следующий код

Sub SortAndSum()

Dim R As Integer
Dim PR As Integer

Dim wkb As Excel.Workbook
Dim wks As Excel.Worksheet

Set wkb = Excel.Workbooks("LaborHours.xlsx")
Set wks = wkb.Worksheets("srg.hours")

R = 6

Do While wks.Cells(R, 2) <> ""

PR = R - 1
If wks.Cells(R, 1) = wks.Cells(PR, 1) Then
    If wks.Cells(R, 2) = wks.Cells(PR, 2) Then
        If InStr(1, wks.Cells(R, 3) & wks.Cells(PR, 3), "LBR") = 0 Then GoTo SumAndDelete
    ElseIf InStr(1, wks.Cells(R, 3) & wks.Cells(PR, 3), "LBR") = 1 Then
        If wks.Cells(R, 3) & wks.Cells(PR, 3) = "LBR10" Or "LBR28" Or "LBR29" Or "LBR291" Or "LBR293" Or "LBR295" Then GoTo SumAndDelete
        ElseIf wks.Cells(R, 3) & wks.Cells(PR, 3) <> "LBR10" Or "LBR28" Or "LBR29" Or "LBR291" Or "LBR293" Or "LBR295" Then GoTo SumAndDelete

SumAndDelete:
wks.Cells(R, 4) = Cells(R, 4) + Cells(PR, 4)
wks.Rows(PR).Delete

        Else
        GoTo NextRow
        End If

End If


NextRow:
R = R + 1
Loop

End Sub

проблема с моим кодом: -Я должен запустить этот код несколько раз, чтобы получить мой окончательный результат. - при работе с LBR я получаю ошибку времени выполнения 13, TYPE MISMATCH. когда я нажимаю кнопку «Отладка», она выделяет следующую часть кода:

ElseIf wks.Cells(R, 3) & wks.Cells(PR, 3) <> "LBR10" Or "LBR28" Or "LBR29" Or "LBR291" Or "LBR293" Or "LBR295" Then GoTo SumAndDelete

1 Ответ

0 голосов
/ 16 июня 2019

@ dwirony. Третий последний оператор if только определяет возможность первых двух случаев категорий (ссылаясь на мое описание прямо перед моим примером). Таким образом, последние два оператора if проверяют первую и вторую категории соответственно.

Кроме того, я хотел, чтобы код выполнял последние два оператора if только тогда, когда третий последний оператор if был истинным. Не уверен, что на самом деле происходит.

@ MathieuGuindon @dwirony спасибо за ваш отзыв. Любые другие предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...