Изменить: добавлен образец необработанных данных ниже
Я запускаю отчет о претензиях каждый месяц и копирую данные во вкладку. Все данные организованы в столбцы, и я использовал электронную таблицу, полную SumProduct
и CountIf
, для подсчета и организации данных на основе разных наборов критериев, но обработка занимает слишком много времени, поэтому я пытаюсь написать VBA sub, чтобы сделать это более эффективно. Один из столбцов данных — «Наладчик домашнего офиса». Этот столбец в основном представляет собой список офисов, из которых исходит каждое требование. Я использовал AdvancedFilter
, чтобы извлечь все уникальные значения в этом столбце и скопировать их на отдельную вкладку в столбце A. Затем в столбце C, под каждым местоположением, у меня есть список типов заявок или «позиций», обрабатываемых в каждом из них. офис. У меня нет проблем с установкой этой части. В столбце D мне нужно иметь возможность отображать количество каждой позиции в указанном месте. Вот где все Countif
и SumProduct
вступили в игру в моем старом шаблоне, который я использовал. Вот тут я наткнулся на загвоздку. Я пытаюсь использовать циклы For Each для подсчета каждого элемента строки в столбце B ниже первого местоположения, затем перейти к следующему местоположению в столбце A и повторить. Ниже приведен код, который я пробовал:
Private Sub CommandButton23_Click()
Dim linerngs As Range
Dim lineitem As Range
Dim lastlinerow As Long
Dim wsf
Dim TabLastRow
Dim claimstab As String
Dim officesrange As Range
Dim office As Range
claimstab = Sheet2.Range("F2") & " Claims"
TabLastRow = Sheets(claimstab).Cells(Sheets(claimstab).Rows.Count, "A").End(xlUp).Row
Set wsf = Application.WorksheetFunction
officeslastrow = Sheet2.Range("A" & Rows.Count).End(xlUp).Row
lastlinerow = Sheet2.Range("C" & Rows.Count).End(xlUp).Row
Set officerng = Range("A6:A" & officeslastrow).SpecialCells(xlCellTypeConstants, 23)
Set linerngs = Range("C7:C" & lastlinerow).SpecialCells(xlCellTypeConstants, 23)
For Each office In officerng
For Each lineitem In linerngs
If InStr(1, lineitem.Value, "IN") > 0 And InStr(1, lineitem.Value, "AOS") = 0 Then
lineitem.Offset(0, 3) = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheets(claimstab).Range("B2:B" & TabLastRow), office))
End If
Next lineitem
Next office
End Sub
Я знаю, что это неправильно, потому что эти циклы будут перебирать все в столбце B, а не только элементы строки ниже каждого местоположения. В итоге я получаю количество последних местоположений, отображаемых для каждой позиции во всем столбце. Ниже приведен пример того, как мне нужно, чтобы он выглядел. Сейчас все, что меня волнует, это настроить цикл для правильной работы.
пример того, что я сейчас получаю [
пример того, что я пытаюсь получить [
Из первого примера видно, что я получаю значение «3» для всего. Я включил сводку местоположений и их значений. вы можете видеть, что последнее место в опорной точке, Южный Портленд, имеет счет 3.
Любая помощь будет принята с благодарностью.
пример необработанных данных [
Цель [
[список позиций заполняется с помощью пользовательской формы, запрашивающей ввод данных пользователем
Cells()
,Range()
,Rows.Count
и т. д. Например, измените свои строки наofficeslastrow = Sheet2.Range("A" & Sheet2.Rows.Count).End(xlUp).Row
(и то же самое для другой переменной). - person BruceWayne   schedule 24.11.2015