Excel精英培训网

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

[已解决]谁能帮我用写以下程序啊?大哥求你了

[复制链接]
发表于 2013-7-3 22:14 | 显示全部楼层 |阅读模式
本帖最后由 jeffljh 于 2013-7-6 00:50 编辑

我每次做休假台账(sheet1)的时候,都必须在备注栏位手工录入休假类型,我想编写一个VBA程序,每次打开的时候,自动实现以下功能:比如以Albert(第3行)为例,在G3“年休假”一栏录入4后,程序自动在备注栏填写上“年休假“;再比如像Tony(第9-10行)请了两次假,一次是年休假,一次是事假,程序在备注栏自动合并单元格(M9和M10),然后再自动填写上“年休假&事假”;再比如Pont(第5-6行)也是休了两次假,两次都是病假和年休假,程序自动在备注栏合并单元格(M5和M6),然后自动填充上去掉重复的一项,即不填充“病假&年休假&病假&年休假”而是去掉重复的,只填充“病假&年休假”
PS:这个表有500个人,我只截取了其中一部分,远远没有显示完。
如果能实现前两项就感激不尽了,如果第三项也能实现,那我们就喝血酒拜兄弟吧
最佳答案
2013-7-6 18:38
  1. Sub test()
  2.     Dim I%, J%, K%, N%
  3.     Range("Q3:Q65536").ClearContents
  4.     For I = 3 To Range("M65536").End(3).Row
  5.         Set D = CreateObject("scripting.dictionary")
  6.         If Cells(I, "Q").MergeCells Then N = Cells(I, "Q").MergeArea.Count - 1 Else N = 0
  7.         For J = 0 To N
  8.             For K = 4 To 12
  9.                 If Trim(Cells(I + J, K)) <> "" Then D(Cells(2, K).Value) = ""
  10.             Next
  11.         Next
  12.         Cells(I, "Q") = Join(D.KEYS, "&")
  13.         I = I + N
  14.     Next
  15. End Sub
复制代码
TEST.rar (11.71 KB, 下载次数: 5)
wenti1.jpg

休假台账.zip

8.7 KB, 下载次数: 4

发表于 2013-7-3 22:20 | 显示全部楼层
你截个图干什么?表格还让别人为你做,你要传附件上来,并详细说明要求。
回复

使用道具 举报

发表于 2013-7-3 23:55 | 显示全部楼层
回复

使用道具 举报

发表于 2013-7-4 08:10 | 显示全部楼层
没有附件怎么让人帮你??!!
回复

使用道具 举报

发表于 2013-7-4 08:55 | 显示全部楼层
翠花,上附件              
回复

使用道具 举报

 楼主| 发表于 2013-7-6 00:50 | 显示全部楼层
jb_008 发表于 2013-7-4 08:55
翠花,上附件

已经上附件了,麻烦你了
回复

使用道具 举报

 楼主| 发表于 2013-7-6 00:51 | 显示全部楼层
zjdh 发表于 2013-7-4 08:10
没有附件怎么让人帮你??!!

已经上附件了,麻烦你了
回复

使用道具 举报

 楼主| 发表于 2013-7-6 00:51 | 显示全部楼层
1091126096 发表于 2013-7-3 22:20
你截个图干什么?表格还让别人为你做,你要传附件上来,并详细说明要求。

已经上附件了,麻烦你了
回复

使用道具 举报

发表于 2013-7-6 10:44 | 显示全部楼层
本帖最后由 adders 于 2013-7-6 09:54 编辑

个人建议,类似这种表格,能不用合并单元格就不要用,EXCEL和VBA对合并单元格的操作使用上有诸多的不便.

当然就按照你现有的表格及要求,也不难做到,以下是代码,代码后是附件(打开文件后点"Test"按钮就可以测试)
  1. Sub test()
  2. Const FRow = 3
  3. Dim LRow As Long, n As Long
  4. Dim sBZ As String
  5. LRow = Cells(Rows.Count, "M").End(xlUp).Row
  6. Application.ScreenUpdating = False
  7. Range(Cells(FRow, "Q"), Cells(LRow, "Q")).ClearContents
  8. i = FRow
  9. Do While i <= LRow
  10.     If Cells(i, "Q").MergeCells Then n = Cells(i, "Q").MergeArea.Count Else n = 1
  11.     For j = 4 To 12
  12.         If Len(Trim(Cells(i, j))) + Len(Trim(Cells(i + n - 1, j))) > 0 Then
  13.           If sBZ = "" Then
  14.               sBZ = Cells(FRow - 1, j).Value
  15.           Else
  16.               sBZ = sBZ & "&" & Cells(FRow - 1, j).Value
  17.           End If
  18.               Cells(i, "Q") = sBZ
  19.         End If
  20.     Next i  
  21.     sBZ = ""
  22.     i = i + n
  23. Loop
  24. Application.ScreenUpdating = True
  25. End Sub
复制代码
  1. Sub test2()   '如有超过2行合并的情况,请用以下代码. 对应附后文件: "合并单元格休假.xls"
  2. Const FRow as Byte = 3
  3. Dim LRow As Long, n As Long, i As Long, j As Long
  4. Dim sBZ As String
  5. LRow = Cells(Rows.Count, "M").End(xlUp).Row
  6. Application.ScreenUpdating = False
  7. Range(Cells(FRow, "Q"), Cells(LRow, "Q")).ClearContents
  8. i = FRow
  9. Do While i <= LRow
  10.     If Cells(i, "Q").MergeCells Then n = Cells(i, "Q").MergeArea.Count Else n = 1
  11.     For j = 4 To 12
  12.         If WorksheetFunction.CountA(Range(Cells(i, j), Cells(i + n - 1, j))) > 0 Then
  13.             If sBZ = "" Then
  14.                 sBZ = Cells(FRow - 1, j).Value
  15.             Else
  16.                 sBZ = sBZ & "&" & Cells(FRow - 1, j).Value
  17.             End If
  18.                 Cells(i, "Q") = sBZ
  19.         End If
  20.     Next j
  21.     sBZ = ""
  22.     i = i + n
  23. Loop
  24. Application.ScreenUpdating = True
  25. End Sub
复制代码

3.rar

11.71 KB, 下载次数: 2

合并单元格休假.rar

12.11 KB, 下载次数: 2

点评

未考虑2行以上合并单元格情况  发表于 2013-7-6 14:13
回复

使用道具 举报

发表于 2013-7-6 18:38 | 显示全部楼层    本楼为最佳答案   
  1. Sub test()
  2.     Dim I%, J%, K%, N%
  3.     Range("Q3:Q65536").ClearContents
  4.     For I = 3 To Range("M65536").End(3).Row
  5.         Set D = CreateObject("scripting.dictionary")
  6.         If Cells(I, "Q").MergeCells Then N = Cells(I, "Q").MergeArea.Count - 1 Else N = 0
  7.         For J = 0 To N
  8.             For K = 4 To 12
  9.                 If Trim(Cells(I + J, K)) <> "" Then D(Cells(2, K).Value) = ""
  10.             Next
  11.         Next
  12.         Cells(I, "Q") = Join(D.KEYS, "&")
  13.         I = I + N
  14.     Next
  15. End Sub
复制代码
TEST.rar (11.71 KB, 下载次数: 5)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 03:17 , Processed in 0.399114 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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