Excel精英培训网

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

[已解决]分解Vba

[复制链接]
发表于 2012-5-3 23:17 | 显示全部楼层 |阅读模式
帮忙看看,谢谢。
最佳答案
2012-5-4 09:31
  1. Sub KD()
  2.     Dim R As New RegExp, Ar, Arr, i&
  3.     Dim An(1 To 99) As Long, K&, At(), Cel As Range
  4.     Const CN As Double = 25.4
  5.     Set Cel = Range("A:a").Find("%")
  6.     Range("b2:d" & Rows.Count).ClearContents
  7.     If Not Cel Is Nothing Then
  8.         Ar = Range("A2:A" & Cel.Row - 1).Value
  9.         Arr = Range(Cel.Offset(1), Cel.End(4)).Value
  10.         ReDim At(1 To UBound(Ar), 1 To 3)
  11.         With R
  12.             .Global = True
  13.             .Pattern = ".*X.*Y.*"
  14.             For i = 1 To UBound(Arr)
  15.                 If Left(Arr(i, 1), 1) = "T" Then
  16.                     K = CByte(Mid(Arr(i, 1), 2))
  17.                 Else
  18.                     If .Test(Arr(i, 1)) Then
  19.                         An(K) = An(K) + 1
  20.                     End If
  21.                 End If
  22.             Next i
  23.             .Pattern = "(T(\d{2}))C(\.\d+)$"
  24.             For i = 1 To UBound(Ar)
  25.                 If .Test(Ar(i, 1)) Then
  26.                     Arr = Split(.Replace(Ar(i, 1), "$1 $3 $2"))
  27.                     At(i, 1) = Arr(0)
  28.                     At(i, 2) = Arr(1) * CN
  29.                     At(i, 3) = An(CByte(Arr(2)))
  30.                 End If
  31.             Next i
  32.         End With
  33.         [b2].Resize(UBound(At), 3) = At
  34.         Set R = Nothing
  35.         MsgBox "处理完毕,请验证。"
  36.     End If
  37. End Sub
复制代码
Book29.rar (18.57 KB, 下载次数: 7)

Book29.rar

9.43 KB, 下载次数: 17

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-5-4 00:04 | 显示全部楼层
下面這段代碼可以實現一部分功能……太晚了,想先睡了……或許可以幫到你一點點小忙!
  1. Sub Separate()
  2. For I = 2 To Range("A:A").Find("%").Row - 1
  3.     Range("B" & I) = Left(Range("A" & I), 3)
  4.     Range("C" & I) = ("0." & Right(Range("A" & I), 3)) * 25.4
  5. Next I
  6. M = 0
  7. R = 2
  8. For I = Range("A:A").Find("%").Row To Range("A65536").End(xlUp).Row
  9.     If Left(Range("A" & I), 1) = "X" Then
  10.         M = M + 1
  11.     ElseIf Left(Range("A" & I), 1) = "T" Then
  12.         Range("D" & R) = M
  13.         R = R + 1
  14.         M = 0
  15.     End If
  16. Next I
  17. End Sub

复制代码
回复

使用道具 举报

发表于 2012-5-4 08:06 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2012-5-4 08:23 | 显示全部楼层
play9091 发表于 2012-5-4 00:04
下面這段代碼可以實現一部分功能……太晚了,想先睡了……或許可以幫到你一點點小忙!

谢谢,有空时在帮忙,快好了,谢谢!!!
回复

使用道具 举报

 楼主| 发表于 2012-5-4 08:33 | 显示全部楼层
fangniuji 发表于 2012-5-4 08:23
谢谢,有空时在帮忙,快好了,谢谢!!!

就孔数
提取不出来,其他OK啦,谢谢!!!
回复

使用道具 举报

发表于 2012-5-4 09:08 | 显示全部楼层
按你的说明T16的孔数应该为1啊。
回复

使用道具 举报

发表于 2012-5-4 09:12 | 显示全部楼层
fangniuji 发表于 2012-5-4 08:33
提取不出来,其他OK啦,谢谢!!!

和楼上一样的同问

为啥T16是2个呢??
回复

使用道具 举报

 楼主| 发表于 2012-5-4 09:13 | 显示全部楼层
liuguansky 发表于 2012-5-4 09:08
按你的说明T16的孔数应该为1啊。

有M的,都不能当坐标提取,谢谢!!是的,谢谢!1
回复

使用道具 举报

发表于 2012-5-4 09:31 | 显示全部楼层    本楼为最佳答案   
  1. Sub KD()
  2.     Dim R As New RegExp, Ar, Arr, i&
  3.     Dim An(1 To 99) As Long, K&, At(), Cel As Range
  4.     Const CN As Double = 25.4
  5.     Set Cel = Range("A:a").Find("%")
  6.     Range("b2:d" & Rows.Count).ClearContents
  7.     If Not Cel Is Nothing Then
  8.         Ar = Range("A2:A" & Cel.Row - 1).Value
  9.         Arr = Range(Cel.Offset(1), Cel.End(4)).Value
  10.         ReDim At(1 To UBound(Ar), 1 To 3)
  11.         With R
  12.             .Global = True
  13.             .Pattern = ".*X.*Y.*"
  14.             For i = 1 To UBound(Arr)
  15.                 If Left(Arr(i, 1), 1) = "T" Then
  16.                     K = CByte(Mid(Arr(i, 1), 2))
  17.                 Else
  18.                     If .Test(Arr(i, 1)) Then
  19.                         An(K) = An(K) + 1
  20.                     End If
  21.                 End If
  22.             Next i
  23.             .Pattern = "(T(\d{2}))C(\.\d+)$"
  24.             For i = 1 To UBound(Ar)
  25.                 If .Test(Ar(i, 1)) Then
  26.                     Arr = Split(.Replace(Ar(i, 1), "$1 $3 $2"))
  27.                     At(i, 1) = Arr(0)
  28.                     At(i, 2) = Arr(1) * CN
  29.                     At(i, 3) = An(CByte(Arr(2)))
  30.                 End If
  31.             Next i
  32.         End With
  33.         [b2].Resize(UBound(At), 3) = At
  34.         Set R = Nothing
  35.         MsgBox "处理完毕,请验证。"
  36.     End If
  37. End Sub
复制代码
Book29.rar (18.57 KB, 下载次数: 7)
回复

使用道具 举报

 楼主| 发表于 2012-5-4 09:35 | 显示全部楼层
liuguansky 发表于 2012-5-4 09:31
是附件这样的效果吗?

谢谢谢谢!!!!!!!!!!!!!大家热心帮忙!!!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 01:35 , Processed in 0.551572 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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