Напишите свой собственный поиск в VBA
Вот начало:
Function MyVL(v As Range, r As Range, os As Long) As Variant Dim cl As Range For Each cl In r.Columns(1).Cells If v = cl Then MyVL = cl.Offset(0, os - 1) Exit Function End If Next End Function
Используя Excel 2003, формула:
=VLOOKUP(D1 ,A1:B135, 2)
терпит неудачу, если длина D1 превышает 255 символов (то есть список имеет некоторый текст длиннее 255 символов, D1 имеет то же текстовое значение, и VLOOKUP возвращает #VALUE!).
МАТЧ, похоже, страдает от того же предела персонажа.
Я не могу найти никакого официального подтверждения этих ограничений, например здесь:
http://office.microsoft.com/en-us/excel-help/vlookup-HP005209335.aspx
или здесь:
http://office.microsoft.com/en-us/excel-help/excel-specifications-and-limits-HP005199291.aspx?CTT=3
Я знаю, что в Excel есть ограничение в 255 по длине текста, используемого в формулах, но он предполагает, что connate должен работать (в данном случае это не так, и я не использую строки в формуле, а ссылаюсь на другую ячейку).
Может ли кто-нибудь подтвердить, что эти ограничения существуют (всегда возможно, что я делаю что-то еще неправильно)?
Что еще более важно, кто-нибудь знает способ обойти их?
Спасибо
Напишите свой собственный поиск в VBA
Вот начало:
Function MyVL(v As Range, r As Range, os As Long) As Variant Dim cl As Range For Each cl In r.Columns(1).Cells If v = cl Then MyVL = cl.Offset(0, os - 1) Exit Function End If Next End Function
Вы всегда можете написать свой собственный VLOOKUP ... но, в качестве альтернативы, вы можете вычислить хеш из значения поиска и использовать его в качестве нового значения поиска.
Могут происходить коллизии, но при использовании довольно приличного хэш-алгоритма, такого как MD5, это не должно быть проблемой.
Чтобы создать хеш-функцию, вы можете использовать идеи из https://stackoverflow.com/questions/125785/password-hash-function-for-excel-vba .
I was searching for exact matches between 2 reports and ran into this. I concatenated the several different fields of one report and another report into one LONG string and then used Vlookup to identify if every field of 1000 records or so matched between the 2 reports. That's when I ran into the problem.
Because it was a one-time thing and I could break it down into smaller chunks by concatenating less than 255 characters into 3 separate columns, I did that and wrote 3 separate lookups and compared the data in 3 chunks rather than all at once. The major drawback is that I had to re-sort by the lookup table (column) I wanted to run the lookup on for each of the 3 sub groups before running each lookup.
Id call my solution perfectly acceptable for a onetime thing, but if I had to do it more than once, I'd look for something more efficient.