找回密码
 立即注册
搜索
123
返回列表 发新帖
楼主: 王月佳

提取单元格内容,请大神帮助!!感激,在线等!

26
回复
596
查看
[复制链接]

0

主题

9

帖子

-1

幻币

初入江湖

Rank: 1

积分
7
2022-1-18 19:56:05 显示全部楼层
ctrl+e 3行时间有点出入 不过大多数都ok
PPT学习论坛
回复 支持 反对

使用道具 举报

0

主题

8

帖子

-1

幻币

初入江湖

Rank: 1

积分
6
2022-1-20 02:55:34 显示全部楼层
Power Query解法
提取单元格内容.zip (15.85 KB, 下载次数: 110)
PPT学习论坛
回复 支持 反对

使用道具 举报

2

主题

10

帖子

3

幻币

初入江湖

Rank: 1

积分
16
2022-1-26 20:23:23 显示全部楼层
不是针对你附件里的黄色部分的么?=TRIM(MID(SUBSTITUTE(REPLACE(REPLACE(REPLACE($A3,5,0,""),FIND("20",$A3)+2,0,""),LEN(REPLACE(REPLACE($A3,5,0,""),FIND("20",$A3)+3,0,"")),0,""),"",REPT("",99)),COLUMN(a1)*200-199,200))
PPT学习论坛
回复 支持 反对

使用道具 举报

0

主题

5

帖子

-1

幻币

初入江湖

Rank: 1

积分
0
2022-1-27 13:55:47 显示全部楼层
试一下下面代码,运行“提取内容”代码即可:
Public Function GFNC(ByVal s As String) As Integer
'定义在字符串中找到第一个数字字符位置的函数GFNC(GetPositionOfFirstNumericCharacter),网上有
  For i = 1 To Len(s)
  Dim currentCharacter As String
  currentCharacter = Mid(s, i, 1)
  If IsNumeric(currentCharacter) = True Then
    GFNC = i
    Exit Function
  End If
  Next i
End Function
Sub 提取内容()
Dim i As Integer
For i = 1 To 5
Range("c" & i) = Left(Range("a" & i), GFNC(Range("a" & i)) - 1)
Range("d" & i) = Right(Split(Range("a" & i), "202")(0), VBA.Len(Split(Range("a" & i), "202")(0)) - GFNC(Range("a" & i)) + 1)
Range("f" & i) = Right(Range("a" & i), 1)
Range("e" & i) = Split(Replace(Left(Range("a" & i), VBA.Len(Range("a" & i)) - 1), "202", "*202"), "*")(1)
Next
End Sub
说明、解释:
数据虽少,但比较复杂。
目标是取"企业名称"、"内容"、“日期"、"责任人"。
找目标规律:
"企业名称"在字符串最左,后面是数字
"内容"是第1个数字与202之间字符串
“日期"日期开头都有202字符串并为右第二位起
"责任人"都是最后1位
找到规律,逐行给B、C、D、E单元格赋值了。
完成任务,仅用函数解决不了,要写代码。
还要定义在字符串中找到第一个数字字符位置的函数GFNC(GetPositionOfFirstNumericCharacter)。
如果数据增加,修改“For i = 1 To 5”中的5即,有多少行,填写多少。
几个代码的含义:
Range("a11") = Character(Range("a1")) '第一个数字位数
Range("a8") = VBA.Len(Range("a1")) '第一行总数
Range("a10") = Left(Range("a1"), VBA.Len(Range("a1")) - 1) '取除最后一位
Range("a12") = VBA.Len(Range("a1"), "202", "*202")
Range("b14") = Replace(Range("a1"), "202", "*202") '用*将202后面数字隔开,直接取后面数字
Range("a16") = Split(Range("a1"), "202")(0) '取202前各位
'从2020或2021数字前取字符串,取“2020或2021数字前符串”减去第位数字加上1的字符串
Range("a18") = Right(Split(Range("a1"), "202")(0), VBA.Len(Split(Range("a1"), "202")(0)) - GFNC(Range("a1")) + 1)
提取单元格内容-含代码.rar (18.61 KB, 下载次数: 51)
PPT学习论坛
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

幻币

初入江湖

Rank: 1

积分
11
2022-1-31 08:04:46 显示全部楼层
sorry,“Range("a11") = Character(Range("a1")) '第一个数字密码”为:
Range("a11") = GFNC(Range("a1")) '第一个数字字符位置数
PPT学习论坛
回复 支持 反对

使用道具 举报

1

主题

6

帖子

1

幻币

初入江湖

Rank: 1

积分
8
2022-2-6 22:13:39 显示全部楼层
学习了一下正则表达式,根据需要提取的字符特点,定义4个函数,然后分别提取,比较清晰。前一个太复杂了,容易看乱:
Function shz(str As String)
'自定义提取首段汉字字符函数
With CreateObject("vbscript.RegExp")
  .Global = ture
  .IgnoreCase = False
  .MultiLine = True
  .Pattern = "^[\u4e00-\u9fa5]+" '以汉字开关的所有字符
  
  If .test(str) Then
  shz = .Execute(str)(0) '要匹配的目标(0)为匹配一次
  Else
  shz = "" '没有就返回空,防止出错
  End If
End With

End Function
Function rq(str As String)
'自定义提取首段汉字后至日期前字符函数
With CreateObject("vbscript.RegExp")
  .Global = ture
  .IgnoreCase = False
  .MultiLine = True
  .Pattern = "[0-9]{1,2}[A-Z].+[\u4e00-\u9fa5]{2,3}"
  
  If .test(str) Then
  rq = .Execute(str)(0) '要匹配的目标(0)为匹配一次
  Else
  rq = "" '没有就返回空,防止出错
  End If
End With

End Function
Function zjzf(str As String)
'自定义提取日期(带.)字符函数
With CreateObject("vbscript.RegExp")
  .Global = ture
  .IgnoreCase = False
  .MultiLine = True
  .Pattern = "[0-9]{4}\.[0-9]{1,2}\.[0-9]{1,2}" '用d\不行
  
  If .test(str) Then
  zjzf = .Execute(str)(0) '要匹配的目标(0)为匹配一次
  Else
  zjzf = "" '没有就返回空,防止出错
  End If
End With

End Function
Function hhz(str As String)
'自定义提取首段汉字后至日期前字符函数
With CreateObject("vbscript.RegExp")
  .Global = ture
  .IgnoreCase = False
  .MultiLine = True
  .Pattern = ".$" '所有字符的最后一位,这里与"[\u4e00-\u9fa5]$"同效
  
  If .test(str) Then
  hhz = .Execute(str)(0) '要匹配的目标(0)为匹配一次
  Else
  hhz = "" '没有就返回空,防止出错
  End If
End With

End Function
Sub 提取4段内容()
'根据四段字符特点,定义4个函数,利用正则表达式一次性提取,比较清晰
Dim i As Integer
Range("b1:d6").ClearContents
For i = 1 To 5
Range("b" & i) = shz(Range("a" & i))
Range("c" & i) = rq(Range("a" & i))
Range("d" & i) = zjzf(Range("a" & i))
Range("e" & i) = hhz(Range("a" & i))
Next
End Sub
PPT学习论坛
回复 支持 反对

使用道具 举报

1

主题

9

帖子

1

幻币

初入江湖

Rank: 1

积分
11
2022-2-8 04:01:05 显示全部楼层
附上代码:
两种方式提取单元格内容.rar (23.61 KB, 下载次数: 118)
PPT学习论坛
回复 支持 反对

使用道具 举报

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