У меня возникли проблемы с моей большой таблицей. Я добавляю много необработанных данных в таблицу данных, а затем делаю несколько поисков по данным. Используя встроенные функции, я придумал
=IF(ISNA(INDEX(Data!$L$7:$L$1100,MATCH(Data!$I$2&$B$199&$B29&Data!$J$5,Data!$K$7:$K$1100&Data!$J$7:$J$1100&Data!$I$7:$I$1100&Data!$N$7:$N$1100,0))),"0",INDEX(Data!$L$7:$L$1100,MATCH(Data!$I$2&$B$199&$B29&Data!$J$5,Data!$K$7:$K$1100&Data!$J$7:$J$1100&Data!$I$7:$I$1100&Data!$N$7:$N$1100,0)))
Не красиво! По сути, он выполняет один и тот же поиск дважды, беря 4 переменные и сопоставляя их с 4 сцепленными массивами, а затем использует точку в качестве индекса для требуемого значения.
У меня есть 8 из них (немного разные) в каждом ряду из 4 листов и 96 рядов на каждом листе. Редактировать их - это боль!
Из-за огромного роста набора данных в этом месяце внешние полосы (x1100) были превзойдены (извлеченный урок, больших никогда не бывает достаточно). К сожалению, ограничения функции не позволят мне использовать L: L или что-нибудь полезное.
Я пытался переписать код как пользовательскую функцию, в которой я могу передать 4 переменные и получить ответ, но потерпел неудачу при объединении массивов.
Я дал диапазоны, перечисленные выше, в исходных именах функций, чтобы упростить задачу (и расширил их, чтобы использовать гораздо более широкие значения диапазонов), чтобы я мог переписать все функции, чтобы использовать только именованные диапазоны, но это все же оставляет меня в покое, если мне нужно изменить код.
Вот что у меня есть:
Function Windows_Util(itma As String, env As String)
v = "Windows Server" & env & itma & ""
r = Concat(Range("Utilchassis"))
r = r & Concat(Range("Utilenv"))
r = r & Concat(Range("UtilITMA"))
r = r & Concat(Range("UtilOS"))
m = WorksheetFunction.Match(v, r, 0)
i = WorksheetFunction.Index(Range("Utilavg"), m)
If WorksheetFunction.IsNA(i) Then
Windows_Util = 0
Else
Windows_Util = i
End If
End Function
Function Concat(myRange As Range, Optional myDelimiter As String)
Dim r As Range
Application.Volatile
For Each r In myRange
If Len(r.Text) Then
Concat = Concat & IIf(Concat <> "", myDelimiter, "") & r.Text
End If
Next
End Function
Это не работает! Он не только неправильно соединяется (каждый диапазон объединяется отдельно, а не объединяется строка за строкой), ему не нравится какой-либо тип в одном из запросов. (отладка этих вещей не легка, поскольку функция фактически завершается (в ней нет синтаксических ошибок), поэтому я не могу использовать встроенные пошаговые инструкции.
Любая помощь с благодарностью.
Надеюсь, я дал достаточно подробностей, чтобы понять, что я пытаюсь сделать.
Приветствия
Стив