【问题标题】:How can I use VBA in Excel to filter lines in a single cell based on line breaks?如何在 Excel 中使用 VBA 根据换行符过滤单个单元格中的行?
【发布时间】:2022-08-05 01:53:03
【问题描述】:

我有这个单元格(以及一整列类似的单元格),其中包含零件号及其状态,我需要过滤掉标记为完成的数字,同时保留其余部分。

我知道有一种方法可以根据换行符分隔信息,但在那之后我就不知所措了。我尝试从单元格创建一个数组,但该数组很难删除信息。

我觉得有一个简单的解决方案,但我只是没有看到它。 *编辑-我使用的是 Excel 2016,所以我没有很多新功能。

  • 做过滤掉意味着您想删除这些行(它们永远消失了)或者您想隐藏/显示而不是类似于自动过滤器
  • 是的,永远删除。

标签: excel vba


【解决方案1】:

试试这个公式(数据在单元格 A1 中):

=LET(XML, "<t><s>" & SUBSTITUTE(A1,CHAR(10),"</s><s>") & "</s></t>",
          Data, FILTERXML(XML,"//s"),
          FILTER(Data,NOT(ISNUMBER(SEARCH("Complete",Data)))))  

或者如果您希望它在单个单元格中返回:

=TEXTJOIN(CHAR(10),TRUE,
          LET(XML, "<t><s>" & SUBSTITUTE(A1,CHAR(10),"</s><s>") & "</s></t>",
                 Data, FILTERXML(XML,"//s"),
                 FILTER(Data,NOT(ISNUMBER(SEARCH("Complete",Data))))))

【讨论】:

  • 这对我不起作用。我应该提到我在运行 Excel 2016 的工作计算机上。
【解决方案2】:
colArray = Array("H")
        check_col = colArray(0)
        ColLastRow = Range(check_col & Rows.Count).End(xlUp).Row
        For Each Rng In Range(check_col & "1" & ":" & check_col & ColLastRow)
            If InStr(Rng.Value, vbLf) Then
                Rng.EntireRow.Copy
                Rng.EntireRow.Insert
                
                For i = 0 To UBound(colArray)
                    c = colArray(i)
                    
                    Set currentrng = Range(c & Rng.Row)
                    Set upperRng = currentrng.Offset(-1, 0)
                
                    upperRng.Value = Mid(currentrng.Value, 1, InStr(currentrng.Value, vbLf) - 1)
                    currentrng.Value = Mid(currentrng.Value, Len(upperRng.Value) + 2, Len(currentrng.Value))
                Next i
            End If
        Next

这就是我最终使用的。将单元格分成单独的行,以便我可以过滤。然后我用下面的代码重新组合。

Last_Row = Cells(Rows.Count, 1).End(xlUp).Row
            For i = Last_Row To 2 Step -1
            
                If Len(Cells(i, 1)) = 0 Then Rows(i).Delete
                    If Cells(i, 6) = Cells(i - 1, 6) Then
                        Cells(i - 1, 9) = Cells(i - 1, 9) & vbLf & Cells(i, 9)
                        Rows(i).Delete
                    End If
                
            Next i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 2022-11-22
    • 2016-01-11
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多