2014-02-20 4 views
0

Скажем, у меня есть отсортированный список значений в столбце A. Они служат как «ключ» для каждой числовой строки. Что-то вроде этого:Отображать значения строк на основе ближайшего числового соответствия ключа

___A_(key)_______B______   ______G_____ 
1 |____2.58___|____________| ... |____________| ... 
2 |____2.69___|____________| ... |____________| ... 
     ...   ...     ... 
    ________________________   ____________ 
x |____5.69___|____________| ... |____________| ... 

Колонка B через G имеет несколько значений для каждого из ключей, так что в основном 2D таблицы числовых данных.

Мне нужно иметь возможность быстрого доступа к определенному ряду по приблизительно значение.

Сейчас я поставил фильтр на колонке, и может искать строки, но для этого мне нужно ввести ключевое значение в точности, т.е. 2.58 или 2.69, но не что-то вроде 2.64.

Я хочу, чтобы иметь возможность ввести что-то вроде 2.64, и показать мне строку с ближайшим значением ключа, желательно в отдельном месте, например, сбоку от таблицы, например, начиная с колонки I, где точно может быть определен, но в основном любой метод, в котором я печатаю значение и получаю удобное отображение значений строк. Как я могу это сделать?

Уровень моего опыта: я сделал несколько простых вещей в VBA/excel ~ 10 лет назад ... и в основном ищет хорошее начальное направление и подход.

+1

в качестве начальной точки, посмотрите на [этот ответ by @ BK201] (http://stackoverflow.com/questions/21864282/any-way-to-script-excel-to-run-a-fancy-search- для-множественных запросов-на-один раз/21864614 # 21864614). Для приблизительного соответствия используйте третий параметр 'Match', равный' 1' (вместо '0') –

+1

@simoco, который может дать вам ближайший более высокий или более низкий, но не самый близкий. – user2140261

+0

Хотя 'MATCH' кажется прекрасным, я согласен с @ user2140261. Если я использую его с '2.51', он будет' N/A' на указанном выше в третьем параметре '= 1', даже если данные отсортированы по возрастанию. Я думаю, что лучше всего справиться с VBA. :/ – Manhattan

ответ

2

Если предположить, что данные в A1:A20 и ваш взгляд на значение в B1 эта формула будет возвращать ближайший:

=INDEX(A1:A20,MATCH(MIN(ABS(A1:A20-B1)),ABS(A1:A20-B1),0)) 

При входе убедитесь нажать Ctrl + Сдвиг + Введите и NOT только .

Он получает наименьшую разницу, а затем возвращает свою строку в индекс, затем индекс возвращает значение.

+0

+1 мы думаем одинаково :) –

+0

отличный ответ, но неполный по отношению к моему вопросу. Мне нужно отобразить строку, поэтому вам нужно добавить '= VLOOKUP (H2, A1: B20,2)', '= VLOOKUP (H2, A1: B20,3)' и т. Д. Для каждого столбца, который я хотел отобразить , где H2 в этом случае является результатом формулы INDEX – Dennis

+0

@Dennis Нет, совсем не все, что вам нужно сделать, это изменить самый первый A1: A20 на столбец, который вы хотите вернуть. и это все. Таким образом, для значения в столбце B в строке с ближайшим значением в A по сравнению с B1 будет '= INDEX (B1: B20, MATCH (MIN (ABS (A1: A20-B1)), ABS (A1: A20- B1), 0)) 'все, что меняется, является первой ссылкой. Вся часть формулы 'MATCH (MIN (ABS (A1: A20-B1)), ABS (A1: A20-B1), 0)' просто возвращает номер строки с ближайшим совпадением, вы также можете поставить весь ваш диапазон в первой ссылке и используйте индексную часть индекса индекса для возврата столбца – user2140261

0

Это то, о чем я думаю. Вы просматриваете все строки и получаете разницу между своей целью и значением в этой ячейке. Вы найдете строку, которая дает наименьшую разницу, и это будет ваша целевая строка.

Dim dblErr As Double 
Dim intIndex As Integer 
Dim i As Integer 
Dim dblTarget As Double 

dblTarget = 'Value you are after 
dblErr = 10000 ' or some other large number 
For i = 1 To x 'x= number of rows 
    If dblErr > Abs(Cells(i + 1, 1) - dblTarget) Then 
     dblErr = Abs(Cells(i + 1, 1) - dblTarget) 
     intIndex = i 
    End If 
Next i 

Ans = Cells(intIndex, 1) 
Смежные вопросы