Найти и заменить строку в определенном столбце с противоположным значением, по одной строке за раз

С 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;
});

-1
задан istillhavetogopee 13 July 2018 в 20:46
поделиться

2 ответа

Использование вашего метода:

Вам не хватает инструкции цикла (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
1
ответ дан urdearboy 17 August 2018 в 12:09
поделиться

вы также можете использовать оценку:

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 секунды. Не достаточно, чтобы волноваться, но просто пришлось втирать его.:)

1
ответ дан Scott Craner 17 August 2018 в 12:09
поделиться
  • 1
    Используете ли вы функцию Timer для проверки времени выполнения? Я просто использую метки времени Now, поскольку секунды были для меня достаточно хорошим индикатором. Просто интересно, как вы попадаете в миллисекунды, чтобы я мог найти и утвердить решение, среднее значение которого составляет .015 секунды;) – urdearboy 17 July 2018 в 02:50
  • 2
    Да, я использую t = timer, а затем в конце debug.Print timer - t – Scott Craner 17 July 2018 в 13:08
Другие вопросы по тегам:

Похожие вопросы: