Увы не нашел поиском решения моей проблемы. Надеюсь на вашу помощь. Имеем 2 листа. На 1ом листе 2 столбца А - время B - госномер. На втором листе 3 столбца А - время B - госномер С - точка. Суть том что время не точно соответствует в 2 листах и надо сравнивать по максимальному приближению, а проблема в том что при поиске по приближению - первым может выпасть значение не с тем госномером. Итого задача сводится к тому что мне нужно перенести на первый лист значения точка из второй таблицы, найдя в начале близкое по времени, а затем сравнить соответствует ли гос номер и если нет то продолжить искать до совпадения.
Ещё одна проблема что решение нужно без использования массива (в формулах). Я так понял что формулами я эту проблему не решу, а при попытке написать макрос мне не хватает немного знаний. Пытаюсь через функцию Match в цикле найти позицию приближенную по времени, а затем ВПРом значение гос номера по этой строке и если оно не соответствует то в ВПР меняю адресность поиска на значения ниже на 1 первой найденной строки. В голове выглядит логичным. На практике из последних ошибок то что не могу присвоить переменной значение полученное функцией Match. Получаю Type mismath. Завтра выложу сюда макрос. А пока вопрос, не слишком ли сложным путем я пошул встраивая в цикл ещё один цикл с предусловием?
Может есть вариант проще? Файл выложил с примером таблицы
вы, главное, не отчаивайтесь если путь окажется и вправду сложным или ложным. то что вы создали тему на этом форуме уже значит что пол-дела сделано. загляните еще в правила форума, пункты про название темы и файл-пример. и все будет в ажуре
Как теперь поменять название не знаю. А файл обязательно прикреплю завтра. Пока нет возможности. Но из головы не выходит, и думал, может просто зададут вектор знатоки для размышления
Sub вставка2()
'
' вставка Макрос
'
'
Dim I As Long
Dim B As Long
Dim J As Long
Application.EnableEvents = 0
I = 2
B = 2
J = Cells(Rows.Count, 1).End(xlUp).Row
For I = 2 To J
B = Application.Match(CDbl(Range("A" & I)), [Табл2!Range"A" & B):Range("A" & J)], 1)
If Not IsError(B) Then
Do
Range("С" & I).FormulaR1C1 = Application.VLookup(Range("A" & I), [Табл2!Range("A" & B):Range("В" & J)], 2, 1)
B = B + 1
Loop Until (Range("A" & I) <> Range("C" & I)) Or B <> J
End If
Next I
End Sub
но с латиницей и правда беда 12 подстановок делать- ну совсем печально, но можно =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TRIM(UPPER(B2));"A";"A");"B";"В");"E";"Е");"K";"К");"M";"М");"H";"Н");"O";"О");"P";"Р");"C";"С");"T";"Т");"Y";"У");"X";"Х")
artyrH написал: формула с использованием массива. как понял
Да. Спасибо. Так был реализован первый вариант. Но при условии что в таблице 100 000 строк у меня постоянно медленно отсчитывается "Проценты" в статусе и комп подвисает переодически.
Цитата
Stics написал: komandirada , у Вас в файле часть госномеров в кириллице, а часть в латинице.А "C" латиницей не равно "С" кириллицей, как и "O" и "О" и т.п.
Но в результате вычислений ищет в таблице 2 значение времени ближайшее ко времени из таблицы 1, но время найденное всегда меньше сраниваемого, а как сделать наоборот?
komandirada, ищет ближайшее как позднее, так и ранее. Это и есть определение ближайшего, если надо большее, то чуть меняем =INDEX(Табл2!B:B;1+MATCH(MIN(IF((Табл2!$C$2:$C$2262=B2)*(A2<=Табл2!$A$2:$A$2262);Табл2!$A$2:$A$2262-A2));IF((Табл2!$C$2:$C$2262=B2)*(A2<=Табл2!$A$2:$A$2262);Табл2!$A$2:$A$2262-A2);))