1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 难倒deepseek的VBA,谁能帮忙写下,谢啦!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-3-9 17:28 | 显示全部楼层 |阅读模式
按客户统计各月的不良率,要求:
1. 写VBA代码
2. 统计结果如下格式,并生成新的工作表
4. 原始数据“客户”列,不带机种名,只抓取客户名即可,如三立P750W,只要抓取"三立"
5. 工单数的计算:数据表中工单号和工单数量有重复,一个工单号只需要对应一个工单数量
6. 不良数:即为报表内不良数累加

下格一个为原始数据,一个为输出格式要求:
   2.rar (11.83 KB, 下载次数: 22)

输出格式要求

输出格式要求

原始数据

原始数据

TA的精华主题

TA的得分主题

发表于 2025-3-9 18:51 | 显示全部楼层
本帖最后由 shiruiqiang 于 2025-3-9 18:53 编辑


全自动生成
image.jpg
image.jpg

2.rar

21.93 KB, 下载次数: 11

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-9 18:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 shiruiqiang 于 2025-3-9 19:05 编辑

仔细看了一下,上面代码自己再判断一下不重复的工单号就行,多了一个字典

image.jpg

TA的精华主题

TA的得分主题

发表于 2025-3-9 18:59 | 显示全部楼层
本帖最后由 ykcbf1100 于 2025-3-9 19:12 编辑

一键汇总
更新一下。。。



2.zip

24.55 KB, 下载次数: 23

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-9 19:01 | 显示全部楼层
本帖最后由 ykcbf1100 于 2025-3-9 19:14 编辑
  1. Sub ykcbf()   '//2025.3.9 排重汇总      全表自动生成
  2.     Application.ScreenUpdating = False
  3.     Application.DisplayAlerts = False
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     ReDim brr(1 To 10000, 1 To 100)
  6.     On Error Resume Next
  7.     With Sheets("报表")
  8.         r = .Cells(Rows.Count, 1).End(3).Row
  9.         c = .UsedRange.Columns.Count
  10.         arr = .[a1].Resize(r, c)
  11.     End With
  12.     xm = [{"工单总数","不良总数","不良率"}]
  13.     m = 0
  14.     For i = 2 To UBound(arr)
  15.         s = stoc(arr(i, 1))
  16.         c = Month(arr(i, 6)) + 2
  17.         If Not d.exists(s) Then
  18.             m = m + 3
  19.             d(s) = m
  20.             For x = 1 To 3
  21.                 brr(m - 3 + x, 2) = xm(x)
  22.                 brr(m - 3 + x, 1) = s
  23.             Next
  24.             brr(m - 2, c) = arr(i, 4)
  25.         End If
  26.         r = d(stoc(arr(i, 1)))
  27.         brr(r - 1, c) = brr(r - 1, c) + Val(arr(i, 10))
  28.     Next
  29.     For j = 3 To 14
  30.         For i = 1 To UBound(brr) Step 3
  31.             brr(i + 2, j) = Format(brr(i + 1, j) / brr(i, j), "0.00%")
  32.         Next
  33.     Next
  34.     With Sheets("不良率统计")
  35.         .[a11].Resize(1000, 14).Clear
  36.         With .[a11].Resize(m, 14)
  37.             .Value = brr
  38.             .Borders.LineStyle = 1
  39.             .HorizontalAlignment = xlCenter
  40.             .VerticalAlignment = xlCenter
  41.             With .Font
  42.                 .Name = "微软雅黑"
  43.                 .Size = 11
  44.             End With
  45.         End With
  46.         r = .Cells(Rows.Count, 1).End(3).Row
  47.         For i = r To 11 Step -1
  48.             Set Rng = .Cells(i, 1)
  49.             Set Rng1 = Rng.Offset(-1)
  50.             If Rng = Rng1 Then
  51.                 .Cells(i, 1).Offset(-1).Resize(2).Merge
  52.             End If
  53.         Next
  54.     End With
  55.     Set d = Nothing
  56.     Application.ScreenUpdating = True
  57.     MsgBox "OK!"
  58. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-3-9 19:09 | 显示全部楼层
  1. Sub GenerateSummaryReport()
  2.     Dim srcSheet As Worksheet, destSheet As Worksheet
  3.     Dim lastRow As Long, i As Long, m As Long, rowIndex As Long
  4.     Dim client, jobNumber As String, key
  5.     Dim jobQty As Double, defectQty As Double, monthNum As Long
  6.     Dim mainDict As Object, clientsDict As Object, jobDict As Object
  7.     Dim result() As Variant, data As Variant, clients() As Variant
  8.    
  9.     Set srcSheet = ThisWorkbook.Worksheets("数据源") ' 原始数据所在工作表
  10.     Set destSheet = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)) ' 新建汇总表
  11.     destSheet.Name = "汇总 结果"
  12.     lastRow = srcSheet.Cells(srcSheet.Rows.Count, 1).End(xlUp).Row
  13.    
  14.     ' 初始化主字典
  15.     Set mainDict = CreateObject("Scripting.Dictionary")
  16.    
  17.     ' 遍历原始数据
  18.     For i = 2 To lastRow
  19.         client = Left(Trim(srcSheet.Cells(i, 1).Value), 2)
  20.         jobNumber = CStr(srcSheet.Cells(i, 3).Value)
  21.         jobQty = CDbl(srcSheet.Cells(i, 2).Value)
  22.         defectQty = CDbl(srcSheet.Cells(i, 5).Value)
  23.         
  24.         ' 处理日期
  25.         If IsDate(srcSheet.Cells(i, 4).Value) Then
  26.             monthNum = Month(CDate(srcSheet.Cells(i, 4).Value))
  27.         Else
  28.             monthNum = 0 ' 无效日期跳过
  29.         End If
  30.         If monthNum < 1 Or monthNum > 12 Then GoTo NextRow
  31.         
  32.         key = client & "|" & monthNum
  33.         
  34.         If Not mainDict.Exists(key) Then
  35.             Set jobDict = CreateObject("Scripting.Dictionary")
  36.             jobDict(jobNumber) = 1
  37.             mainDict(key) = Array(jobDict, jobQty, defectQty)
  38.         Else
  39.             data = mainDict(key)
  40.             Set jobDict = data(0)
  41.             If Not jobDict.Exists(jobNumber) Then
  42.                 data(1) = data(1) + jobQty
  43.                 jobDict(jobNumber) = 1
  44.             End If
  45.             data(2) = data(2) + defectQty
  46.             mainDict(key) = data
  47.         End If
  48. NextRow:
  49.     Next i
  50.    
  51.     ' 收集客户列表
  52.     Set clientsDict = CreateObject("Scripting.Dictionary")
  53.     For Each key In mainDict.Keys
  54.         clientsDict(Split(key, "|")(0)) = 1
  55.     Next
  56.     clients = clientsDict.Keys
  57.    
  58.     ' 准备结果数组 (客户数*3行 x 14列)
  59.     ReDim result(1 To 3 * clientsDict.Count, 1 To 14)
  60.     rowIndex = 1
  61.    
  62.     For Each client In clients
  63.         ' 客户名称
  64.         result(rowIndex, 1) = client
  65.         result(rowIndex + 1, 1) = client
  66.         result(rowIndex + 2, 1) = client
  67.         
  68.         ' 指标类型
  69.         result(rowIndex, 2) = "工单总数"
  70.         result(rowIndex + 1, 2) = "不良总数"
  71.         result(rowIndex + 2, 2) = "不良率"
  72.         
  73.         ' 填充月份数据
  74.         For m = 1 To 12
  75.             key = client & "|" & m
  76.             If mainDict.Exists(key) Then
  77.                 data = mainDict(key)
  78.                 result(rowIndex, m + 2) = data(1)             ' 工单数
  79.                 result(rowIndex + 1, m + 2) = data(2)         ' 不良数
  80.                 result(rowIndex + 2, m + 2) = data(2) / data(1) ' 不良率
  81.             Else
  82.                 result(rowIndex, m + 2) = 0
  83.                 result(rowIndex + 1, m + 2) = 0
  84.                 result(rowIndex + 2, m + 2) = 0
  85.             End If
  86.         Next m
  87.         rowIndex = rowIndex + 3
  88.     Next client
  89.    
  90.     ' 写入结果
  91.     With destSheet
  92.         .Cells.Clear
  93.         .Range("A2").Resize(UBound(result, 1), UBound(result, 2)).Value = result
  94.         
  95.         ' 添加标题
  96.         .Range("A1:B1").Value = Array("客户名称", "指标")
  97.         For m = 1 To 12
  98.             .Cells(1, m + 2).Value = m & "月"
  99.         Next m
  100.         
  101.         ' 设置百分比格式
  102.         For i = 1 To .Cells(.Rows.Count, 2).End(xlUp).Row
  103.             If .Cells(i, 2).Value = "不良率" Then
  104.                 .Range(.Cells(i, 3), .Cells(i, 14)).NumberFormat = "0.00%"
  105.             End If
  106.         Next i
  107.         .Columns.AutoFit
  108.     End With
  109. End Sub

