【问题标题】:I want to delete "words" from cells in Excel but keep alphanumeric text我想从 Excel 中的单元格中删除“单词”但保留字母数字文本
【发布时间】:2013-06-30 06:10:01
【问题描述】:

我在特定列中有一些单元格,其中包含字母数字文本以及其他单词或数字。

单元格示例以粗体

底部:J103 注 13

我想删除 BOTTOM:、NOTE 和 13 但保留 J103

J103 的文本可能包含多个字母和 1 到 4 个数字,但它们总是会组合在一起,并以特定行的相同字母开头。有些单元格只有我想保留的文本,但会用逗号分隔。满足此条件的单元格将被忽略,如下所示。

CR33、CR45、CR49 - 第 1 行

D12、D13、D14、D104 - 第 2 行

我想删除的单词永远不会有数字。独立的数字不会有字母,如果出现一些奇怪的情况,字母最后会出现在 13a。

如果一个特定的单元格有:

上:J104 下:J103

我想同时删除 TOP: 和 BOTTOM: 并用逗号分隔剩余的 J104 和 J103。

J104、J103

如果可能的话,我希望这一切都作为一个宏。

我是 VBA 的初学者,所以要温柔

Andy G 在他的回复中建议在他的代码中使用正则表达式。

我已经阅读了有关此事的信息,但我并不完全了解实际发生的情况。这是我尝试过的无济于事。

Sub test()
Dim rngToSearch As Range
Dim rng As Range
'Tools References - Microsoft VBScript Regular Expressions 5.5
Dim rgx As New VBScript_RegExp_55.RegExp
Dim matches As Variant, match As Variant
Dim strTemp As String
Dim LastRow As Long
Dim cellText As String
Dim i As Integer

With ActiveSheet
    LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
    End With

rgx.Pattern = "[A-Z]+\d{1,4}"
'rgx.IgnoreCase = True
rgx.Global = True
Application.ScreenUpdating = False
Set rngToSearch = Range("D1:D" & LastRow).CurrentRegion
    For Each rng In rngToSearch
    strTemp = ""
    Set matches = rgx.Execute(rng.Value)
    For Each match In matches
        strTemp = strTemp & match.Value & ","
    Next match
    If Len(strTemp) > 0 Then
        rng.Offset(0, 1).Value = Left(strTemp, Len(strTemp) - 1)
    End If
Next rng
Application.ScreenUpdating = True
End Sub

感谢任何答案。提前致谢。

【问题讨论】:

  • 是的,对不起。办公室 2007。
  • 您可以使用正则表达式来执行此操作:tmehta.com/regexp

标签: excel alphanumeric


【解决方案1】:

我有下面的代码,但你需要研究它才能理解和应用它。

Sub KeepCodes()
    Dim rngToSearch As Range
    Dim rng As Range
    'Tools References - Microsoft VBScript Regular Expressions 5.5
    Dim rgx As New VBScript_RegExp_55.RegExp
    Dim matches As Variant, match As Variant
    Dim strTemp As String

    rgx.Pattern = "[A-Z]+\d{1,4}"
    'rgx.IgnoreCase = True
    rgx.Global = True
    Application.ScreenUpdating = False
    Set rngToSearch = Range("A1").CurrentRegion
    For Each rng In rngToSearch
        strTemp = ""
        Set matches = rgx.Execute(rng.Value)
        For Each match In matches
            strTemp = strTemp & match.Value & ","
        Next match
        If Len(strTemp) > 0 Then
            rng.Offset(0, 1).Value = Left(strTemp, Len(strTemp) - 1)
        End If
    Next rng
    Application.ScreenUpdating = True
End Sub

阅读这篇MSDN regex 文章。

【讨论】:

  • 有什么办法让它只做一个选定的单元格?我确实有代码可以从一列的行运行到最后一行。我假设它在 rgx.Global = True 行中。
  • 如果您研究代码(以及我提供的正则表达式链接),您将能够对其进行修改。而且,不,它与rgx.Global 无关。
  • 我研究了代码并尝试了一些东西,但我无法仅获得一个列来执行任务,整个工作表都被更改了。我需要更改什么以便仅影响特定列?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多