VBA,dynamic地“左”不同的string

无法缩短列中的string,但使其成为目录的dynamic。 例如:一列中有三个string,一个string可以连续10行,另一个string为20行,另一个string为15行。 每个需要被缩短一个不同的数额

具体来说:我有几个单词是由 ​​- ,_,+分隔的。 因此,例如一个工作表有pv01_52352,pv + 50,pv-100,irvega_242422,所以irvega这个词就起作用了。 但对于我正在努力的电视。 所需的结果是在特殊字符之前的作品,所以它将是pv01,pv和irvega作为期望的结果。

我怎样才能用左手或反正来缩短这一切? 这对我来说很难,因为一个string生病需要前4个字符,然后再缩短5个字符,并且需要在整个工作簿中完成。

任何input将不胜感激,谢谢。

我发现使用CODE函数 (使用UPPER函数来降低可能性)确定ASCII字符编号可以产生令人满意的结果。

截断第一个非字母字符

B2中的严格字母字符的数组公式是,

=LEFT(A2, MIN(ROW(INDIRECT("1:"&LEN(A2)))+((CODE(MID(UPPER(A2), ROW(INDIRECT("1:"&LEN(A2))), 1))>64)*(CODE(MID(UPPER(A2), ROW(INDIRECT("1:"&LEN(A2))), 1))<91))*1E+99)-1) 

B2中的字母数字字符的数组公式是,

 =LEFT(A2, MIN(ROW(INDIRECT("1:"&LEN(A2)))+(((CODE(MID(UPPER(A2), ROW(INDIRECT("1:"&LEN(A2))), 1))>64)*(CODE(MID(UPPER(A2), ROW(INDIRECT("1:"&LEN(A2))), 1))<91))+((CODE(MID(A2, ROW(INDIRECT("1:"&LEN(A2))), 1))>47)*(CODE(MID(A2, ROW(INDIRECT("1:"&LEN(A2))), 1))<58)))*1E+99)-1) 

数组公式需要用Ctrl + Shift + Enter 来完成。

用于严格字母字符的VBA用户定义函数(又名UDF)

 Function just_the_alpha(str As String) Dim tmp As String, c As Long For c = 1 To Len(str) If Asc(Mid(UCase(str), c)) > 64 And _ Asc(Mid(UCase(str), c)) < 91 Then tmp = tmp & Mid(str, c, 1) Else Exit For End If Next c just_the_alpha = tmp End Function 

用于字母数字字符的VBA UDF将是,

 Function just_the_alphanum(str As String) Dim tmp As String, c As Long For c = 1 To Len(str) If (Asc(Mid(UCase(str), c)) > 64 And _ Asc(Mid(UCase(str), c)) < 91) Or _ (Asc(Mid(str, c)) > 47 And _ Asc(Mid(str, c)) < 58) Then tmp = tmp & Mid(str, c, 1) Else Exit For End If Next c just_the_alphanum = tmp End Function