如果多行Excel单元格中的某行中的字符串不是以某个字符串开头,请删除该行中的字符串

如果多行Excel单元格中的某行中的字符串不是以某个字符串开头,请删除该行中的字符串,excel,vba,excel-formula,line-breaks,string-matching,Excel,Vba,Excel Formula,Line Breaks,String Matching,我有一列Excel单元格采用这种格式(随机字符串的顺序不是固定的)。需要删除不以特定字符串开头的字符串 randomstringA text_that_needs_to_be_kept1 text_that_needs_to_be_removed1 randomstringB text_that_needs_to_be_kept2 randomstringA text_that_needs_to_be_kept3 text_that_needs_to_be_removed2 我希望单元格的输出

我有一列Excel单元格采用这种格式(随机字符串的顺序不是固定的)。需要删除不以特定字符串开头的字符串

randomstringA text_that_needs_to_be_kept1
text_that_needs_to_be_removed1
randomstringB text_that_needs_to_be_kept2
randomstringA text_that_needs_to_be_kept3
text_that_needs_to_be_removed2
我希望单元格的输出如下(必须保留换行符):

而不是这个(换行符被删除):


在B1中,将此公式
=IF(LEFT(A1;1)=“r”;MID(A1;FIND(“'A1;1)+1;500”)
放置在B列的其他单元格中,然后复制并粘贴到B列的其他单元格中。

以下代码将从第1行开始进入A列,并从数组
arrToKeep
中删除任何不以值开头的行,保留换行符

Option Explicit

Sub RemoveStrings()
Dim rngData As Range
Dim arrData As Variant
Dim arrLines As Variant
Dim arrToKeep As Variant
Dim idx1 As Long
Dim idx2 As Long
Dim idxRow As Long
Dim boolKeep As Boolean

    arrToKeep = Array("randomstringA", "randomstringB")

    Set rngData = Range("A1", Range("A" & Rows.Count).End(xlUp))

    arrData = rngData.Value

    For idxRow = LBound(arrData, 1) To UBound(arrData, 1)

        arrLines = Split(arrData(idxRow, 1), vbLf)

        For idx1 = LBound(arrLines) To UBound(arrLines)
        
            boolKeep = False
            
            For idx2 = LBound(arrToKeep) To UBound(arrToKeep)
                If arrLines(idx1) Like arrToKeep(idx2) & "*" Then
                    boolKeep = True
                    Exit For
                End If
            Next idx2
            
            If Not boolKeep Then
                arrLines(idx1) = ""
            End If
            
        Next idx1

        arrData(idxRow, 1) = Join(arrLines, vbLf)

    Next idxRow

    rngData.Value = arrData

End Sub


那么,在实施此功能时,您遇到的具体问题是什么?你尝试了什么?发生了什么?一种方法可能是使用
vbLf
上的
Split()
获取一个行数组,然后在数组上循环,将不希望的行设置为空字符串,然后
Join()
数组以获得结果。
text_that_needs_to_be_kept1
text_that_needs_to_be_kept2
text_that_needs_to_be_kept3
Option Explicit

Sub RemoveStrings()
Dim rngData As Range
Dim arrData As Variant
Dim arrLines As Variant
Dim arrToKeep As Variant
Dim idx1 As Long
Dim idx2 As Long
Dim idxRow As Long
Dim boolKeep As Boolean

    arrToKeep = Array("randomstringA", "randomstringB")

    Set rngData = Range("A1", Range("A" & Rows.Count).End(xlUp))

    arrData = rngData.Value

    For idxRow = LBound(arrData, 1) To UBound(arrData, 1)

        arrLines = Split(arrData(idxRow, 1), vbLf)

        For idx1 = LBound(arrLines) To UBound(arrLines)
        
            boolKeep = False
            
            For idx2 = LBound(arrToKeep) To UBound(arrToKeep)
                If arrLines(idx1) Like arrToKeep(idx2) & "*" Then
                    boolKeep = True
                    Exit For
                End If
            Next idx2
            
            If Not boolKeep Then
                arrLines(idx1) = ""
            End If
            
        Next idx1

        arrData(idxRow, 1) = Join(arrLines, vbLf)

    Next idxRow

    rngData.Value = arrData

End Sub