Excel 用列文本替换文本标记

Excel 用列文本替换文本标记,excel,excel-formula,excel-2010,vba,Excel,Excel Formula,Excel 2010,Vba,我有几列文字。此外,我还有一个列,名为替换文本。此列包含带有标记的字符串,如[1]、[2]等。 我想用标记行中的文本替换标记 例如,这里您可以找到[5]变成这里您可以找到b,因为[5]是标记列,在字符串的行中b是标记的值 我正在考虑创建一个大型的if-else构造和substitute文本,这非常容易出错 但是,我想问你是否有更简单的解决办法 我感谢你的意见 ReplaceBrackets1:使用正则表达式提取列号。处理100K记录需要15.03秒 ReplaceBrackets2:将数据加

我有几列文字。此外,我还有一个列,名为
替换文本
。此列包含带有标记的字符串,如
[1]、[2]等。

我想用标记行中的文本替换标记

例如,
这里您可以找到[5]
变成
这里您可以找到b
,因为
[5]
是标记列,在字符串的行中
b
是标记的值

我正在考虑创建一个大型的
if-else
构造和
substitute
文本,这非常容易出错

但是,我想问你是否有更简单的解决办法


我感谢你的意见

ReplaceBrackets1:使用正则表达式提取列号。处理100K记录需要15.03秒


ReplaceBrackets2:将数据加载到数组中,使用RegEx提取列号,并且只写入工作表1次。处理100K记录需要1.27秒


在将
ReplaceBrackets1
转换为
UDF
getReplacedText
)之后,我惊奇地发现,只需2.53秒就可以填写100K条记录的公式。我不确定这样做会比原来的更快。但是有那么多公式确实会减慢电子表格的速度

getReplacedText:使用静态正则表达式解析数据

Function getReplacedText(ReplacementText As String, Source As Range)
'http://analystcave.com/excel-regex-tutorial/
    Dim Match As Object, Matches As Object
    Static regex As Object
    If regex Is Nothing Then
        Set regex = CreateObject("VBScript.RegExp")

        With regex
            .Global = True
            .Pattern = "\[(.*?)\]"
        End With
    End If

    If regex.Test(ReplacementText) Then
        Set Matches = regex.Execute(ReplacementText)
        For Each Match In Matches
            ReplacementText = Replace(ReplacementText, Match, Source.Columns(CInt(Match.SubMatches(0))))
        Next Match

    End If

    getReplacedText = ReplacementText
End Function

replaceBarkets1:使用正则表达式提取列号。处理100K记录需要15.03秒


ReplaceBrackets2:将数据加载到数组中,使用RegEx提取列号,并且只写入工作表1次。处理100K记录需要1.27秒


在将
ReplaceBrackets1
转换为
UDF
getReplacedText
)之后,我惊奇地发现,只需2.53秒就可以填写100K条记录的公式。我不确定这样做会比原来的更快。但是有那么多公式确实会减慢电子表格的速度

getReplacedText:使用静态正则表达式解析数据

Function getReplacedText(ReplacementText As String, Source As Range)
'http://analystcave.com/excel-regex-tutorial/
    Dim Match As Object, Matches As Object
    Static regex As Object
    If regex Is Nothing Then
        Set regex = CreateObject("VBScript.RegExp")

        With regex
            .Global = True
            .Pattern = "\[(.*?)\]"
        End With
    End If

    If regex.Test(ReplacementText) Then
        Set Matches = regex.Execute(ReplacementText)
        For Each Match In Matches
            ReplacementText = Replace(ReplacementText, Match, Source.Columns(CInt(Match.SubMatches(0))))
        Next Match

    End If

    getReplacedText = ReplacementText
End Function

这个答案高度抄袭了Thomas Inzina的第一个答案版本,但一个非常简单的替换方法是:

Sub ReplaceText()
    Dim r As Long
    Dim c As Long
    With ActiveSheet
        For r = 3 To .Range("K" & .Rows.Count).End(xlUp).Row
            For c = 1 To 10
                .Cells(r, "K").Replace "[" & c & "]", .Cells(r, c).Value
            Next
        Next
    End With
