楼主 Zaezhong |
Q:如下图所示列举了中韩围棋交流赛中中国棋手的成绩(图中C:J列区域,B列为对手姓名),其中空心圆和实心圆分别代表了不同的结果,同时如“○连笑”和“●连笑”属于同一棋手,但是在统计成绩的时候需要分别统计,如何根据以上信息统计出每一位棋手的成绩?
A:VBA方法- Sub 统计()
- Dim Arr(), Rst(), i&, j&, N&, D As Object, X$, Boo As Boolean
- Set D = CreateObject("scripting.dictionary") '创建字典对象
- Arr = Sheet1.[A1].CurrentRegion.Value '将值赋给一个数组方便后面的取数
- ReDim Rst(1 To UBound(Arr) * UBound(Arr, 2), 1 To 3) '重置Rst数组的大小使得行方向可以容纳数据区域的所有区域
- For i = LBound(Arr) To UBound(Arr) '开始循环,循环每一行
- If IsNumeric(Arr(i, 1)) Then '如果A列是数字
- For j = 3 To UBound(Arr, 2) '开始列方向的循环,循环每一个姓名
- X = Mid$(Arr(i, j), 2) '取得姓名,去掉前面的胜负标记符号
- Boo = Left$(Arr(i, j), 1) = "○" '如果第一个字符是"○"
- If D.exists(X) Then '如果已经存在于字典对象中
- If Boo Then '如果为True
- Rst(D(X), 2) = Rst(D(X), 2) + 1 '对Rst数组的第二列的值加1
- Rst(D(X), 3) = Val(Rst(D(X), 3)) 'Rst数组的第三列保持原来的值,添加这一句的目的是使得为0的显示出0值
- Else '如果Boo为False
- Rst(D(X), 2) = Val(Rst(D(X), 2)) 'Rst数组的第二列保持原来的值,添加这一句的目的是使得为0的显示出0值
- Rst(D(X), 3) = Rst(D(X), 3) + 1 '对Rst数组的第三列的值加1
- End If
- Else '如果当前的姓名在字典中不存在
- N = N + 1: D(X) = N 'N用于计算不重复姓名的个数,D(X) = N 用于给每一个姓名标记一个不同的数
- If Boo Then
- Rst(N, 1) = X: Rst(N, 2) = 1: Rst(N, 3) = 0 'Rst数组第一列添加姓名,第二列赋初始值为1,第三列赋初始值0
- Else '如果Boo为False
- Rst(N, 1) = X: Rst(N, 2) = 0: Rst(N, 3) = 1 'Rst数组第一列添加姓名,第二列赋初始值为0,第三列赋初始值1
- End If
- End If
- Next '循环下一个j
- End If
- Next '循环下一个i
- With Sheet1
- .Columns("L:N").Clear '清除原有的内容
- .[L1:N1] = Split("姓名 ○ ●") '给第一行的区域赋值
- With .[L1]
- .Resize(N, 3).Offset(1) = Rst '将Rst的结果复制给以L2开始的区域
- .Resize(N + 1, 3).HorizontalAlignment = xlCenter '设置L:N三列中非空内容设置水平居中格式
- .Resize(N + 1, 3).Borders.LineStyle = 1 '设置L:N三列中非空内容添加连续的边框
- End With
- .Columns("L:N").AutoFit '自动调整列宽
- End With
- Set D = Nothing '清空字典
- End Sub
函数公式方法Q2输入- =MID(INDIRECT(TEXT(MIN(IF(COUNTIF(Q$1:Q1,"*"&MID(C$2:J$48,2,9))+ISTEXT(A$2:A$48),6553601,ROW($2:$48)/1%+COLUMN(C:J))),"R0C00"),)&"",2,9)
R2输入- =IF(Q2="","",COUNTIF(B:J,R$1&$Q2))
中韩棋手交流赛中国棋手成绩统计.zip |