ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 490|回复: 36

[分享] 成绩条制作

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-11-26 13:16 | 显示全部楼层 |阅读模式

原本是想着WPS有这个工资条的功能但是只能做一个的,不能有多个数据就自己写了一部分,AI优化了一部分
使用的是最简单的方法,筛选和复制所以会等待比较长时间,肯定有更好的方法,时间原因就随便做了一个,能用就行。分享一下然后看看有没有大佬优化
  1. Sub ProcessUniqueValues()
  2.     Dim inputColumn As String, activeSheetName As String
  3.     Dim lastRow As Long
  4.    
  5.     inputColumn = InputBox("请输入姓名所在的列(输入字母)")
  6.     activeSheetName = ActiveWorkbook.ActiveSheet.Name
  7.    
  8.     ' 获取最大行
  9.     lastRow = Sheets(activeSheetName).Cells(Rows.Count, 1).End(xlUp).Row
  10.    
  11.     If lastRow < 2 Or Trim(inputColumn) = "" Then
  12.         MsgBox "请检查当前激活工作表数据,参照模板", vbExclamation
  13.         Exit Sub
  14.     End If
  15.    
  16.     Application.ScreenUpdating = False
  17.    
  18.     Call ExtractUniqueValues(inputColumn & "2:" & inputColumn & lastRow, activeSheetName, lastRow)
  19.    
  20.     Rows("1:2").Delete Shift:=xlShiftUp
  21.     Application.ScreenUpdating = True
  22.     Call dy
  23. End Sub

  24. Sub ExtractUniqueValues(inputRange As String, activeSheetName As String, lastRow As Long)
  25.     Dim rng As Range
  26.     Dim uniqueValues As Variant
  27.     Dim i As Long
  28.     Dim lastUsedRow As Long
  29.     Dim outputSheet As Worksheet
  30.    
  31.     ' 检查用户输入的范围
  32.     If Trim(inputRange) = "" Then
  33.         MsgBox "您没有输入范围。", vbExclamation
  34.         Exit Sub
  35.     End If
  36.    
  37.     ' 设置范围
  38.     On Error Resume Next
  39.     Set rng = Range(inputRange)
  40.     On Error GoTo 0
  41.    
  42.     If rng Is Nothing Then
  43.         MsgBox "输入的范围无效,请检查后重试。", vbExclamation
  44.         Exit Sub
  45.     End If
  46.    
  47.     ' 创建新工作表
  48.     Set outputSheet = ThisWorkbook.Worksheets.Add
  49.     outputSheet.Name = "成绩条" & Format(Now, "yyyymmddhhmmss")
  50.    
  51.     ' 获取唯一值
  52.     uniqueValues = GetUniqueValues(rng)
  53.    
  54.     ' 过滤和复制数据
  55.     With Sheets(activeSheetName)
  56.         .Range("A1").AutoFilter
  57.         Dim lastColumn As String
  58.         lastColumn = GetLastUsedColumnLetter(activeSheetName)
  59.         
  60.         For i = LBound(uniqueValues) To UBound(uniqueValues)
  61.             .Range("A1:" & lastColumn & lastRow).AutoFilter Field:=2, Criteria1:=Array(uniqueValues(i)), Operator:=xlFilterValues
  62.             
  63.             lastUsedRow = .Cells(Rows.Count, 1).End(xlUp).Row
  64.             .Range("A1:" & lastColumn & lastUsedRow).Copy
  65.             
  66.             Dim outputRow As Long
  67.             outputRow = outputSheet.Cells(Rows.Count, 1).End(xlUp).Row + 3
  68.             outputSheet.Range("A" & outputRow).PasteSpecial
  69.             
  70.             With outputSheet.Range("A" & outputRow + 3 & ":" & lastColumn & outputRow + 3).Borders(xlEdgeBottom)
  71.                 .Weight = xlMedium
  72.                 .LineStyle = xlDash
  73.             End With
  74.         Next i
  75.         
  76.         .Range("A1").AutoFilter
  77.     End With
  78. End Sub

  79. Function GetUniqueValues(rng As Range) As Variant
  80.     Dim cell As Range
  81.     Dim uniqueCollection As Collection
  82.     Dim uniqueArray() As Variant
  83.     Dim i As Long
  84.    
  85.     Set uniqueCollection = New Collection
  86.     On Error Resume Next ' 忽略错误以避免重复值引发的错误
  87.    
  88.     For Each cell In rng
  89.         If Not IsEmpty(cell.Value) Then
  90.             uniqueCollection.Add cell.Value, CStr(cell.Value)
  91.         End If
  92.     Next cell
  93.    
  94.     On Error GoTo 0 ' 恢复默认错误处理
  95.    
  96.     ReDim uniqueArray(0 To uniqueCollection.Count - 1)
  97.     For i = 1 To uniqueCollection.Count
  98.         uniqueArray(i - 1) = uniqueCollection(i)
  99.     Next i
  100.    
  101.     GetUniqueValues = uniqueArray
  102. End Function

  103. Function GetLastUsedColumnLetter(sheetName As String) As String
  104.     Dim lastColumn As Long
  105.     lastColumn = Sheets(sheetName).Cells(1, Columns.Count).End(xlToLeft).Column
  106.     GetLastUsedColumnLetter = Split(Cells(1, lastColumn).Address, "$")(1)
  107. End Function

  108. Sub dy()
  109.     ActiveSheet.PageSetup.LeftMargin = 18
  110.     ActiveSheet.PageSetup.RightMargin = 18
  111.     ActiveSheet.PageSetup.TopMargin = 54
  112.     ActiveSheet.PageSetup.BottomMargin = 54
  113.     ActiveSheet.PageSetup.HeaderMargin = 21.5
  114.     ActiveSheet.PageSetup.FooterMargin = 21.5
  115.     ActiveSheet.PageSetup.FitToPagesWide = 1
  116.     ActiveSheet.PageSetup.FitToPagesTall = 0
  117.     ActiveSheet.PageSetup.BottomMargin = 42.519685
  118.     ActiveSheet.PageSetup.TopMargin = 39.685039
  119. End Sub

