Excel宏来查找/替换和字符串值

时间:2018-04-06 21:36:12

标签: excel vba

作为来自应用程序的数据的最终进程转储的一部分,我操纵原始输出,以便我和我的团队可以进一步使用。

我目前手动更改此数据,但我一直在尝试使用excel宏来尝试执行相同的操作。我想要实现的一个基本例子是:

样本数据

Sample Data

创建一个宏来执行查找和替换以从原始数据中删除标记,并添加到单元格值以获得最终的数据集,例如' +单元格值+',

我对VBA没什么经验,并且从这个区域的一些快速搜索中找到的代码片段中将它们整合在一起。

UNION ALL
(
  SELECT NULL           AS employed_name
       , nd.name        AS department_name
    FROM department nd
    LEFT
    JOIN employees_departments ne
      ON ne.deparment_id = nd.id
   WHERE ne.department_id IS NULL
)

但缺乏进一步调试的经验。

如果有人能指出我正确的方向,我会很感激。

2 个答案:

答案 0 :(得分:1)

你可以使用这样的东西

Option Explicit

Public Sub ReplaceTags()

    With Sheet1.UsedRange.Columns("B")

        .Replace "<*>", "''"   'replaces "<Tag>" and "</Tag>"

        .Replace "''", "',"

    End With

End Sub

样品

Result

答案 1 :(得分:1)

1)代码:

你可以尝试使用数组的非常快的方法:

Option Explicit

Public Sub RemoveTags()
    Application.ScreenUpdating = False
    Dim arr()

    With ThisWorkbook.Worksheets("Sheet2")       'Change as required
        arr = Intersect(.Range("A:A"), .UsedRange).Value
        Dim i As Long

        For i = LBound(arr, 1) To UBound(arr, 1)
            If Not IsEmpty(arr(i, 1)) Then
                On Error Resume Next
                arr(i, 1) = Chr$(39) & Chr$(39) & Split(Split(arr(i, 1), ">")(1), "<")(0) & Chr$(39) & ","
                On Error GoTo 0
        Next i

        .UsedRange.Columns("B") = arr
    End With
    Application.ScreenUpdating = True
End Sub

注意:

  1. .UsedRange.Columns("A") = arr如果您想要替换而不是B列。
  2. 使用类型函数Chr $明显快于Chr
  3. 使用.UsedRange可能会导致意外结果,因此您可能希望在范围内明确使用,例如arr = .Range(“A1:A15”)。值
  4. 使用If Not IsEmpty进行一些基本错误处理,如果搜索字词不存在,则会出现On Error Resume Next。
  5. 2)公式示例:

    使用公式,不能在细胞更换中,但只需要一个Chr(39),实际上是CHAR(39),在细胞中可见地显示“'”。在B1:

     =CHAR(39)&MID(A1,FIND(">",A1,1)+1,LEN(A1)-FIND(">",A1,1)-(LEN(A1)-(FIND("<",A1,FIND(">",A1,1)+1)))-1)&CHAR(39)&","
    

    注意:

    您可以在上面针对FIND转换SEARCHFIND区分大小写。 SEARCH不区分大小写,可以包含通配符。在这种情况下无所谓但值得注意。如果找不到搜索字符串,您可以将整个事件包装在IFERROR中以抑制错误。

    修改

    考虑到错误处理,根据@Paul Bica的回答,使用.Replace可能更简单,请相信他,因为编码较少。