在具有相反值的特定列中查找并替换字符串,一次一行

Find and replace string in a specific column with opposite value, one row at a time

我确定这个标题没有任何意义,所以我很抱歉。

我有一列,每个单元格中有两个可能的字符串之一。该单元格包含 "From" 或 "To"。我需要一个宏来将所有 "From" 单元格替换为 "To" 并将所有 "To" 单元格替换为 "From".

这些值目前位于 E 列中,从 E2 开始,长度可能会有所不同,但很可能小于 E50。

我试过下面的代码,但它根本不起作用:

Dim fromToReplace As String 
fromToReplace = Sheets("Template_Test").Range("E100").End(xlUp).Row

       For i = 2 To fromToReplace
        If Cells(i, 5) = "From" Then
            Replace What:="From", Replacement:="To", SearchOrder:=xlByRows, MatchCase:=True
            Else
                Replace What:="To", Replacement:="From", SearchOrder:=xlByRows, MatchCase:=True
        End If

编辑更新:

我现在也尝试了以下 -

For i = 2 To fromToReplace
    If ActiveCell.Value = "From" Then
         ActiveCell.Value = "To"
         Else ActiveCell.Value = "From"
    EndIf
Next i

使用您的方法:

您缺少循环语句 (Next i)。此外,您不需要使用 Replace,因为您已经使用 If 语句验证了单元格中的值。

如果你的值为From,你可以直接将其更改为To (反之亦然)

此外,良好做法 限定 您对 Cells 对象的使用。

Option Explicit

Sub To_From()

Dim ws As Worksheet, i as Long
Set ws = ThisWorkbook.Sheets("Template_Test")

For i = 2 To ws.Range("E" & ws.Rows.Count).End(xlUp).Row
    If ws.Cells(i, 5) = "From" Then
        ws.Cells(i, 5) = "To"
    ElseIF ws.Cells(i, 5) = "To" Then
        ws.Cells(i, 5) = "From"
    End If
Next i

End Sub

更有效的方法:

通过将您的一个值存储为临时值(将 From 更改为 FromTemp)避免逐行执行此操作,以避免干扰您的其他交换。

我假设这种干扰是您首先声明必须逐行的唯一原因。
您的数据集越大,考虑速度时此选项就越有吸引力。

Option Explicit

Sub To_From()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Template_Test")

Dim ReplaceRange As Range
Set ReplaceRange = ws.Range("E1:E" & ws.Range("E" & ws.Rows.Count).End(xlUp).Row)

ReplaceRange.Replace "From", "FromTemp", xlWhole
ReplaceRange.Replace "To", "From", xlWhole
ReplaceRange.Replace "FromTemp", "To", xlWhole

End Sub

你也可以使用评估:

Dim rng As Range
Set rng = Sheets("Template_Test").Range("E2", Sheets("Template_Test").Cells(Rows.Count, 5).End(xlUp))
rng.Value = ActiveSheet.Evaluate("IF(" & rng.Address(1, 1) & "=""To"",""From"",""To"")")

或者你可以循环和数组:

Dim rng
rng = ActiveSheet.Range("E2", ActiveSheet.Cells(Rows.Count, 5).End(xlUp)).Value
Dim i As Long
For i = 1 To UBound(rng, 1)
    If rng(i, 1) = "To" Then
        rng(i, 1) = "From"
    Else
        rng(i, 1) = "To"
    End If
Next i
ActiveSheet.Range("E2", ActiveSheet.Cells(Rows.Count, 5).End(xlUp)).Value = rng

至于 运行 代码的时间。这两个平均值 0.016 seconds 10,000 行

@udearboy 很抱歉说你的 10,000 行花费了 0.211 秒。还不够担心,但不得不擦擦它。:)