С 2018 года существует гораздо более короткое и элегантное решение. Просто используйте. Array.prototype.sort () .
Пример:
var items = [
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic', value: 13 },
{ name: 'Zeros', value: 37 }
];
// sort by value
items.sort(function (a, b) {
return a.value - b.value;
});
Вам не хватает инструкции цикла (Next i
). Кроме того, вам не нужно использовать Replace
, поскольку вы уже подтвердили значение в своей ячейке с помощью оператора If
.
Если ваше значение равно From
, вы можете просто изменить его на To
непосредственно (& amp; наоборот)
Кроме того, это хорошая практика чтобы квалифицировать ваше использование объекта 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
секунды. Не достаточно, чтобы волноваться, но просто пришлось втирать его.:)
Timer
для проверки времени выполнения? Я просто использую метки времени Now
, поскольку секунды были для меня достаточно хорошим индикатором. Просто интересно, как вы попадаете в миллисекунды, чтобы я мог найти и утвердить решение, среднее значение которого составляет .015
секунды;)
– urdearboy
17 July 2018 в 02:50
t = timer
, а затем в конце debug.Print timer - t
– Scott Craner
17 July 2018 в 13:08