ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何將各人員的中班夜班的日期由小到大排序彙整出來

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-9 19:59 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看附件可以知道我想要的結果,煩請各位先進幫忙
,謝謝!

test1.zip

8.74 KB, 下载次数: 13

TA的精华主题

TA的得分主题

发表于 2014-12-9 20:30 | 显示全部楼层
[广告] 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.     For i = 1 To UBound(arr)
  10.       rq = Day(arr(i, 2))
  11.       If Not d.Exists(arr(i, 1)) Then
  12.         Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  13.       End If
  14.       For k = 3 To 4
  15.         If arr(i, k) = "V" Then
  16.           If Not d(arr(i, 1)).Exists(k) Then
  17.             m = 1
  18.             ReDim brr(1 To m)
  19.           Else
  20.             brr = d(arr(i, 1))(k)
  21.             m = UBound(brr) + 1
  22.             ReDim Preserve brr(1 To m)
  23.           End If
  24.           brr(m) = Day(arr(i, 2))
  25.           d(arr(i, 1))(k) = brr
  26.         End If
  27.       Next
  28.     Next
  29.     For Each aa In d.Keys
  30.       For Each bb In d(aa).Keys
  31.         brr = d(aa)(bb)
  32.         For i = 1 To UBound(brr) - 1
  33.           p = i
  34.           For j = i + 1 To UBound(brr)
  35.             If brr(p) > brr(j) Then
  36.               p = j
  37.             End If
  38.           Next
  39.           If p <> i Then
  40.             temp = brr(i)
  41.             brr(i) = brr(p)
  42.             brr(p) = temp
  43.           End If
  44.           d(aa)(bb) = brr
  45.         Next
  46.       Next
  47.     Next
  48.    
  49.     For Each aa In d.Keys
  50.       ss = ""
  51.       For Each bb In d(aa).Keys
  52.         ss = ss & Chr(32) & IIf(bb = 3, "中", "晚") & "/" & Join(d(aa)(bb), ",")
  53.       Next
  54.       d(aa) = Mid(ss, 2)
  55.     Next
  56.     .Range("g2").Resize(d.Count, 2) = Application.Transpose(Array(d.Keys, d.Items))
  57.   End With
  58.       
  59.       
  60. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-12-9 20:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
参见附件。

排班日期.rar

13.77 KB, 下载次数: 16

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-9 20:42 | 显示全部楼层
謝謝!  我要好好研究一下多多學習字典的用法了

TA的精华主题

TA的得分主题

发表于 2014-12-9 21:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub 按钮7_Click()
  2.     Application.ScreenUpdating = False
  3.     arr = ActiveSheet.UsedRange
  4.     Set d1 = CreateObject("scripting.dictionary")
  5.     Set d2 = CreateObject("scripting.dictionary")
  6.     Set d3 = CreateObject("scripting.dictionary")
  7.     Dim brr() As Integer
  8.     For j = 2 To UBound(arr)
  9.         d3(arr(j, 1)) = ""
  10.         If arr(j, 3) = "V" Then
  11.             If d1.exists(arr(j, 1)) Then
  12.                 d1(arr(j, 1)) = d1(arr(j, 1)) & "," & Day(arr(j, 2))
  13.             Else
  14.                 d1(arr(j, 1)) = Day(arr(j, 2))
  15.             End If
  16.         End If
  17.         
  18.         If arr(j, 4) = "V" Then
  19.             If d2.exists(arr(j, 1)) Then
  20.                 d2(arr(j, 1)) = d2(arr(j, 1)) & "," & Day(arr(j, 2))
  21.             Else
  22.                 d2(arr(j, 1)) = Day(arr(j, 2))
  23.             End If
  24.         End If
  25.     Next j
  26.     [g2].Resize(d3.Count) = WorksheetFunction.Transpose(d3.keys)
  27.     r = Cells(Rows.Count, "g").End(3).Row
  28.     arr = Range("g1:h" & r)
  29.     For j = 2 To r
  30.         If d1.exists(arr(j, 1)) Then
  31.             If InStr(d1(arr(j, 1)), ",") = 0 Then
  32.                 str1 = "中/" & d1(arr(j, 1))
  33.             Else
  34.                 crr = Split(d1(arr(j, 1)), ",")
  35.                 ReDim brr(0 To UBound(crr))
  36.                 For m = 0 To UBound(crr)
  37.                     brr(m) = Val(crr(m)) * 1
  38.                 Next m
  39.                 str1 = "中/"
  40.                 str2 = ""
  41.                 For k = 0 To UBound(brr)

  42.                     str2 = str2 & "," & WorksheetFunction.Small(brr, k + 1)
  43.                 Next k
  44.                 str1 = str1 & Right(str2, Len(str2) - 1)
  45.             End If
  46.             
  47.             If d2.exists(arr(j, 1)) Then
  48.                 If InStr(d2(arr(j, 1)), ",") > 0 Then
  49.                     str11 = "■夜/" & d2(arr(j, 1))
  50.                 Else
  51.                     crr = Split(d1(arr(j, 1)), ",")
  52.                     ReDim brr(0 To UBound(crr))
  53.                     For m = 0 To UBound(crr)
  54.                         brr(m) = Val(crr(m)) * 1
  55.                     Next m
  56.                     str11 = "■夜/"
  57.                     str21 = ""
  58.                     For k = 0 To UBound(brr)
  59.                         str21 = str21 & "," & WorksheetFunction.Small(brr, k + 1)
  60.                     Next k
  61.                     str11 = str11 & Right(str21, Len(str21) - 1)
  62.                     
  63.                 End If
  64.                 str1 = str1 & str11
  65.             End If
  66.             
  67.         Else
  68.             If d2.exists(arr(j, 1)) Then
  69.                 If InStr(d2(arr(j, 1)), ",") > 0 Then
  70.                     str1 = "■夜/" & d2(arr(j, 1))
  71.                 Else
  72.                     crr = Split(d1(arr(j, 1)), ",")
  73.                     ReDim brr(0 To UBound(crr))
  74.                     For m = 0 To UBound(crr)
  75.                         brr(m) = Val(crr(m)) * 1
  76.                     Next m
  77.                     str1 = "夜/"
  78.                     str2 = ""
  79.                     For k = 0 To UBound(brr)
  80.                         str2 = str2 & "," & WorksheetFunction.Small(brr, k + 1)
  81.                     Next k
  82.                     str1 = str1 & Right(str2, Len(str2) - 1)
  83.                 End If
  84.             End If
  85.         End If
  86.         arr(j, 2) = str1
  87.     Next j
  88.     Range("g1:h" & r) = arr
  89.     Application.ScreenUpdating = True
  90. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-12-9 21:13 | 显示全部楼层
