Excel精英培训网

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

[已解决][VBA求助]批量查找整理数据的格式

[复制链接]
发表于 2012-3-29 13:33 | 显示全部楼层 |阅读模式
本帖最后由 yvhanym 于 2012-3-29 13:52 编辑

详细问题和说明请下载附件查看。谢谢!

vba求助.rar (9.31 KB, 下载次数: 14)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-3-29 13:46 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2012-3-29 13:54 | 显示全部楼层
本帖最后由 yvhanym 于 2012-3-29 13:55 编辑
youxinggy 发表于 2012-3-29 13:46
太复杂了,不好弄

那就难怪我整理不出来了,你都说复杂了,说明这个问题真的就算是个问题。
看来不只是我觉得难啊,求高手出马助小弟一臂之力~~~
回复

使用道具 举报

发表于 2012-3-29 15:06 | 显示全部楼层
要是一天有二条以上记录怎么处理呀?
回复

使用道具 举报

 楼主| 发表于 2012-3-29 15:10 | 显示全部楼层
hrpotter 发表于 2012-3-29 15:06
要是一天有二条以上记录怎么处理呀?

时间1/时间2    地点1/地点2
回复

使用道具 举报

发表于 2012-3-29 15:25 | 显示全部楼层    本楼为最佳答案   

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Target.Address = "$A$1" Then
  3.         Dim S$, Arr, i&, Ar() As String, j&
  4.         S = Target.Value
  5.         Arr = Sheet2.Range("A1").CurrentRegion.Value
  6.         ReDim Ar(1 To UBound(Arr, 2) - 4, 1 To 5)
  7.         For i = 1 To UBound(Ar)
  8.             Ar(i, 1) = Arr(1, i + 4)
  9.             Ar(i, 2) = Application.Text(Ar(i, 1), "aaaaa")
  10.             For j = 2 To UBound(Arr)
  11.                 If Arr(j, i + 4) = S Then
  12.                     If Len(Ar(i, 3)) Then
  13.                         Ar(i, 3) = Ar(i, 3) & vbCrLf & _
  14.                             Application.Text(Arr(j, 2), "h:m") & "-" & _
  15.                             Application.Text(Arr(j, 3), "h:m")
  16.                         Ar(i, 4) = Ar(i, 4) & vbCrLf & Arr(j, 4)
  17.                         Ar(i, 5) = Ar(i, 5) & vbCrLf & Arr(j, 1)
  18.                     Else
  19.                         Ar(i, 3) = Application.Text(Arr(j, 2), "h:m") & "-" & _
  20.                             Application.Text(Arr(j, 3), "h:m")
  21.                         Ar(i, 4) = Arr(j, 4)
  22.                         Ar(i, 5) = Arr(j, 1)
  23.                     End If
  24.                 End If
  25.             Next j
  26.             If Len(Ar(i, 3)) = 0 Then Ar(i, 3) = "休息"
  27.         Next i
  28.         Application.ScreenUpdating = False
  29.         Application.DisplayAlerts = False
  30.         Range("a3:e" & Rows.Count).Clear
  31.         With Range("a3").Resize(UBound(Ar), 5)
  32.             .Value = Ar
  33.             .Borders.LineStyle = 1
  34.         End With
  35.         Application.DisplayAlerts = True
  36.         Application.ScreenUpdating = True
  37.     End If
  38. End Sub
复制代码
vba求助.rar (14.49 KB, 下载次数: 24)
回复

使用道具 举报

