0

我有一个数据表“订单”,其中包含格式的数据

order no    Customer    Sales Executive Order Status    Order Date
211 nokia   john    cancelled   23-May-13
643 panasonic   andrew  fulfilled   23-May-13
209 samsung john    fulfilled   4-Apr-14
453 philips andrew  fulfilled   4-Apr-14
311 dell    mary    fulfilled   16-Apr-14
865 panasonic   andrew  fulfilled   16-Apr-14
201 apple   john    fulfilled   3-May-14
453 hp  mary    cancelled   3-May-14
205 nokia   john    fulfilled   4-May-14
643 philips andrew  fulfilled   4-May-14
312 lenovo  mary    fulfilled   22-May-14
204 apple   john    fulfilled   7-Jun-14
432 hp  mary    fulfilled   7-Jun-14
214 nokia   john    pending 25-Jun-14
754 panasonic   andrew  fulfilled   25-Jun-14

以上是订单表中众多列中重要的列。

我有另一个工作表,其中列出了“销售主管”,并想知道他们按月完成了多少个独特客户的订单

Sales Executive Apr-14  May-14  Jun-14
john    <value> <value> <value>
mary    <value> <value> <value>
andrew  <value> <value> <value>

我想编写代码以读取行中的销售主管姓名和列中的月份,然后给出如下答案

Sales Executive Apr-14  May-14  Jun-14
john    1   2   1
andrew  2   2   1
mary    1   1   1

我正在寻找可以按月运行的 vba 代码。上面的示例是实际数据的样本集。

我对 VBA 比较陌生,需要代码方面的帮助。

如果我得到关于代码如何工作的解释会很有帮助,因为我需要类似的代码来查找每个销售主管在几个月内产生了多少产品和总收入。

提前感谢您的帮助

编辑(来自下面的 OP 评论的代码):

Sub UniqueReport() 
Dim dict As Object 
Set dict = CreateObject("scripting.dictionary") 
Dim varray As Variant, element As Variant 
Dim lastrow As Long 

lastrow = Sheets("Orders").Range("N" & Rows.Count).End(xlUp).Row varray = Sheets("Orders").Range("N2:N" & lastrow).Value 

For Each element In varray 
    If dict.exists(element) Then 
        dict.Item(element) = dict.Item(element) + 1 
    Else 
        dict.Add element, 1 
    End If 
Next 

ActiveSheet.Range("P2").Value = dict.Count 
End Sub 
4

1 回答 1

0

您可以在没有 VBA 的情况下仅使用工作表公式和函数来执行此操作。

在您的主数据表上,在日期列旁边添加一列,并在第 2 行的单元格中粘贴以下公式:

=TEXT(E2,"mmm yyyy")

这将使月份和年份可用于比较

接下来在您的销售主管工作表中,在单元格 B2 中输入此公式

=COUNTIFS(Orders!$C2:$C$16,$A2,Orders!$F$2:$F$16,B$1)

那么这个公式在做什么呢?

在第一个条件中,我们指定我们要将 A2 中的名称与 C:C 列中的所有值进行比较,并且我们希望将 A 行中的月份与我们放置在 Orders 表的 F 列中的 TEXT 月份进行比较。

然后,您可以将公式拖到您需要的月份,然后向下拖到每个销售主管

另见:

编辑

您也可以以编程方式执行此操作:

  1. 添加一个带有TEXT公式的虚拟列,以提供月份和年份日期,以便在订单工作表上进行比较。
  2. 在销售主管表上添加公式
  3. 在公式上复制粘贴值
  4. 删除虚拟列

尝试这个:

With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
End With

With Sheets("Orders")
    .Columns("E:E").Insert Shift:=xlToRight
    .Range("E2:E" & .Range("D2").End(xlDown).Row).FormulaR1C1 = "=TEXT(RC[1],""mmm yyyy"")"
End With

With Sheets("Sales Executives")
    .Range("B2:D" & .Range("A2").End(xlDown).Row).FormulaR1C1 = "=COUNTIFS(Orders!C3,RC1,Orders!C5,R1C)"
    .Range("B2:D" & .Range("A2").End(xlDown).Row).Copy
    .Range("B2:D" & .Range("A2").End(xlDown).Row).PasteSpecial Paste:=xlPasteValues
End With

Sheets("Orders").Columns("E:E").Delete Shift:=xlToLeft

With Application
    .ScreenUpdating = True
    .DisplayAlerts = True
End With

因此,您需要做的就是使用 F8 单步执行代码以查看它的作用。

当然,另一种选择是在使用 SQL PIVOT 函数检索数据的 SQL Server 查询中进行计算。

希望有帮助

于 2014-08-08T09:05:37.287 回答