Страницы: 1 2 След.
RSS
Поиск ближайших значений больше и меньше VBA
 
Добрый день.

Есть таблица со списком чего-то (назовем n). У каждого n есть координаты долготы и широты и по 2 критерия. Нужно найти для каждого n ближайшие к его координатам координаты других n (1 больше и 1 меньше), учитывая 2 критерия (чтобы критерии n начального совпадали с критериями n искомого) и подставить в столбцы "Координаты1, Координаты2...." Данные из столбца "Наименование" от n, которые мы нашли по ближайшим координатам. Третий день сижу и не могу придумать как это сделать макросом. Подскажите советом или куском кода. Файл во вложении.
 
Hellmaster, А сортировка Вам не поможет
 
msi2102, сортировку надо будет делать по каждому n, которых у меня больше 1000. Может есть какое-то решение вроде поискпоз(макс...) или с вба вроде приблизительного поиска, типа find или like?
Изменено: Hellmaster - 01.08.2019 12:38:29
 
Я из Вашего описания не понял, что именно надо и как это должно выглядеть, Вы в примере покажите как должно быть, а не просто данные которые есть.
 
Попытался объяснить в файле во вложении. Красить ячейки не надо. Я для наглядности, что откуда брать.
Изменено: Hellmaster - 01.08.2019 12:51:22
 
Поиск осуществляется на основании критериев 1 и 2, то есть на основании критериев у нас образуются группы и в них мы ищем данные? Или какой-то другой принцип.
 
msi2102, все верно. есть группа по критерию 1 и группа по критерию 2. нужно проверить, правильно ли привязаны к наименованию n способом, который я описал выше
 
см. вложение в колонках координаты указан № строки, содержащей данные с координатами ближайшими к текущим данным
Изменено: Ігор Гончаренко - 01.08.2019 13:55:18
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Hellmaster, посмотрите файл. Это должно быть так?
 
msi2102, Все так, кроме ячейки I18. Там координаты должны сопоставиться с ячейкой E20 и подтянуть ячейку С20 в ячейку I18
 
Ігор Гончаренко, Ваш вариант подтягивает не те значения.  
 
у меня в файле написано:
строка 2 ближайшая точка с такими же критериями в 26 строке
строка 3 ближайшая в 18, след в 11 и самая дальняя в 27 строке
....
строка 30 ближайшая в строке 15, след в 19, 16, 7
Изменено: Ігор Гончаренко - 01.08.2019 14:45:40
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Возможно, я не так объяснил, что должно произойти в файле. Нужно пройти по каждой n и сопоставить координаты с координатами остальных n. То есть, есть n1, n2, n3 с координатами долготы 56,57,58 соответственно (с учетом, что все эти n находятся в одной группе по совпадению двух критериев). Нужно подтянуть к n1 значение из столбца "Название". Координаты n1 = 56. Верхнее значение для поиска для n1 будет 57, т.к. это следующее после 56. Соответственно, в столбец "Координаты1" подтягивается значение столбца "Название" от n2. Нижнего значения для поиска не будет, т.к. в этой группе у n1 наименьшее число по координатам. Перейти к n2 и сделать то же самое. К n2 подтянется значение столбца "Название" n3 как верхнее и n1 как нижнее.
 
То есть к строке не привязываемся (неважно это одна строка или нет), просто в этой группе ближайшее значение к искомой ячейке, если искомая ячейка это верхнее значение, то только нижнее, если искомая ячейка нижнее то только верхнее, если посередине то оба? А группы разбиты правильно? И данные нужно расставить во всех ячейках или только в выборочных?
 
msi2102, к строке не привязывается. Нужно найти ближайшее значение по координатам в одной группе. Группы разбиты правильно. Расставить в тех ячейках, у которых будет что-то подтягиваться. Исправил в названии столбцов, чтобы не путаться.
 
