Конференція vbstreets - перегляд теми - excel
Як на аркуші Excel найбільш швидко знайти рядок, в якій кілька осередків за значеннями задовольняють умовам?
Якщо це 1 осередок, думаю, найшвидше: МойЛіст.Range ( "А: A"). Find (what: = "значення1".)
А якщо за кількома стовпцями шукати? Нехай за двома першими.
Можна, звичайно, циклом - але повільно на великих масивах.
For i = 1 to ПоследняяСтрока
if cells (i, 1) .value = значення1 and cells (i, 2) .value = значення2 then
'Ось знайшли
end if
next i
А який спосіб найбільш швидкий для такого завдання?
Маю на увазі не в масив все закинути і там перебирати - це не принципова зміна. У базі даних найшвидше - запит, за умовами полів можна знайти запис і прочитати з неї значення всіх потрібних полів. Як в Excel зробити швидкий пошук за кількома осередкам рядки і знайти потрібний рядок? Точніше мені потрібна не рядок, а інші значення з того рядка.
Тип даних в осередках числовий, текстовий або змішані? Чи можуть дані повторяться в різних рядках?
І в залежності від цього вибирати між деревом, хешем або простим бінарним пошуком.
O, sancta simplicitas!
Тип значень текстовий. Є повторювані значення в кожному стовпці, але в сукупності дають унікальний ідентифікатор (або як результат не знайдено відповідності).
Так, може ви і праві натяком - зробити допоміжний стовпець ЯчейкаСтолбца1 ЯчейкаСтолбца2, робити по ньому пошук а потім після обробки очистити значення в цьому стовпці.
А як ще можна шукати за двома текстовим стовпчиках?
Для бінарного пошуку відсортовано має бути? Мені не хочеться чіпати ці дані.
Ще інша думка в голову прийшла. Власне можна цю таблицю скопіювати на новий робочий лист, там впорядкувати за об'єднаному полю або ще як і робити там пошук. Потім це лист видалити. Який спосіб взагалі найшвидший пошуку тексту? Вважається, що в цьому об'єднаному поле унікальні дані, але все ж роблять люди - в крайньому випадку можна на унікальність спочатку перевірити. Пошуку багато - ця таблиця типу довідника, тому час пошуку має значення.
А скільки всього стовпців? А пошук повинен здійснюватися тільки по перших двох стовпчиках або з будь-яких двох? Якщо друге, то ідея з допоміжним стовпцем відпадає (та й не ефективно це, так як має ту ж складність, що і вираз if cells # 40; i, 1 # 41; .value = значення1 and cells # 40; i, 2 # 41; .value = значення2 then).
Наприклад, є следующии таблиця (під літерами маються на увазі значення осередків):
Код: Виділити все 1 2 3 4 5
1 A B C D E
2 F G H I J
3 K L M N O
То тобі потрібно зв'язати всі пари в рядку з номером цього рядка:
Код: Виділити все AB = 1 BC = 1 CD = 1 DE = 1
AC = 1 BD = 1 CE = 1
AD = 1 BE = 1
AE = 1
FG = 2 GH = 2 HI = 2 IJ = 2
FH = 2 GI = 2 HJ = 2
FI = 2 GJ = 2
FJ = 2
і так далі.
Залишається придумати, як зберігати ці пари. На думку спадає B-Tree, так як це найбільш часто використовуваний тип індексів і різні його різновиди використовуються практично всіма СУБД.
O, sancta simplicitas!