Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3336|回复: 18

[已解决]请教大神:怎样把公式转换为VBA代码?谢!

[复制链接]
发表于 2016-1-15 11:30 | 显示全部楼层 |阅读模式
请教大神:怎样把公式转换为VBA代码?谢!.rar (452.78 KB, 下载次数: 18)
发表于 2016-1-15 17:34 | 显示全部楼层
回复

使用道具 举报

发表于 2016-1-18 10:32 | 显示全部楼层
  1. Sub 汇总1()
  2.     Dim Rng As Range
  3.     Application.ScreenUpdating = False
  4.     r = [a65536].End(3).Row
  5.     Range("u6:y" & r).ClearContents
  6.     arr = Range("a6:y" & r)
  7.     Set d = CreateObject("scripting.dictionary")
  8.    
  9.     For i = 1 To UBound(arr)
  10.         For j = 6 To 20
  11.             If Val(arr(i, j)) > 0 Then
  12.                 arr(i, 21) = arr(i, 21) + arr(i, j)      '总分
  13.                 arr(i, 23) = arr(i, 23) + 1      '考试科数
  14.                 If arr(i, j) >= 60 Then arr(i, 22) = arr(i, 22) + 1    '及格科数
  15.             End If
  16.         Next
  17.         If Len(arr(i, 4)) > 0 Then      '有姓名
  18.             arr(i, 21) = Val(arr(i, 21))
  19.             x = arr(i, 1): y = x & arr(i, 2)
  20.             Set Rng = Cells(i + 5, 21)
  21.             If Not d.exists(x) Then Set d(x) = Rng Else Set d(x) = Union(d(x), Rng)      '同年级所在的Range
  22.             If Not d.exists(y) Then Set d(y) = Rng Else Set d(y) = Union(d(y), Rng)       '同班级所在的Range
  23.         End If
  24.     Next
  25.     Range("a6:y" & [a65536].End(3).Row) = arr      '运行结果:总分,考试科数,及格科数
  26.    
  27.     For i = 1 To UBound(arr)
  28.         x = arr(i, 1): y = x & arr(i, 2)
  29.         If Len(arr(i, 4)) > 0 Then      '有姓名
  30.             arr(i, 24) = Application.WorksheetFunction.Rank(arr(i, 21), d(x))    '年级排名
  31.             arr(i, 25) = Application.WorksheetFunction.Rank(arr(i, 21), d(y))       '班级排名
  32.         End If
  33.     Next
  34.     Range("a6:y" & r) = arr
  35.     Application.ScreenUpdating = True
  36. End Sub
复制代码
回复

使用道具 举报

发表于 2016-1-18 10:33 | 显示全部楼层
  1. Sub 汇总()
  2.     Application.ScreenUpdating = False
  3.     r = [a65536].End(3).Row
  4.     Range("u6:y" & r).ClearContents
  5.     arr = Range("a6:y" & r)
  6.     For i = 1 To UBound(arr)
  7.         For j = 6 To 20
  8.             If Val(arr(i, j)) > 0 Then
  9.                 arr(i, 21) = arr(i, 21) + arr(i, j)      '总分
  10.                 arr(i, 23) = arr(i, 23) + 1      '考试科数
  11.                 If arr(i, j) >= 60 Then arr(i, 22) = arr(i, 22) + 1    '及格科数
  12.             End If
  13.         Next
  14.     Next
  15.     Range("a6:y" & [a65536].End(3).Row) = arr      '运行结果:总分,考试科数,及格科数
  16.    
  17.     Range("a6:y" & [a65536].End(3).Row).Sort key1:=[a1], key2:=[U1], order2:=xlDescending     '按级+总分排序,计算级名
  18.     arr = Range("a6:y" & r)
  19.     arr(1, 24) = 1: n = 1
  20.     For i = 2 To UBound(arr)
  21.         If arr(i, 1) = arr(i - 1, 1) Then
  22.            If Len(arr(i, 4)) > 0 Then      '有姓名
  23.                 n = n + 1
  24.                 arr(i, 24) = n
  25.                 If arr(i, 21) = arr(i - 1, 21) Then arr(i, 24) = arr(i - 1, 24)
  26.             End If
  27.         Else
  28.             n = 1
  29.             arr(i, 24) = n
  30.         End If
  31.     Next
  32.     Range("a6:y" & r) = arr           '运行结果:年级排名
  33.    
  34.     Range("a6:y" & [a65536].End(3).Row).Sort key1:=[a1], key2:=[b1], key3:=[U1], order3:=xlDescending    '按级+班+总分排序,计算班名
  35.     arr = Range("a6:y" & r)
  36.     arr(1, 25) = 1: n = 1
  37.     For i = 2 To UBound(arr)
  38.         If arr(i, 2) = arr(i - 1, 2) Then
  39.            If Len(arr(i, 4)) > 0 Then      '有姓名
  40.                 n = n + 1
  41.                 arr(i, 25) = n
  42.                 If arr(i, 21) = arr(i - 1, 21) Then arr(i, 25) = arr(i - 1, 25)
  43.             End If
  44.         Else
  45.             n = 1
  46.             arr(i, 25) = n
  47.         End If
  48.     Next
  49.     Range("a6:y" & r) = arr           '运行结果:班级排名
  50.     Range("a6:y" & [a65536].End(3).Row).Sort key1:=[c1]    '按序号排序,恢复原序
  51.     Application.ScreenUpdating = True
  52. End Sub
复制代码
回复

使用道具 举报

发表于 2016-1-18 10:36 | 显示全部楼层    本楼为最佳答案   
提供了两种方法供参考。方法1是用字典存放同年级或是同年同班的总分,然后用工作表函数Rank得出相应排名;方法2是先按年级+总分排名,再按年级+班级+总分排名,得出名次后恢复原序。
方法1代码比较简洁,但要用到字典的概念。方法2比较直观,易于理解,但代码长一点,且因为多次排序可能速度慢一点。

请教大神:怎样把公式转换为VBA代码?谢!.rar

636.69 KB, 下载次数: 8

评分

参与人数 1 +3 收起 理由
白云无尽9987 + 3 很给力

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-1-27 12:09 | 显示全部楼层
本帖最后由 白云无尽9987 于 2016-1-27 12:46 编辑
888.rar (598.35 KB, 下载次数: 8)

........................
回复

使用道具 举报

发表于 2016-1-27 13:50 | 显示全部楼层
改好啦。看来字典的用法你还没真正掌握。

888.rar

873.29 KB, 下载次数: 15

回复

使用道具 举报

发表于 2016-1-27 13:52 | 显示全部楼层
另外折算方法也小改了一下,直接写成iif形式。
x=iif(true,a,b) 就等于
if true then x=a else x=b
折算总分也改成=语数外+物折+化折+。。。其他折
回复

使用道具 举报

 楼主| 发表于 2016-1-27 16:02 | 显示全部楼层
本帖最后由 白云无尽9987 于 2016-1-27 16:33 编辑
grf1973 发表于 2016-1-27 13:50
改好啦。看来字典的用法你还没真正掌握。

多谢大神多次帮教,...……
④像V8、V15、V32里的及格科数“0”能否显示出来?
谢!
回复

使用道具 举报

发表于 2016-1-27 16:21 | 显示全部楼层
vba编辑界面下,点工具--引用,把里面显示“丢失”的点掉。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 17:00 , Processed in 0.351703 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表