VBA使用第二个标准计算唯一值

我遇到了一个障碍,试图考虑如何编写VBA代码来计算唯一订单号的数量,以及每个销售人员的订单状态是打开还是closures。

我正在编写会影响Sheet2的VBA。 我需要VBA循环表格(“Sheet2”)Range(“A:A”)和(1)查找Sheet1中的名称; (2a)对与销售人员姓名相对应的唯一订单号进行统计,并且是“打开”,并且(2b)统计对应于销售人员姓名并且是“closures”的唯一订单号。 我devise了“?”来表示我正在用macros计算的值,并且包含了答案编号。

任何帮助是极大的赞赏。 请让我知道,如果我能澄清任何事情。

Sheet1 – 订单

在这里输入图像描述

Sheet2 – 订单摘要

ABC 1 **Name** **Count-Uniq Open Orders** **Count-Uniq Closed Orders** 2 John ? (answer: 2) ? (answer: 0) 3 Ben ? (answer: 1) ? (answer: 1) 4 Fred ? (answer: 1) ? (answer: 0) 

试试这个:)

 Sub Macro1() Dim ws1 As Worksheet, ws2 As Worksheet, wsTemp As Worksheet Dim rng As Range Dim myformula1 As String, myformula2 As String With Application .DisplayAlerts = False .ScreenUpdating = False End With Set ws1 = ThisWorkbook.Sheets("Sheet1") 'where you have your Orders Set ws2 = ThisWorkbook.Sheets("Sheet2") 'where you have your summary which should have names in it ws1.Copy ThisWorkbook.Sheets(1) Set wsTemp = ActiveSheet: wsTemp.Name = "Temp" With wsTemp Set rng = .UsedRange rng.RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlYes End With myformula1 = "=COUNTIFS(" & wsTemp.Name & "!A:A,A2," & wsTemp.Name & "!C:C,""Open"")" myformula2 = "=COUNTIFS(" & wsTemp.Name & "!A:A,A2," & wsTemp.Name & "!C:C,""Closed"")" With ws2.Range(ws2.Range("A2"), ws2.Range("A" & ws2.Rows.Count).End(xlUp)) .Offset(0, 1).Formula = myformula1 .Offset(0, 2).Formula = myformula2 .Offset(0, 1).Resize(, 2).Value = .Offset(0, 1).Resize(, 2).Value End With wsTemp.Delete With Application .DisplayAlerts = True .ScreenUpdating = True End With End Sub 

没有循环。 只是给你一个select:D
希望这有助于任何方式。

testing:

 Sub Tester() Dim d1, d2, arrIn, r, tmp, nm, id, i Dim c, k Set d1 = CreateObject("scripting.dictionary") Set d2 = CreateObject("scripting.dictionary") With Sheets("orders") arrIn = .Range(.Range("A2"), _ Cells(Rows.Count, 3).End(xlUp)).Value End With For r = 1 To UBound(arrIn, 1) nm = arrIn(r, 1) 'name id = arrIn(r, 2) 'order # If Not d1.exists(nm) Then d1.Add nm, Array(0, 0) End If If Not d2.exists(id) Then tmp = d1(nm) i = IIf(UCase(arrIn(r, 3)) = "OPEN", 0, 1) tmp(i) = tmp(i) + 1 d1(nm) = tmp d2.Add id, 0 End If Next r Set c = Sheets("summary").Range("a2") For Each k In d1.keys c.Resize(1, 3).Value = Array(k, d1(k)(0), d1(k)(1)) Set c = c.Offset(1, 0) Next k End Sub 

在表2的单元格B2中:

=SUM(IF(FREQUENCY(IF(Sheet1!$A$2:$A$10=$A2,IF(Sheet1!$C$2:$C$10=B$1,Sheet1!$B$2:$B$10)),IF(Sheet1!$A$2:$A$10=$A2,IF(Sheet1!$C$2:$C$10=B$1,Sheet1!$B$2:$B$10)))>0,1))

这是一个数组公式,所以为了确认按住Ctrl + ShiftEnter ,这将分别在开始和结束处添加一个{}

在单元格C3中:

=SUM(IF(FREQUENCY(IF(Sheet1!$A$2:$A$10=$A2,IF(Sheet1!$C$2:$C$10=C$1,Sheet1!$B$2:$B$10)),IF(Sheet1!$A$2:$A$10=$A2,IF(Sheet1!$C$2:$C$10=C$1,Sheet1!$B$2:$B$10)))>0,1))

同样,它是一个数组,所以Ctrl + Shift和Enter

然后复制公式。

作为替代scheme,就数据透视表解决scheme而言,以下答案涵盖了所需的技术:

简单的数据透视表来计算唯一的值