Excel精英培训网

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

[已解决]正则内类不匹配

[复制链接]
发表于 2014-10-10 21:32 | 显示全部楼层 |阅读模式
如下代码
Function ddt(RNG As Range)
Set regx = CreateObject("vbscript.regexp")
With regx
    .Global = True
    .Pattern = "(?<=/)\d+"
   Set mat = .Execute(RNG) 显示内类不匹配
End With
bb = VBA.Day(Date)
M = VBA.Month(Date)
Y = VBA.Year(Date)
For Each aa In mat
If aa * 1 - bb <= -10 Then
ddt = VBA.DateSerial(Y, M + 1, aa)
ElseIf aa * 1 - bb >= 17 Then
ddt = VBA.DateSerial(Y, M - 1, aa)
Else
ddt = VBA.DateSerial(Y, M, aa)
End If
Next
End Function
例文
400/23/MP1
400/23
400/23
400/23
120/17
最佳答案
2014-10-11 23:00
本帖最后由 香川群子 于 2014-10-11 23:43 编辑
yedeen58 发表于 2014-10-11 17:17
.Pattern = "/(\d+)(?=/|$)"
这个表达示验证不行,你试可以吗?

根据你提供的数据,可以发现规律是需要提取/分开的第2组数值。

方法-1:
.Pattern = "\d+"

方法-2:
.Pattern = "\d+(?=/|$)"

然后、直接提取第2组。
Function f(txt$)
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "\d+"                '方法-1    直接判断数值
       ' .Pattern = "\d+(?=/|$)"    '方法-2   判断跟随/或结尾 的数值
        If .test(txt) Then f = .Execute(txt)(1) '提取第2组数值
    End With
End Function
 楼主| 发表于 2014-10-10 21:36 | 显示全部楼层
附件

新建 360压缩 ZIP 文件.zip

6.42 KB, 下载次数: 3

回复

使用道具 举报

 楼主| 发表于 2014-10-10 21:49 | 显示全部楼层
附件为这个

新建 360压缩 ZIP 文件 (2).zip

13.37 KB, 下载次数: 6

回复

使用道具 举报

发表于 2014-10-10 22:10 | 显示全部楼层
VBA似乎不支持反向预查  所以你的pattern会出错
要是都是这样的格式数据直接split就行,或者根据实际情况重新写pattern
回复

使用道具 举报

 楼主| 发表于 2014-10-10 22:23 | 显示全部楼层
ghostjiao 发表于 2014-10-10 22:10
VBA似乎不支持反向预查  所以你的pattern会出错
要是都是这样的格式数据直接split就行,或者根据实际情况重 ...

规则这个怎么写
回复

使用道具 举报

发表于 2014-10-10 22:27 | 显示全部楼层
yedeen58 发表于 2014-10-10 22:23
规则这个怎么写

你实际数据都有什么样的?要是这样直接split就行,你多列出点数据,说下要哪一部分?
回复

使用道具 举报

 楼主| 发表于 2014-10-10 22:52 | 显示全部楼层
ghostjiao 发表于 2014-10-10 22:27
你实际数据都有什么样的?要是这样直接split就行,你多列出点数据,说下要哪一部分?

400/23/mp1
400/23
400/2
400/
就以上这四种
回复

使用道具 举报

发表于 2014-10-11 08:20 | 显示全部楼层
yedeen58 发表于 2014-10-10 22:52
400/23/mp1
400/23
400/2
  1. Function ddt(Rng As Range)
  2.     Dim D%, Y%, M%, aa%
  3.     aa = Val(Split(Mid(Rng.Value, InStr(Rng.Value, "/") + 1, 99), "/")(0))
  4.     D = VBA.Day(Date)
  5.     M = VBA.Month(Date)
  6.     Y = VBA.Year(Date)
  7.     If aa - D <= -10 Then
  8.         ddt = VBA.DateSerial(Y, M + 1, aa)
  9.     ElseIf aa - D >= 17 Then
  10.         ddt = VBA.DateSerial(Y, M - 1, aa)
  11.     Else
  12.         ddt = VBA.DateSerial(Y, M, aa)
  13.     End If
  14. End Function
复制代码
你看看可以不

评分

参与人数 1 +1 收起 理由
yedeen58 + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 2014-10-11 09:54 | 显示全部楼层
  1. Set regx = CreateObject("vbscript.regexp")
  2. With regx
  3.     .Global = True
  4.     .Pattern = "/(\d+)(?=/|$)"
  5.     If .test(RNG.Value) Then
  6.         Set k = .Execute(RNG.Value)
  7.         aa = .Execute(RNG.Value)(0).submatches(0)
  8.     End If
  9. End With
复制代码
取得AA的效果你试试?
回复

使用道具 举报

发表于 2014-10-11 15:37 | 显示全部楼层
yedeen58 发表于 2014-10-10 22:52
400/23/mp1
400/23
400/2

这是原始数据,但是你要提取什么样的结果呢?完全没说!……要靠猜?!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 00:06 , Processed in 0.486082 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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