ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: AFree123

[求助] 提取文号中的年份

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-24 19:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
duquancai 发表于 2018-7-24 18:47
写个VBA函数,你看可以不???

谢谢老师!高手啊!好好用!

就是数据很多,要是能弄一个一键提取那就更方便了。

麻烦老师有空再看看,谢谢!

TA的精华主题

TA的得分主题

发表于 2018-7-24 19:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
AFree123 发表于 2018-7-24 17:18
谢谢老师的帮助!
在实际工作中使用,会提示:下标越界
可能是由于数据不规范

Option Explicit

Sub test()
  Dim arr, i, j, mark
  On Error GoTo errmsg
  mark = Split("【,】,(,),(,),〔,〕", ",") '要成对,中间加逗号(根据错误行提示进行添加)
  arr = Range("e3:e" & Cells(Rows.Count, "e").End(xlUp).Row)
  ReDim brr(1 To UBound(arr, 1), 1 To 1)
  For i = 1 To UBound(arr, 1)
    If InStr(arr(i, 1), "藏") Then
      For j = 0 To UBound(mark)
        arr(i, 1) = Replace(arr(i, 1), mark(j), IIf(j Mod 2 = 0, "[", "]"))
      Next
      brr(i, 1) = Split(Split(arr(i, 1), "[")(1), "]")(0)
    End If
  Next
  [g3].Resize(UBound(brr, 1)) = brr
Exit Sub
errmsg:
  MsgBox "检查行:" & i + 2
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-24 19:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

谢谢老师的帮助!
真的,很好用!增加提示与说明,方便了使用者据实修正VBA,具有扩展性!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-24 19:43 | 显示全部楼层

很抱歉,今天的鲜花用完了,明天补上!

TA的精华主题

TA的得分主题

发表于 2018-7-24 20:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
用得着这么麻烦吗,直接从F列取不就行了?
Sub text()
Dim i&
For i = 3 To 20
    If Left(Cells(i, "e"), 1) = "藏" Then
        Cells(i, "g") = Year(Cells(i, "f"))
    End If
Next i
End Sub

TA的精华主题

TA的得分主题

发表于 2018-7-24 21:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习老师们的代码。谢谢!
Function 提取年份(x)
    On Error Resume Next
    With CreateObject("vbscript.regexp")
        .Pattern = "^藏.*?(\d{4})"
        提取年份 = Right(.Execute(x)(0), 4): If 提取年份 = 0 Then 提取年份 = ""
    End With
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-25 07:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
小花鹿 发表于 2018-7-24 20:35
用得着这么麻烦吗,直接从F列取不就行了?
Sub text()
Dim i&

谢谢老师的关注
主要是我没说清楚,F列原有其他数据,现有的数据是我模拟的结果

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-25 07:19 | 显示全部楼层
YZC51 发表于 2018-7-24 21:02
学习老师们的代码。谢谢!
Function 提取年份(x)
    On Error Resume Next

谢谢老师!
昨天送完的鲜花
今晚捧上鲜花

TA的精华主题

TA的得分主题

发表于 2018-7-25 09:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 提取年份()
Dim Regx, Rn, Mat, M As Object
Dim Rng As Range
Dim I As Integer
Set Regx = CreateObject("vbscript.regexp")
Set Rng = Range("E3:E" & Cells(Rows.Count, "E").End(xlUp).Row)
With Regx
   For Each Rn In Rng
     .Global = True
     .Pattern = "(藏注会协?).([0-9]{4})."
        Set Mat = .Execute(Rn.Value)
          If .Test(Rn) Then
            Cells(I + 3, 7) = Mat(0).submatches(1)
          Else
            Cells(I + 3, 7) = ""
          End If
        I = I + 1
   Next Rn
End With
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-25 20:06 | 显示全部楼层
jy03342543 发表于 2018-7-25 09:13
Sub 提取年份()
Dim Regx, Rn, Mat, M As Object
Dim Rng As Range

谢谢老师的帮助
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-11 00:48 , Processed in 0.023441 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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