Excel精英培训网

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

[已解决]用VBA特殊的多行换一行

[复制链接]
发表于 2014-10-16 19:43 | 显示全部楼层 |阅读模式
本帖最后由 guogongyi 于 2014-10-21 18:20 编辑

        说明               
1.“姓名”栏有重复的,想把“现文化程度”栏至“所学专业”栏共5个栏内容向右复制,复制的顺序要求是原来的位置留“毕(肄)业时间”栏时间由最早的,把其他行按“毕(肄)业时间”栏时间从早到晚的顺序,粘贴到右边,并把除最早的这行留下,其他“姓名”重复项删除掉。就像“结果”标签的一样。谢谢!                        
                        
2.行数很多,请用VBA完成。谢谢!                        


最佳答案
2014-10-17 15:31
也不是很烦,就是两两比较的排序办法有点笨而已。

用VBA多行换一行.rar

9.23 KB, 下载次数: 10

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-10-16 19:56 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2014-10-16 20:06 | 显示全部楼层
su45 发表于 2014-10-16 19:56
好像有点繁

能不能给做一下,或先排序后复制也行,不删除已经复制的删除也行,关键是把后五个向右排列。
回复

使用道具 举报

 楼主| 发表于 2014-10-16 20:13 | 显示全部楼层
guogongyi 发表于 2014-10-16 20:06
能不能给做一下,或先排序后复制也行,不删除已经复制的删除也行,关键是把后五个向右排列。

我先排序了,这样能好做一些吗?

用VBA多行换一行1.rar

6.87 KB, 下载次数: 4

回复

使用道具 举报

 楼主| 发表于 2014-10-17 14:30 | 显示全部楼层
哪位大侠帮帮我,我谢谢你了
回复

使用道具 举报

发表于 2014-10-17 15:30 | 显示全部楼层
  1. Sub tt()
  2.     Dim sh As Worksheet
  3.     Set d = CreateObject("scripting.dictionary")           '记录重名
  4.     Set d1 = CreateObject("scripting.dictionary")            '记录姓名出现的次数
  5.     r = Sheet1.[a65536].End(3).Row
  6.     arr = Sheet1.Range("a1:o" & r)
  7.     Set sh = Sheets("结果")
  8.     For i = 1 To UBound(arr)
  9.         x = arr(i, 10)    '姓名
  10.         d1(x) = d1(x) + 1       '姓名出现的次数
  11.         If Not d.exists(x) Then
  12.             n = n + 1       '姓名在新表中的行位置
  13.             d(x) = n
  14.             sh.Cells(n, 1).Resize(1, 15) = Sheet1.Cells(i, 1).Resize(1, 15).Value       '第一次出现,复制1--15列
  15.         Else          '第二次以上出现
  16.             p = d(x)
  17.             c = 6 + 5 * d1(x)
  18.             sh.Cells(p, c).Resize(1, 5) = Sheet1.Cells(i, 11).Resize(1, 5).Value            '复制11-16列,到新表指定列
  19.             sh.Cells(1, c).Resize(1, 5) = Sheet1.Cells(1, 11).Resize(1, 5).Value            '新表头
  20.             For j1 = 11 To c - 5 Step 5             '判断毕业日期并排序
  21.                 arr1 = sh.Cells(p, j1).Resize(1, 5)
  22.                 For j2 = 16 To c Step 5
  23.                     arr2 = sh.Cells(p, j2).Resize(1, 5)
  24.                     If CDate(arr1(1, 3)) > CDate(arr2(1, 3)) Then       '前一日期大于后一日期,交换
  25.                         sh.Cells(p, j1).Resize(1, 5) = arr2
  26.                         sh.Cells(p, j2).Resize(1, 5) = arr1
  27.                     End If
  28.                 Next
  29.             Next
  30.         End If
  31.     Next
  32.     sh.Activate
  33. End Sub
复制代码
回复

使用道具 举报

发表于 2014-10-17 15:31 | 显示全部楼层    本楼为最佳答案   
也不是很烦,就是两两比较的排序办法有点笨而已。

用VBA多行换一行.rar

13.79 KB, 下载次数: 12

回复

使用道具 举报

 楼主| 发表于 2014-10-17 18:39 | 显示全部楼层
大侠帮帮忙
回复

使用道具 举报

 楼主| 发表于 2014-10-17 20:06 | 显示全部楼层
grf1973 发表于 2014-10-17 15:31
也不是很烦,就是两两比较的排序办法有点笨而已。

谢谢,转换的很好,但有的日期变成了数字,再请您看一下。

用VBA多行换一行.rar

15.5 KB, 下载次数: 3

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 22:46 , Processed in 0.363517 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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