Цитата
Hellmaster написал:
Расставить в тех ячейках, у которых будет что-то подтягиваться.
А как узнать в каких ячейках будет подтягиваться? Допускается-ли сортировка? Сколько будет критериев? Критерии будут определенные или каждый раз разные? И ещё присутствуют пустые ячейки (столбец  С "Название"), что делать с ними?
Изменено: msi2102 - 01.08.2019 15:08:39
 
msi2102, в идеале, должно все подтянуться, найдя верхнее и нижнее каждого n. Подтягивать нужно в последние 4 столбца, в соответствии с строкой искомого n. Сортировка да. Столбцов с критерием будет 2, но в каждом до 100 разных критериев. Критерии определенные. Насчет пустых хороший вопрос... Я упустил этот момент. Видимо, если при поиске координат попадет на строку с пустой ячейкой по столбцу С, то продолжить поиск до следующих координат.
Изменено: Hellmaster - 01.08.2019 15:12:45
 
Доброе время суток.
Вариант на Power Query для поиска ближайшей точки к данной в пределах равных критериев с допущением, что широты где-то рядом :)
 
Цитата
Hellmaster написал:
больше и меньше VBA
Я вот не понимаю что может быть больше и меньше VBA  :qstn:  :D  
По вопросам из тем форума, личку не читаю.
 
так?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, да. Все верно. Как вы это сделали?
 
Андрей VG, можно подробнее? Я не работал с Query.
 
однако, в начале я искал ближайшие по расстоянию
собственно, искал не я, а макрос, который я написал
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Hellmaster написал:
Я не работал с Query.
А зачем, если
Цитата
Hellmaster написал:
Ігор Гончаренко , да. Все верно
Вы же хотели макрос?
Но, на всякий случай на правах рекламы Книга "Скульптор данных в Excel с Power Query"
 
Андрей VG, конечно, идеально было бы макрос. Желательно скелет макроса, который я бы смог дописать, доделать. Но Power Query тоже полезный навык и было бы полезно и его изучить)
 
Ігор Гончаренко, а можете показать макрос?
 
Код
Sub FindNearestKoord()
  Dim a, r&(1 To 2), n(1 To 4), i&
  a = Cells(2, 1).Resize(Cells(Rows.Count, 1).End(xlUp).Row - 1, 9)
  For r(1) = 1 To UBound(a)
    For i = 1 To 4:  n(i) = Empty:  Next
    r(2) = 1:  Application.StatusBar = r(1) & " " & UBound(a)
    Do While r(2) <= UBound(a)
      If a(r(1), 1) = a(r(2), 1) And a(r(1), 2) = a(r(2), 2) And r(1) <> r(2) Then
        If a(r(2), 4) > a(r(1), 4) Then
          If IsEmpty(n(1)) Then n(1) = r(2) Else If a(r(2), 4) < a(n(1), 4) Then n(1) = r(2)
        Else
          If IsEmpty(n(2)) Then n(2) = r(2) Else If a(r(2), 4) > a(n(2), 4) Then n(2) = r(2)
        End If
        If a(r(2), 5) > a(r(1), 5) Then
          If IsEmpty(n(3)) Then n(3) = r(2) Else If a(r(2), 5) < a(n(3), 5) Then n(3) = r(2)
        Else
          If IsEmpty(n(4)) Then n(4) = r(2) Else If a(r(2), 5) > a(n(4), 5) Then n(4) = r(2)
        End If
      End If
      r(2) = r(2) + 1
    Loop
    For i = 1 To 4
      If Not IsEmpty(n(i)) Then a(r(1), i + 5) = a(n(i), IIf(i < 3, 4, 5))
    Next
  Next
  Cells(2, 1).Resize(UBound(a), UBound(a, 2)) = a: Application.StatusBar = False
End Sub
это решение в лоб. понятно на 30 строках все моментально
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо большое
 
Добавил расчёт расстояния по сфере в км. Коректнее будет определяться в случае большой разбежки широт.
 
Цитата
Андрей VG написал:
на правах рекламы
Здравствуйте, Андрей! Вы отличный агент - книгу купил. :)  
Владимир
Страницы: 1 2 След.
Наверх