Разместите свои комментарии: Без циклов
Использование вычисления в диапазоне. Согласно Здесь .
для развернутые значения:
Sub Test2()
Dim rngData As Range
Set rngData = ThisWorkbook.Worksheets("Sheet1").Range("B1:G650000")
rngData = Evaluate("Substitute(" & rngData.Address & "," & "0" & ", " & "1" & ")")
End Sub
для завернутые значения:
Sub Test3()
Dim rngData As Range
Set rngData = ThisWorkbook.Worksheets("Sheet1").Range("B1:G650000")
rngData = Evaluate("Substitute(" & rngData.Address & "," & "Char(34)&" & "0" & "& Char(34)" & ", " & "Char(34) &" & "1" & "& Char(34)" & ")")
End Sub
Кажется, мне очень хорошо. Я пробежал более 650000 строк, от B до G, менее чем за 3 секунды в первый раз, менее чем за 10 секунд во второй раз (у меня есть и другие вещи). 3-й, 4-й и 5-й раз весь диапазон был =CHAR(34)&RANDBETWEEN(0,1)&CHAR(34)
, 4-й и 4-й сгенерированы случайные 0,1 в диапазоне с формулой, 5-й - функция выбора и поиска, 6-й - поиск по таблице на другом листе. Всегда находил-заменял менее чем за 15 секунд. Я не думаю, что формулы в вашем листе имеют значение для макроса. Он смотрит только на ценности и меняет ценности. Его глубина и длина вашего диапазона имеют для него большее значение.
Я также отмечаю; следуя вашему предыдущему вопросу, вы могли бы создать там свои условия: чтобы изменить 0 на 1, только если / когда значения в диапазоне A являются 'Def', а не 'ab c', поэтому все это запускается с подпрограмма vba (но вы потеряете свои формулы , если не создадите те и в ней ).
3-й предлагаемый альтернативный soln:
Назначьте уникальные серийные номера или идентификаторы по строкам для всей таблицы, отфильтруйте DEF по столбцу A, скопируйте / удалите эти строки Def на лист 2, найдите-замените 0 на 1 там, вырежьте / удалите исходные строки Defs, вставьте Sheet2 Defs на листе 1. Сортировать по идентификатору. Работа выполнена. Это займет 1 мин. хорошо, может быть 2.