ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 统计每月每人加班,原来是竖列想变成横列。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-9 19:58 | 显示全部楼层 |阅读模式
1装置制造课包梦新0
2装置制造课包梦新0
3装置制造课包梦新30.5
4装置制造课包梦新23
5装置制造课包梦新0
6装置制造课包梦新30
7装置制造课包梦新37.5
8装置制造课包梦新45.5
9装置制造课包梦新32.5
10装置制造课包梦新50
11装置制造课包梦新37.5
·
1~11月份个人加班统计(想成为如下的横列) 2014年加班汇总.zip (65.37 KB, 下载次数: 23)

编号班组姓名合计1234567891011
1
装置制造课包梦新
286.5
0
0
30.5
23
0
30
37.5
45.5
32.5
50
37.5


TA的精华主题

TA的得分主题

发表于 2014-12-9 20:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub test()
  2.   Dim d As Object
  3.   Dim r%, i%
  4.   Dim arr, brr()
  5.   Set d = CreateObject("scripting.dictionary")
  6.   With Worksheets("sheet1")
  7.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  8.     arr = .Range("a2:d" & r)
  9.     mm = Application.Max(Application.Index(arr, 0, 1))
  10.     For i = 1 To UBound(arr)
  11.       xm = arr(i, 2) & "+" & arr(i, 3)
  12.       If Not d.Exists(xm) Then
  13.         ReDim brr(1 To mm + 4)
  14.         For j = 1 To 3
  15.           brr(j) = arr(i, j)
  16.         Next
  17.       Else
  18.         brr = d(xm)
  19.       End If
  20.       brr(arr(i, 1) + 4) = brr(arr(i, 1) + 4) + arr(i, 4)
  21.       brr(4) = brr(4) + arr(i, 4)
  22.       d(xm) = brr
  23.     Next
  24.   End With
  25.   With Worksheets("sheet2")
  26.     .UsedRange.Offset(1, 0).ClearContents
  27.     .Range("a2").Resize(d.Count, UBound(brr)) = Application.Transpose(Application.Transpose(d.Items))
  28.   End With
  29. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-12-9 20:09 | 显示全部楼层
参见附件。

2014年加班汇总.rar

66.33 KB, 下载次数: 54

TA的精华主题

TA的得分主题

发表于 2014-12-9 20:11 | 显示全部楼层
本帖最后由 zhaogang1960 于 2014-12-9 20:46 编辑

字典法请参考:
  1. Sub Macro1()
  2.     Dim arr, brr(), d As Object, i&, j&, m&
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Sheets("Sheet1").Range("A1").CurrentRegion
  5.     ReDim brr(1 To UBound(arr), -3 To 11)
  6.     For i = 2 To UBound(arr)
  7.         s = arr(i, 2) & arr(i, 3)
  8.         If Not d.Exists(s) Then
  9.             m = m + 1
  10.             d(s) = m
  11.             brr(m, -3) = m
  12.             For j = 2 To 4
  13.                 brr(m, j - 4) = arr(i, j)
  14.             Next
  15.             brr(m, arr(i, 1)) = arr(i, 4)
  16.         Else
  17.             brr(d(s), 0) = brr(d(s), 0) + arr(i, 4)
  18.             brr(d(s), arr(i, 1)) = brr(d(s), arr(i, 1)) + arr(i, 4)
  19.         End If
  20.     Next
  21.     With Sheets("Sheet2")
  22.         .UsedRange.Offset(1).ClearContents
  23.         .[a2].Resize(m, 15) = brr
  24.     End With
  25. End Sub
复制代码



TA的精华主题

TA的得分主题

发表于 2014-12-9 20:19 | 显示全部楼层
本帖最后由 zhaogang1960 于 2014-12-9 20:39 编辑

