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

时间:2018-07-13 20:30:29

标签: excel vba excel-vba excel-2010

我确定标题没有任何意义,所以我深表歉意。

我有一列,每个单元格中都有两个可能的字符串之一。该单元格包含“从”或“到”。我需要一个宏,它将所有“发件人”单元格替换为“收件人”,并将所有“发件人”单元格替换为“发件人”。

当前值位于E2列的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

2 个答案:

答案 0 :(得分:1)

使用您的方法:

您缺少循环语句(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

答案 1 :(得分:1)

您还可以使用评估:

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秒。不必担心,只需要擦入即可。:)