Sub Fs()
Dim i&, j&, n&
n = Cells(Rows.Count, 1).End(xlUp).Row - 1
With Sheets("Карта")
For i = 1 To .Cells(.Columns.Count).End(xlToLeft).Column Step 2
j = .Cells(.Rows.Count, i).End(xlUp).Row
Cells(1, i \ 2 + 2) = .Cells(1, i)
Cells(2, i \ 2 + 2).Resize(n).FormulaR1C1 = Replace(Replace(Replace( _
"=IFERROR(LOOKUP(2,1/SEARCH("" ""&Карта!R2C_i_:R_j_C_i_,"" ""&RC1),Карта!R2C_i+1_:R_j_C_i+1_),"""")" _
, "_i_", i), "_i+1_", i + 1), "_j_", j)
Next
End With
With ActiveSheet.UsedRange: .Value = .Value: End With
End Sub
Fsociety_ написал: Казанский , почему вы так формулы любите?)
Отвечу за коллегу по цеху: Потому что сперва были формулы, и только потом VBA, Потому что в умелых руках формулы творят чудеса, а в неумелых VBA гробит все Потому что если посмотреть, то формула автоподстраивается под диапазон. Потому что если что надо поменять то код VBA тоже менять.
У меня нормально отрабатывает все вот кусок с циклом, проверьте
Код
For J = 1 To NumMarks
If InStr(LCase(Core.Cells(I, 1)), LCase(Keys(J))) = 1 Or InStr(LCase(Core.Cells(I, 1)), " " & LCase(Keys(J))) > 0 Then
Core.Cells(I, CellIndex) = Names(J)
End If
Next J
Я люблю то, что эффективно в конкретном случае. Здесь формула заменила два вложенных цикла. Код в разы короче и работает на ~40% быстрее. Если будете обрабатывать большие объемы данных - заметите.
Цитата
Fsociety_ написал: если вдруг диапазон нужно поменять
Какой именно? Все вычисляется в VBA и подставляется в формулу. А вот если допустим на листе Ядро таблица начинается не с А1, а с В3 - Вы сразу сообразите, что надо поменять в макросе bigorq?
Казанский, Я почему то был приверженцем того что с формулами все гораздо дольше работает, не знал что в макросе их можно так грамотно отыгрывать. Даже на небольшом объеме данных видна разница в работе. Спасибо и Вам за проделанную работу. Буду пока оба варианта пробовать и тестировать)
Цитата
Казанский написал: Вы сразу сообразите, что надо поменять в макросе bigorq ?