4楼代码假设编号最大为11,下面去掉该条件
  1. Sub 编号未知()
  2.     Dim arr, brr(), d As Object, i&, j&, m&, c&, s$
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Sheets("Sheet1").Range("A1").CurrentRegion
  5.     c = Application.Max(Sheets("Sheet1").[a:a])
  6.     ReDim brr(1 To UBound(arr), -3 To c)
  7.     For i = 2 To UBound(arr)
  8.         s = arr(i, 2) & arr(i, 3)
  9.         If Not d.Exists(s) Then
  10.             m = m + 1
  11.             d(s) = m
  12.             brr(m, -3) = m
  13.             For j = 2 To 4
  14.                 brr(m, j - 4) = arr(i, j)
  15.             Next
  16.             brr(m, arr(i, 1)) = arr(i, 4)
  17.         Else
  18.             brr(d(s), 0) = brr(d(s), 0) + arr(i, 4)
  19.             brr(d(s), arr(i, 1)) = brr(d(s), arr(i, 1)) + arr(i, 4)
  20.         End If
  21.     Next
  22.     With Sheets("Sheet2")
  23.         .Cells.ClearContents
  24.         .[a1:d1] = Array("编号", "班组", "姓名", "合计")
  25.         .[e1] = 1
  26.         .[e1].AutoFill Destination:=.[e1].Resize(, c), Type:=xlFillSeries
  27.         .[a2].Resize(m, c + 4) = brr
  28.     End With
  29. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2014-12-9 20:42 | 显示全部楼层
ADO中的TransForm语句也可以实现,请参考:
  1. Sub ADOTransForm()
  2.     Dim cnn As Object, rs As Object, i&, SQL$
  3.     Set cnn = CreateObject("ADODB.Connection")
  4.     Set rs = CreateObject("ADODB.Recordset")
  5.     cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName
  6.     SQL = "TRANSFORM SUM(合计) SELECT null as 编号,班组,姓名,SUM(合计) AS 合计 FROM [Sheet1$] GROUP BY 班组,姓名 PIVOT 编号"
  7.     rs.Open SQL, cnn, 1, 3
  8.     Cells.ClearContents
  9.     For i = 0 To rs.Fields.Count - 1
  10.         Cells(1, i + 1) = rs.Fields(i).Name
  11.     Next
  12.     Range("A2").CopyFromRecordset rs
  13.     [a2] = 1
  14.     [a2].AutoFill Destination:=[a2].Resize(rs.RecordCount), Type:=xlFillSeries
  15.     rs.Close
  16.     cnn.Close
  17.     Set rs = Nothing
  18.     Set cnn = Nothing
  19. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-12-9 21:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhaogang1960 发表于 2014-12-9 20:19
4楼代码假设编号最大为11,下面去掉该条件

For j = 2 To 4 是什么意思?摸不透。

TA的精华主题

TA的得分主题

发表于 2014-12-9 21:26 | 显示全部楼层
张雄友 发表于 2014-12-9 21:16
For j = 2 To 4 是什么意思?摸不透。

第一列写编号到brr的-3列,但是不是原来的编号,而是累计号
从第二列到第四列写入brr-2到0列
brr第1列以后专门用于写合计

TA的精华主题

TA的得分主题

发表于 2014-12-10 09:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub zz()
    Dim d1, d2, arr, brr
    Set d1 = CreateObject("Scripting.Dictionary")
    Set d2 = CreateObject("Scripting.Dictionary")
    arr = Sheet1.Range("A1").CurrentRegion
    Sheet2.Range("A2:O1000") = ""
    brr = Sheet2.Range("A1:O1000"): m = 1
    For i = 2 To UBound(arr)
        d1(arr(i, 2) & "," & arr(i, 3)) = ""
        d2(arr(i, 2) & arr(i, 3) & arr(i, 1)) = arr(i, 4)
    Next
    For Each k In d1.keys
        m = m + 1: s = Split(k, ","): brr(m, 1) = m - 1: brr(m, 2) = s(0): brr(m, 3) = s(1)
        For j = 5 To UBound(brr, 2)
            brr(m, j) = d2(brr(m, 2) & brr(m, 3) & brr(1, j))
            brr(m, 4) = brr(m, 4) + brr(m, j)
        Next
    Next
    Sheet2.Range("A1").Resize(m, UBound(brr, 2)) = brr
End Sub

TA的精华主题

TA的得分主题

发表于 2014-12-10 09:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
>>>>>>>>>>>>>>>>>>>>>
2014年加班汇总.rar (56.88 KB, 下载次数: 39)









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

本版积分规则

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

GMT+8, 2024-11-16 18:00 , Processed in 0.056274 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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