在具有相反值的特定列中查找并替换字符串,一次一行
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
秒。还不够担心,但不得不擦擦它。:)
我确定这个标题没有任何意义,所以我很抱歉。
我有一列,每个单元格中有两个可能的字符串之一。该单元格包含 "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
秒。还不够担心,但不得不擦擦它。:)