Excel文本索引自定义函数
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!"。
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 If
End Function



4、以上操作动态过程如下:

1、通过实例填写公式如下:
=TEXTSY(A2,B2)
=TEXTSY(A3,B3)
=TEXTSY(A4,B4)
=TEXTSY(A5,B5)
=TEXTSY(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、如果觉得这篇经验帮到了您,请点击下方的 “投票点赞" 或者“收藏”支持我!还有疑问的话可以点击下方的 “我有疑问”,谢谢啦!