修法布施得聪明智慧,多分享让生活更美好。上次分享《Excel如何从一段文字中自动提取相关信息》,用大量函数处理,有些复杂。处理从文本中分离合并需要的字串文本,Excel内置文本函数有:CONCATENATE 将若干文本项合并到一个文本项中LEFT 返回文本值中最左边的字符RIGHT 返回文本值中最右边的字符MID 从文本字符串中的指定位置起返回特定个数的字符为了方便处理文本,将上面内置几个函数功能用一个自定义函数TEXTSY来处理文本操作,下面分享处理方法。
工具/原料
Microsoft Office Excel 2007
Excel VBA
一、函数TEXTSY
1、功能:能从左到右或从右到左通过索引号文本每个字串,合并单元格区域文本,通过索引号范围截取一段文本。
2、语法:TEXTSY(text巳呀屋饔,num_chars)Text 是包含要提取的字符的文本字符串(字串、或一个单元格地址或单元格区域的文本)。Num_chars 指定要由 TEXTSY 提取的栓疠瑕愤字符的数量或特定数量范围(中间用“:”分隔)。Num_chars 必须不等0的正负数,并且不大于Text总字符串数。Num_chars带有小数时,向最小最整数,如5.5取5,-5.5取-6。正数为从左至右第Num_char个字符值。负数为从右至左第Num_char绝对值个字符值。Num_chars范围值表示为N1:N2,N1和N2必须满足上面单个条件处理并且有以下规定:“N1:N2“ N1和N2全为正数,N2>=N1,例“5:10”TEXTSY返回从左到右第5至10个文本字符串,如果“10:5”,则TEXTSY返回"#VALUE!";N1和N2全为负数,N1>=N2,例“-5:-10”TEXTSY返回从右到左第10至5个文本字符串,如果“-10:-5”,则TEXTSY返回"#VALUE!";N1为正数和N2为负数,例“5:-10”TEXTSY返回从左到右第5个与从右到左第10个文本字符这间的文本字符串。“N1:”N1为正数,例“5:”TEXTSY返回从左到右第5个至最后个文本字符串;N1为负数,例“-5:”TEXTSY返回从右到左第5个至最后个文本字符串。相当RIGHT。“:N2“N1为正数,例“5:”TEXTSY返回从左至右第1个至第5个文本字符串;N1为负数,例“-5:”TEXTSY返回从第一个字串至从右到左第5个之间文本字符串。相当LEFT。“:”TEXTSY返回全部文本。比CONCATENATE好用。如果 num_chars 大于文本长度或0或文本字串,则 TEXTSY返回"#VALUE!"。
二、函数TEXTSY编制
1、首先打开Microsoft Office Excel 2007,新建文档并保存文件名《Excel文本索引自定义函数.xlsm》(演示文件,下面代码复制到能运行宏的工作簿都可以)如图。
2、然后按下快捷键ALT+F11打开VBA(宏)编辑界面,然后点菜单栏【插入】下拉中列表中点【模块(M)】如图。
3、然后插入了一个模块1,在代码框中复制如下代码:Function TEXTSY(mm, n) As String '2020-7-14 22:15:20 Dim mr As Range, m As String Dim mb, mc On Error Resume Next Set mc = Range(mm) For Each mr In mm If mr.Text <> "" Then m = m & mr.Text End If Next mr If Err.Number <> 0 Then m = mm End If Err.Clear If IsNumeric(n) Then If Abs(Int(n)) > Len(m) Then TEXTSY = "#VALUE!" Else If Int(n) > 0 Then TEXTSY = Mid(m, Int(n), 1) ElseIf Int(n) = 0 Then TEXTSY = "#VALUE!" Else TEXTSY = Mid(Right(m, Abs(Int(n))), 1, 1) End If End If Else If CStr(n) = ":" Then TEXTSY = m ElseIf Left(CStr(n), 1) = ":" Then mb = Split(CStr(n), ":") If IsNumeric(mb(1)) Then If Abs(Int(mb(1))) > Len(m) Then TEXTSY = "#VALUE!" Else If Int(mb(1)) > 0 Then TEXTSY = Mid(m, 1, Int(mb(1))) ElseIf Int(mb(1)) = 0 Then TEXTSY = "#VALUE!" Else TEXTSY = Mid(m, 1, Len(m) + Int(mb(1)) + 1) End If End If Else TEXTSY = "#VALUE!" End If ElseIf Right(CStr(n), 1) = ":" Then mb = Split(CStr(n), ":") If IsNumeric(mb(0)) Then If Abs(Int(mb(0))) > Len(m) Then TEXTSY = "#VALUE!" Else If Int(mb(0)) > 0 Then TEXTSY = Right(m, Len(m) - Int(mb(0)) + 1) ElseIf Int(mb(0)) = 0 Then TEXTSY = "#VALUE!" Else TEXTSY = Right(m, Int(Abs(mb(0)))) End If End If Else TEXTSY = "#VALUE!" End If Else mb = Split(CStr(n), ":") If IsNumeric(mb(0)) And IsNumeric(mb(1)) Then If Int(mb(0)) <= Int(mb(1)) And Int(mb(0)) > 0 And Int(mb(1)) <= Len(m) Then TEXTSY = Mid(m, Int(mb(0)), Int(mb(1)) - Int(mb(0)) + 1) ElseIf Int(mb(1)) < 0 And Int(mb(0)) > 0 And Abs(Int(mb(1))) <= Len(m) And Int(mb(0)) <= Len(m) Then If Len(m) + Int(mb(1)) + 1 >= Int(mb(0)) Then TEXTSY = Mid(m, Int(mb(0)), Len(m) + Int(mb(1)) - Int(mb(0)) + 2) Else TEXTSY = Mid(m, Len(m) + Int(mb(1)) + 1, Int(mb(0)) - (Len(m) + Int(mb(1)) + 1) + 1) End If ElseIf Int(mb(0)) >= Int(mb(1)) And Int(mb(0)) < 0 And Abs(Int(mb(1))) <= Len(m) Then TEXTSY = Mid(m, Len(m) + Int(mb(1)) + 1, Abs(Int(mb(1))) - Abs(Int(mb(0))) + 1) Else TEXTSY = "#VALUE!" End If Else TEXTSY = "#VALUE!" End If If Err.Number <> 0 Then TEXTSY = "#VALUE!" End If Err.Clear End If End IfEnd Function
4、以上操作动态过程如下:
三、函数TEXTSY使用
1、通过实例填写公式如下:=TEXTSY(A2,B2)=T苇质缵爨EXTSY(A3,B3)=TEXTSY(A4,B4)=TEXTSY(A5,B5)=TE淌捌釜集XTSY(A6,B6)=TEXTSY(A7,B7)=TEXTSY(A8,B8)=TEXTSY(A9,B9)=TEXTSY(A10,B10)=TEXTSY(A11,B11)=TEXTSY(A12,B12)=TEXTSY(B2:B12,":")=TEXTSY("123456789abcd",5)=TEXTSY("123456789abcd",-5)=TEXTSY("123456789abcd",14)=TEXTSY("123456789abcd",-14)=TEXTSY("123456789abcd","5:10")=TEXTSY("123456789abcd","10:5")=TEXTSY("123456789abcd","-5:-10")=TEXTSY("123456789abcd","-10:5")=TEXTSY("123456789abcd",":")=TEXTSY("123456790abcd","")=TEXTSY("123456791abcd","agd")
2、如果觉得这篇经验帮到了您,请点击下方的 “投票点赞" 或者“收藏”支持我!还有疑问的话可以点击下方的 “我有疑问”,谢谢啦!