复制代码
微信图片_20250309190724.png
微信图片_20250309190754.png

TA的精华主题

TA的得分主题

发表于 2025-3-9 19:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
也不知道他在怎么统计?

image.jpg

TA的精华主题

TA的得分主题

发表于 2025-3-9 19:12 | 显示全部楼层
shiruiqiang 发表于 2025-3-9 19:09
也不知道他在怎么统计?

你应该是对的。对客户列原来我没看,现在更新了一下。

TA的精华主题

TA的得分主题

发表于 2025-3-9 21:29 | 显示全部楼层
  1. (
  2.     df[["客户", "工单数量", "工单号", "纳入日期"]]
  3.     .assign(
  4.         key=lambda d: d.客户.str.extract(r"([\u4e00-\u9fff]+)"),
  5.         月份=lambda d: d.纳入日期.dt.month.astype(str) + "月",
  6.     )
  7.     .groupby(["key", "工单号", "工单数量", "月份"])
  8.     .agg("count")
  9.     .reset_index()
  10.     .groupby(["key", "月份"])
  11.     .apply(
  12.         lambda d: pd.Series(
  13.             [
  14.                 (total := d.工单数量.sum()),
  15.                 (t := d.客户.sum()),
  16.                 "{:.2f}%".format(t / total * 100),
  17.             ],
  18.             index=["总数", "不良数", "不良率"],
  19.         ).reset_index(name="数量"),
  20.         include_groups=False,
  21.     )
  22.     .reset_index(level=-1, drop=True)
  23.     .set_index(keys="index", append=True)
  24.     .unstack([-2], sort=False)
  25.     .pipe(lambda d: d.set_axis([x[-1] for x in d.columns],axis=1))
  26.     .reindex(columns=[f"{x}月" for x in range(1, 13)])
  27.     .rename_axis(index=['公司','指标'])
  28. )
复制代码
image.png
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2025-3-9 21:36 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

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

GMT+8, 2025-4-2 23:25 , Processed in 0.030237 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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