ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > 综合应用 > 如何统计中韩棋手交流赛中国棋手成绩?

如何统计中韩棋手交流赛中国棋手成绩?

作者:绿色风 分类: 时间:2022-08-18 浏览:135
楼主
Zaezhong
Q:如下图所示列举了中韩围棋交流赛中中国棋手的成绩(图中C:J列区域,B列为对手姓名),其中空心圆和实心圆分别代表了不同的结果,同时如“○连笑”和“●连笑”属于同一棋手,但是在统计成绩的时候需要分别统计,如何根据以上信息统计出每一位棋手的成绩?

 
A:VBA方法
  1. Sub 统计()
  2.     Dim Arr(), Rst(), i&, j&, N&, D As Object, X$, Boo As Boolean
  3.     Set D = CreateObject("scripting.dictionary")    '创建字典对象
  4.     Arr = Sheet1.[A1].CurrentRegion.Value   '将值赋给一个数组方便后面的取数
  5.     ReDim Rst(1 To UBound(Arr) * UBound(Arr, 2), 1 To 3)    '重置Rst数组的大小使得行方向可以容纳数据区域的所有区域
  6.     For i = LBound(Arr) To UBound(Arr)      '开始循环,循环每一行
  7.         If IsNumeric(Arr(i, 1)) Then    '如果A列是数字
  8.             For j = 3 To UBound(Arr, 2)     '开始列方向的循环,循环每一个姓名
  9.                 X = Mid$(Arr(i, j), 2)      '取得姓名,去掉前面的胜负标记符号
  10.                 Boo = Left$(Arr(i, j), 1) = "○"    '如果第一个字符是"○"
  11.                 If D.exists(X) Then     '如果已经存在于字典对象中
  12.                     If Boo Then     '如果为True
  13.                         Rst(D(X), 2) = Rst(D(X), 2) + 1     '对Rst数组的第二列的值加1
  14.                         Rst(D(X), 3) = Val(Rst(D(X), 3))    'Rst数组的第三列保持原来的值,添加这一句的目的是使得为0的显示出0值
  15.                     Else    '如果Boo为False
  16.                         Rst(D(X), 2) = Val(Rst(D(X), 2))    'Rst数组的第二列保持原来的值,添加这一句的目的是使得为0的显示出0值
  17.                         Rst(D(X), 3) = Rst(D(X), 3) + 1     '对Rst数组的第三列的值加1
  18.                     End If
  19.                 Else    '如果当前的姓名在字典中不存在
  20.                     N = N + 1: D(X) = N     'N用于计算不重复姓名的个数,D(X) = N 用于给每一个姓名标记一个不同的数
  21.                     If Boo Then
  22.                         Rst(N, 1) = X: Rst(N, 2) = 1: Rst(N, 3) = 0     'Rst数组第一列添加姓名,第二列赋初始值为1,第三列赋初始值0
  23.                     Else    '如果Boo为False
  24.                         Rst(N, 1) = X: Rst(N, 2) = 0: Rst(N, 3) = 1     'Rst数组第一列添加姓名,第二列赋初始值为0,第三列赋初始值1
  25.                     End If
  26.                 End If
  27.             Next    '循环下一个j
  28.         End If
  29.     Next    '循环下一个i
  30.     With Sheet1
  31.         .Columns("L:N").Clear   '清除原有的内容
  32.         .[L1:N1] = Split("姓名 ○ ●")      '给第一行的区域赋值
  33.         With .[L1]
  34.             .Resize(N, 3).Offset(1) = Rst   '将Rst的结果复制给以L2开始的区域
  35.             .Resize(N + 1, 3).HorizontalAlignment = xlCenter    '设置L:N三列中非空内容设置水平居中格式
  36.             .Resize(N + 1, 3).Borders.LineStyle = 1     '设置L:N三列中非空内容添加连续的边框
  37.         End With
  38.         .Columns("L:N").AutoFit     '自动调整列宽
  39.     End With
  40.     Set D = Nothing     '清空字典
  41. End Sub
函数公式方法Q2输入
  1. =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输入
  1. =IF(Q2="","",COUNTIF(B:J,R$1&$Q2))

中韩棋手交流赛中国棋手成绩统计.zip
2楼
狐狸
望尘莫及
3楼
wh_china2010
我勒个擦,

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap