Excel宏搜索和替换单元格

Excel宏搜索和替换单元格,excel,vba,Excel,Vba,请帮助我使用宏清理excel中的数据 之前: 之后: 所以我需要建议函数宏来搜索MASTER中带有参数的数据。 然后,宏可以显示与此数据匹配的参数的结果 编辑说明:我只是想知道我可以在宏中使用什么函数来回答这个问题。不要为我的问题要求完整的宏。 很抱歉通过转置主范围并用|连接值来构建正则表达式。针对数据中的每个单元格值测试正则表达式,如果成功,则执行正则表达式以捕获值 Sub clean() Dim ws As Worksheet Set ws = ThisWorkbo

请帮助我使用宏清理excel中的数据

之前:

之后:

所以我需要建议函数宏来搜索MASTER中带有参数的数据。 然后,宏可以显示与此数据匹配的参数的结果

编辑说明:我只是想知道我可以在宏中使用什么函数来回答这个问题。不要为我的问题要求完整的宏。
很抱歉

通过转置主范围并用|连接值来构建正则表达式。针对数据中的每个单元格值测试正则表达式,如果成功,则执行正则表达式以捕获值

  Sub clean()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(1)
    Dim rngMASTER as Range, rngDATA As Range
    Dim start as Single, finish as Single
    start = Timer

    ' set ranges
    Dim numLastA as Long, numLastC As Long
    numLastA = ws.Range("A" & Rows.count).End(xlUp).Row
    Set rngDATA = ws.Range("A2:A" & numLastA)

    numLastC = ws.Range("C" & Rows.count).End(xlUp).Row
    Set rngMASTER = ws.Range("C2:C" & numLastC)
    'Debug.Print numLastA, numLastC

    ' avoid blanks in pattern
    If WorksheetFunction.CountBlank(rngMASTER) > 0 Then
      MsgBox "MASTER range has blank cells", vbCritical
      Exit Sub
    End If

    ' build regex pattern
    Dim sPattern As String
    sPattern = Join(WorksheetFunction.Transpose(rngMASTER), "|")
    'Debug.Print sPattern

    Dim Regex as Object
    Set Regex = CreateObject("vbscript.regexp")

    With Regex
      .Global = True
      .MultiLine = False
      .IgnoreCase = True
      .Pattern = "(" & sPattern & ")"
    End With

    ' search
    Dim cell as Range, match as Object
    Dim count As Long: count = 0

    For Each cell In rngDATA
      If Regex.test(cell) Then
        Set match = Regex.Execute(cell)
        cell.Resize(1, 3).Copy cell.Offset(0, 5)
        cell.Offset(0, 6) = match(0).submatches(0)
        count = count + 1
      End If
    Next

    finish = Timer
    MsgBox numLastA - 1 & " rows scanned" & vbCr & _
    count & " matches in " & Int(finish - start) & " secs"
  End Sub
编辑1;增加了对主控中匹配每一行的空白单元格的保护
编辑2;所有变量的声明类型

在数据上循环,
拆分
数据或使用
RegEx
确定主数组中哪个元素适合数据。如果您编写了一些代码,请编辑您当前的问题。注意:这也可以通过工作表函数来完成。@Dinda您需要使用
Split
函数将A列的每个单元格值按空格拆分为单词。然后使用
Application.WorksheetFunction.VLookup
查找主列中的每个单词,如果找到了,则将其写入B列。根据我的第一条注释,
Split
(如@P所示ᴇʜ)或
RegEx
是您可以使用的。将主参数转储到1D数组中(例如,
arr1
),然后构建一个模式以在
RegEx
中使用,例如:
.pattern=“\b”(&Join(arr1,“|”)和“)\b”
。在数据上循环执行正则表达式。确保使用不区分大小写的开关
/i
MERCY
重新设置为
MERCY
用于说明如何操作。使用VBA动态生成模式。请注意,如果您声明
Dim rngMASTER,rngDATA为范围
您只声明
rngDATA为范围
,但
rngMASTER为变量
在VBA中,您需要为每个变量指定一种类型:
Dim rngMASTER为范围,rngDATA作为范围
否则默认为变量。•与其他变量相同
Dim numLastA,numLastC,只要长
检查所有变量。如果可能的话,最好不要使用
Variant
,这样eg
Dim Regex As Object
将是一个更好的解决方案。您的计时器变量
start,finish
可以是
Single
<代码>单元格作为范围,
作为对象匹配
<代码>计数应为
而不是
整数