我确定标题没有任何意义,所以我深表歉意。
我有一列,每个单元格中都有两个可能的字符串之一。该单元格包含“从”或“到”。我需要一个宏,它将所有“发件人”单元格替换为“收件人”,并将所有“发件人”单元格替换为“发件人”。
当前值位于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
答案 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
秒。不必担心,只需要擦入即可。:)