仅从stringVBA中导出文本

我有string,我只想从string中导出文本(string中的分隔符是“_”)。 例如:

string:Prijem_LPLC_MO-234_333333

摘录:Prijem_LPLC

我的代码:

Public Function komentar(text_string As String) As String Dim text() As String Dim pom As String text() = Split(text_string, "_") komentar = "" For i = LBound(text) To UBound(text) - 1 If Application.IsText(text(i)) Then komentar = komentar & "_" & text(i) End If Next i End Function 

但是它在开始时用“_”复制完整的string。

你的代码有点奇怪。 如果我们通过它,

起初,你正在拆分string

text() = Split(text_string, "_")

因此,在数组文本中,对于stringPrijem_LPLC_MO-234_333333 ,您将拥有:

  • Prijem
  • LPLC
  • MO-234
  • 333333

然后,对于数组中的每个对象,testing对象是否为文本:

Application.IsText(text(i))

数组中的每个对象都是这种情况。

最后,你用这种结构连接Komentar:

_ + 你正在testing的对象

在你的情况下,它会是这样的:

第一次迭代:komentar = _Prijem

第二次迭代:komentar = _Prijem _LPLC

第三次迭代:komentar = _Prijem_LPLC _MO-234

第四次迭代:komentar = _Prijem_LPLC_MO-234 _333333

事实上,如果你只想要这个string中的文本,而没有“_”元素,问题来自这一行:

komentar = komentar & "_" & text(i)

你不仅要添加文本,而且还要添加“_”

为了使你的代码工作,你只需要改变这个部分。 考虑试试这个:

 komentar = komentar & text(i) 

Post Scriptum:另外,在这里只是一个build议,我认为使用LBound(文本)可能太多了,而你可以使用0 ,因为你想要通过所有的数组。

For i = 0 To UBound(text) - 1

而不是komentar = "" add komentar = text(0) 。 你的代码复制第一个符号,因为在这一行中, komentar = komentar & "_" & text(i)第一次komentar是空的。 所以代码返回“_Prijem”。

你近了。

为了消除任何带有数字的string,您需要检查每个字符。 用你把结果string放在一起的方法,一开始总会有一个下划线。 (另一种方法最后会有一个下划线)。 所以完成后,只需删除第一个字符。

 Option Explicit Public Function komentar(text_string As String) As String Dim text() As String Dim pom As String Dim i As Long, j As Long text() = Split(text_string, "_") komentar = "" For i = LBound(text) To UBound(text) 'Check each character For j = 1 To Len(text(i)) If Mid(text(i), j, 1) Like "#" Then Exit For Next j 'j will pass this test if no characters are digits If j > Len(text(i)) Then komentar = komentar & "_" & text(i) End If Next i 'Strip off the first "_" komentar = Mid(komentar, 2) End Function 

你也可以用VBA中的正则expression式来做到这一点,但这是一个非常不同的解决scheme。