我有一些重要的计算要做,因为我有一个Excel文件,其中的列表示处理我们系统中每个事件的人员的唯一ID列表。我想知道所有事件的干预总数。例如,让我说我有这个:
ID|People working on that incident
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
0|AA0000 BB1111 CC2222 ZZ1234
1|BB1111
2|CC2222 ZZ1234 CC2222 ZZ1234
3|BB1111 CC2222 AA0000 BB1111
我有一个名为 List 的列表,其中包含一个区域,其中包含我实际想要包含的人员ID列表。例如,让我们说List = {"AA0000","CC2222"}
的第一个区域。
现在,我想知道我们的员工(在 List 中)对我所有事件(我们在上面的数组中有4个)进行了多少次干预。结果将是事件ID 0的6:2干预,ID 1为0,ID 2为2,ID 3为2。
假设数据位于不同(已关闭)的工作簿中,如何使用我的列表 List 和A1:B4以上的范围来计算(我最终会使用整列,所以让我们说A:B)?
修改
我已经有了一些可以计算特定单词在整列中的次数的工作。
SUM(
LEN('[myFile.xlsx]Sheet1'!$A:$A)
-LEN(
SUBSTITUTE('[myFile.xlsx]Sheet1'!$A:$A;$Z$1;"")
)
)
/LEN($Z$1)
Z1是我正在寻找的单词(例如:CC2222),而'[myFile.xlsx]Sheet1'!$A:$A
是我在搜索的列。
是否有一种非常简单的方法可以使用数组而不是Z1?长度总是相同的(六加一个空格)。
答案 0 :(得分:1)
使用用户定义函数可以相当轻松地完成此操作。下面的函数有两个参数。第一个是构成您上面标记的第二列的范围"处理该事件的人员#34;。第二个是您的列表,它是一个范围,包含您希望计算的每个ID的单个条目。如您的示例所示,如果单个条目中显示多个相同的ID(例如,您的ID 2已重复CC2222两次),则每个ID都会被计算在内。
要输入此用户定义函数(UDF),请打开Visual Basic编辑器。 确保在Project Explorer窗口中突出显示您的项目。 然后,从顶部菜单中选择“插入/模块” 将下面的代码粘贴到打开的窗口中。
要使用此用户定义函数(UDF),请输入类似
的公式=InterventionCount(B2:B5,H1:H2)
在某个单元格中。
Option Explicit
Function InterventionCount(myRange As Range, myList As Range) As Long
Dim RE As Object, MC As Object
Dim vRange As Variant, vList As Variant
Dim sPat As String
Dim I As Long
vRange = myRange
vList = myList
If IsArray(vList) Then
For I = 1 To UBound(vList)
If Not vList(I, 1) = "" Then _
sPat = sPat & "|" & vList(I, 1)
Next I
Else
sPat = "|" & vList
End If
sPat = "\b(?:" & Mid(sPat, 2) & ")\b"
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = True
.ignorecase = True
.Pattern = sPat
End With
For I = 1 To UBound(vRange)
Set MC = RE.Execute(vRange(I, 1))
InterventionCount = InterventionCount + MC.Count
Next I
End Function
对于非VBA解决方案,您可以使用辅助列。同样,List是一个列,其中包含您要添加的人员列表,每个单元格一个条目。
如果您的数据在B列中,则添加一列并在B2中输入此公式:
此公式必须数组输入;并且$ A:$ J术语代表计数器,允许B列条目中最多有10个项目。如果可能有更多项目,请根据需要进行扩展:例如:对于最多26个项目,您可以将它们更改为$ A:$ Z
=SUM(N(TRIM(MID(SUBSTITUTE(B2," ",REPT(" ",99)),(COLUMN($A:$J)=1)+(COLUMN($A:$J)>1)*(COLUMN($A:$J)-1)*99,99))=(List)))
尽可能向下填写,然后将该列合并以获得总数。
array-enter 一个公式 公式进入单元格或公式栏,按住 ctrl-shift ,同时点击输入。如果你这样做了 正确地说,Excel会在公式周围放置大括号{...}。
答案 1 :(得分:1)
将源数据列拆分为Text to Columns。取消结果,删除中间列并转动剩下的内容。
答案 2 :(得分:0)
我终于根据我的1名员工的工作公式找到了一个完全不同的解决方案:
SUM(
LEN('[myFile.xlsx]Sheet1'!$A:$A)
-LEN(
SUBSTITUTE('[myFile.xlsx]Sheet1'!$A:$A;$Z$1;"")
)
)
/LEN($Z$1)
我没有尝试更复杂的事情,而是在我的员工列表中添加了一个新列,其中评估了每个员工的总数(无论如何已经在其他地方需要)。然后,我只需要总结所有员工以获得我的总数。
它并不像我想的那样优雅,我觉得它是一种解决方法,但是因为它是程序化立场上最简单的解决方案,而且无论如何我都需要个人数据,这是我现在真正需要的。< / p>
给所有其他答案的+1但是你的帮助。