复制代码
image.png



成绩条.zip

36.36 KB, 下载次数: 12

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-11-27 11:26 | 显示全部楼层
感觉写的很繁琐,哪里要这么多代码?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-11-27 11:28 | 显示全部楼层
LIUZHU 发表于 2024-11-27 11:26
感觉写的很繁琐,哪里要这么多代码?

我比较业余 所以写代码不是很规范 就是兴趣爱好 优化我感觉肯定还可以 所以发出来看看有没有大佬进行优化然后学习学习

TA的精华主题

TA的得分主题

发表于 2024-11-27 15:02 | 显示全部楼层
JSA代码,供参考,适合WPS
  1. function 生成成绩条(){
  2.         const arr=Sheets.Item("模板").Range("a1").CurrentRegion.Value2;
  3.         const obj=arr.slice(1).reduce((obj,x)=>{
  4.                 let key=x[1];
  5.                 let temp=obj[key]=obj[key] || [arr[0]];
  6.                 temp.length==1?temp.push(x):temp.push(x,[],[]);
  7.                 return obj;
  8.         },{});
  9.         const res=Object.values(obj).flat();
  10.         Sheets.Item("成绩条").Activate();
  11.         Cells.Delete();
  12.         const rng=Range("a2").Resize(res.length, res[0].length);
  13.         rng.NumberFormatLocal="@", rng.HorizontalAlignment=xlHAlignCenter;
  14.         Range("a2").Resize(res.length, res[0].length).Value2=res;
  15.         [...Range("a1").Resize(res.length,1)].forEach(rg=>{
  16.                 if (rg.Value2!="批次") return;
  17.                 rg.CurrentRegion.Borders.LineStyle=xlContinuous;
  18.                 rg.Resize(1,res[0].length).Font.Bold=true;
  19.                 rg.Offset(3,0).Resize(1,res[0].length).Borders.Item(xlEdgeBottom).Weight=xlMedium;
  20.                 rg.Offset(3,0).Resize(1,res[0].length).Borders.Item(xlEdgeBottom).LineStyle=xlDash;
  21.         });
  22. }
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-11-27 15:03 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-11-27 15:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
代码比VBA简单
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-11-27 18:25 | 显示全部楼层
LIUZHU 发表于 2024-11-27 15:02
JSA代码,供参考,适合WPS

JSA是js和vba的结合体吗?简洁了很多突然感觉我的又臭又长
不太会js,只会简单的 感谢大佬解答 用ai解释学习一下

TA的精华主题

TA的得分主题

发表于 2024-11-27 20:40 | 显示全部楼层
用自定义框架函数主体就2句代码 剩下的就是美化了
function 生成成绩条(){
        var arr=maxArray_Z("模板!a1:n1").sortByCols_Z("f2",1);
    toMatrix_Z(arr.slice(1),2,1,"r",5,14,arr.slice(0,1)).toRange_Z("成绩条!a2");

}

TA的精华主题

TA的得分主题

发表于 2024-11-27 20:45 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-11-28 09:06 | 显示全部楼层
cjc209 发表于 2024-11-27 20:40
用自定义框架函数主体就2句代码 剩下的就是美化了
function 生成成绩条(){
        var arr=maxArray_Z("模板!a1 ...

有点看不懂 而且会报错
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-25 15:35 , Processed in 0.035068 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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