End Sub
上述代码将尝试使用所有十列进行替换

正如Thomas所指出的,以下代码仅在需要替换的情况下才会进行替换,因此可能会快一个数量级,因此无疑是更好的解决方案:

Sub ReplaceText()
    Dim r As Long
    Dim c As Long
    With ActiveSheet
        For r = 3 To .Range("K" & .Rows.Count).End(xlUp).Row
            For c = 1 To 10
                If Instr(.Cells(r, "K").Value, "[" & c & "]") > 0 Then
                    .Cells(r, "K").Replace "[" & c & "]", .Cells(r, c).Value
                End If
            Next
        Next
    End With
End Sub

(非常感谢Thomas在两种不同方法上进行速度测试的努力。)

这个答案高度抄袭了Thomas Inzina的答案的第一个版本,但一个非常简单的替换方法是:

Sub ReplaceText()
    Dim r As Long
    Dim c As Long
    With ActiveSheet
        For r = 3 To .Range("K" & .Rows.Count).End(xlUp).Row
            For c = 1 To 10
                .Cells(r, "K").Replace "[" & c & "]", .Cells(r, c).Value
            Next
        Next
    End With
End Sub
上述代码将尝试使用所有十列进行替换

正如Thomas所指出的,以下代码仅在需要替换的情况下才会进行替换,因此可能会快一个数量级,因此无疑是更好的解决方案:

Sub ReplaceText()
    Dim r As Long
    Dim c As Long
    With ActiveSheet
        For r = 3 To .Range("K" & .Rows.Count).End(xlUp).Row
            For c = 1 To 10
                If Instr(.Cells(r, "K").Value, "[" & c & "]") > 0 Then
                    .Cells(r, "K").Replace "[" & c & "]", .Cells(r, c).Value
                End If
            Next
        Next
    End With
End Sub

(非常感谢Thomas在两种不同方法上进行速度测试的努力。)

是的,VBA可以轻松处理这一问题。您确实需要提供到目前为止您已经尝试过的内容。请记住,SO不是一个代码编写服务,而是一个论坛,用于获取有关编码问题的尖锐问题。作为起点,您可以创建一个循环,该循环在列K上的范围内运行,提取每个单元格的标记并替换相应的字符串。一旦你有了你的代码,如果你仍然有问题,你可以在上面分享代码,以便在你的问题上获得帮助。是的,VBA可以很容易地处理这个问题。您确实需要提供到目前为止您已经尝试过的内容。请记住,SO不是一个代码编写服务,而是一个论坛,用于获取有关编码问题的尖锐问题。作为起点,您可以创建一个循环,该循环在列K上的范围内运行,提取每个单元格的标记并替换相应的字符串。一旦你有了你的代码,如果你仍然有问题,你可以在上面分享代码,以便在你的问题上获得帮助。在这方面,您可能会将列=1到10的
column=…
更改为
,因此每个单元格将处理多组括号。这样做,我必须更改每个
Instr()
的起点。正则表达式更好,或者可以拆分。您的Instr只用于计算
的值,如果您循环遍历
的所有可能值,则不需要它。(解决方案的核心是
单元格(x,“k”)。替换“[”&列&“]”,单元格(x,列)
,它只需要知道行号和
的值。列将字母作为字符串,数字作为数字。下面是一个示例公式
=getReplacedText(K5,A5:J5)
。你的配方是什么?那和你的样品很不一样。它需要引用列标题和
WorksheetFunction.Match
Range()。查找
以获取列号。我很忙,可能要到下周才能修改。您可能会将列=1到10的
column=…
更改为
,因此每个单元格将处理多组括号。这样做,我必须更改每个
Instr()
的起点。正则表达式更好,或者可以拆分。您的Instr只用于计算
的值,如果您循环遍历
的所有可能值,则不需要它。(解决方案的核心是
单元格(x,“k”)。替换“[”&列&“]”,单元格(x,列)
,它只需要知道行号和
的值。列将字母作为字符串,数字作为数字。这是一份样本表格