发表于 2012-3-29 15:35 | 显示全部楼层
本帖最后由 hrpotter 于 2012-3-29 15:59 编辑
yvhanym 发表于 2012-3-29 15:10
时间1/时间2    地点1/地点2
  1. Sub test()
  2.     Dim ar, br(), cr(), st
  3.     Dim i As Integer, j As Integer, k As Integer
  4.     ar = Sheet2.Range("a1").CurrentRegion
  5.     With Sheet1
  6.         .Range("a3:e65536").ClearContents
  7.         st = .Range("a1").Value
  8.         ReDim br(1 To 1000, 1 To 5)
  9.         ReDim cr(1 To UBound(ar, 2) - 4, 1 To 5)
  10.         For i = 5 To UBound(ar, 2)
  11.             cr(i - 4, 1) = ar(1, i)
  12.             For j = 2 To UBound(ar)
  13.                 If ar(j, i) = st Then
  14.                     k = k + 1
  15.                     br(k, 1) = ar(1, i)
  16.                     br(k, 3) = Format(ar(j, 2), "h:mm") & "-" & Format(ar(j, 3), "h:mm")
  17.                     br(k, 4) = ar(j, 4)
  18.                     br(k, 5) = ar(j, 1)
  19.                 End If
  20.             Next
  21.         Next
  22.         For i = 1 To UBound(cr)
  23.             cr(i, 2) = Right(Format(cr(i, 1), "aaaa"), 1)
  24.             For j = 1 To k
  25.                 If br(j, 1) = cr(i, 1) Then
  26.                     cr(i, 3) = cr(i, 3) & "/" & br(j, 3)
  27.                     cr(i, 4) = cr(i, 4) & "/" & br(j, 4)
  28.                     cr(i, 5) = cr(i, 5) + br(j, 5)
  29.                 End If
  30.             Next
  31.         Next
  32.         For i = 1 To UBound(cr)
  33.             If cr(i, 3) = "" Then
  34.                 cr(i, 3) = "休息"
  35.             Else
  36.                 cr(i, 3) = Right(cr(i, 3), Len(cr(i, 3)) - 1)
  37.                 cr(i, 4) = Right(cr(i, 4), Len(cr(i, 4)) - 1)
  38.             End If
  39.         Next
  40.         .Range("a3").Resize(UBound(cr), 5) = cr
  41.     End With
  42. End Sub
复制代码


回复

使用道具 举报

 楼主| 发表于 2012-3-29 15:38 | 显示全部楼层
hrpotter 发表于 2012-3-29 15:35

可否麻烦修改下:
1、如果一天有两个时间段,格式为(时间段1/时间段2)
2、如果一天有两个地点,格式为(地点1/地点2)
3、一天如果有两个时长,可否求和

谢谢!

点评

如果要求和的话:第17行改成: Ar(i, 5) = Ar(i, 5)+Arr(j, 1)  发表于 2012-3-29 15:42
回复

使用道具 举报

 楼主| 发表于 2012-3-29 15:39 | 显示全部楼层
hrpotter 发表于 2012-3-29 15:35

完全满足。谢谢!!!强烈感谢!!!!
回复

使用道具 举报

发表于 2012-3-29 15:44 | 显示全部楼层
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Then Exit Sub
  3. If Target.Address <> "$A$1" Then Exit Sub
  4. If Target = "" Then Exit Sub
  5. Dim aa, r1, ad$, rq, sj$, sc, dd, n&
  6. [c3:e32].ClearContents
  7. aa = Target.Value
  8. With Sheet2
  9.     Set r1 = .Cells.Find(aa, , , 1)
  10.     If Not r1 Is Nothing Then
  11.         ad = r1.Address
  12.         rq = .Cells(1, r1.Column): n = Day(rq) + 2
  13.         sj = Format(.Cells(r1.Row, 2), "hh:mm") & "-" & Format(.Cells(r1.Row, 3), "hh:mm")
  14.         sc = .Cells(r1.Row, 1)
  15.         dd = .Cells(r1.Row, 4)
  16.         Cells(n, 3) = sj
  17.         Cells(n, 4) = dd
  18.         Cells(n, 5) = sc
  19.         Do
  20.             Set r1 = .Cells.FindNext(r1)
  21.             If Not r1 Is Nothing Then
  22.                 If r1.Address <> ad Then
  23.                     rq = .Cells(1, r1.Column): n = Day(rq) + 2
  24.                     sj = Format(.Cells(r1.Row, 2), "hh:mm") & "-" & Format(.Cells(r1.Row, 3), "hh:mm")
  25.                     sc = .Cells(r1.Row, 1)
  26.                     dd = .Cells(r1.Row, 4)
  27.                     Cells(n, 3) = sj
  28.                     Cells(n, 4) = dd
  29.                     Cells(n, 5) = sc
  30.                 End If
  31.             End If
  32.         Loop While Not r1 Is Nothing And r1.Address <> ad
  33.     End If
  34. End With
  35. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 10:20 , Processed in 0.491723 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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