看看是否满足需求吧

test1.zip

25.15 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2014-12-9 21:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 bluexuemei 于 2014-12-10 07:38 编辑
  1. Sub t()
  2. Set ojs = CreateObject("scriptcontrol"): ojs.Language = "rubyscript": ojs.timeout = -1
  3. y = ojs.eval("def aa(aa);$aa=aa;end")
  4. y = ojs.Run("aa", Sheet1.Range("a2:d" & Sheet1.[a2].End(4).Row).Value)
  5. y = ojs.eval("h1=Hash.new{[]};h2=Hash.new{[]};$aa.each{|x|if x[2].size!=0;h1[x[0]]<<=x[1].split('/')[-1];end;if x[3].size!=0;h2[x[0]]<<=x[1].split('/')[-1];end};$aa.map{|x|x[0]}.uniq.map{|x|[x,((h1[x]!=[]?('中/'+h1[x].join(',')):'') +10.chr+(h2[x]!=[]?('夜/'+h2[x].join(',')):''))[/.+\s?.+/]]}")
  6. Sheet1.[r2].Resize(UBound(y) + 1, 2) = y
  7. Set ojs = Nothing
  8. 'Stop
  9. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-12-9 22:32 | 显示全部楼层
本帖最后由 zax010 于 2014-12-9 22:46 编辑

Sub zz()
    Dim d1, d2, d3, arr, n
    Set d1 = CreateObject("Scripting.Dictionary")
    Set d2 = CreateObject("Scripting.Dictionary")
    Set d3 = CreateObject("Scripting.Dictionary")
    lr = [a65536].End(3).Row
    Range("A1:D" & lr).Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess
    arr = [a1].CurrentRegion
    For i = 2 To UBound(arr)
        d3(arr(i, 1)) = ""
        If arr(i, 3) <> "" Then d1(arr(i, 1)) = d1(arr(i, 1)) & "," & Day(arr(i, 2))
        If arr(i, 4) <> "" Then d2(arr(i, 1)) = d2(arr(i, 1)) & "," & Day(arr(i, 2))
    Next
    For Each k In d3.keys
        Cells(2 + n, "g") = k
        Cells(2 + n, "h") = "中/" & Mid(d1(k), 2) & "■" & "夜/" & Mid(d2(k), 2)
        n = n + 1
    Next
End Sub

TA的精华主题

TA的得分主题

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

test1 (2).zip

24.48 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2014-12-9 22:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 zax010 于 2014-12-9 22:49 编辑

>>>>>>>>>>>>>>>>>>>>>>>>>
test1.rar (11.35 KB, 下载次数: 4)










test1.rar

11.2 KB, 下载次数: 12

test1.rar

11.35 KB, 下载次数: 3

test1.rar

11.35 KB, 下载次数: 3

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

本版积分规则

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

GMT+8, 2024-12-22 17:02 , Processed in 0.044894 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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