Запуск макроса на основе похожих имен вкладок - PullRequest
4 голосов
/ 01 апреля 2020

SS

Я пытался использовать решение, предоставленное CLR , однако использование INDIRECT замедляет мою рабочую книгу и в конечном итоге приводит к ее зависанию. Есть ли обходной путь, который не использует INDIRECT (который является изменчивой функцией)?

В настоящее время я использую его для большого количества ячеек (мы рассматриваем тысячи), есть ли его замена?

У меня есть следующие вкладки:

001, 002, 003, Assessment Form 001, Assessment Form 002, Assessment Form 003

Я бы хотел, чтобы вкладка для Assessment Form 001 выполняла просмотр данных, доступных в 001; и так далее (например, Assessment Form 002 vlookup от 002, Assessment Form 003 vlookup от 003).

Так что, если имя вкладки для Assessment Form 001 содержит 001, тогда Посмотрите на вкладку, которая 001, et c et c.

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

Я отвечаю на ваш вопрос:

... Есть ли обходной путь, который не использует INDIRECT (который является изменчивой функцией)?

Или ... есть ли его замена? (перефразировано)

Вы можете использовать VBA. Следующая функция работала для меня

Public Function shifted_lookup(lookup_value As Variant, table_array As Range, column_index As Integer, range_lookup As Integer) As Variant
    Dim curr_wsname As String, oth_wsname As String
    Dim curr_ws As Worksheet, oth_ws As Worksheet
    Set curr_ws = ActiveSheet
    curr_wsname = curr_ws.Name
    oth_wsname = Right(curr_wsname, 3)
    Set oth_ws = Worksheets(oth_wsname)
    Dim src_rng_base As String, src_rng As Range
    src_rng_base = table_array.Address
    Set src_rng = oth_ws.Range(src_rng_base)
    Dim aux As Variant
    shifted_lookup = Application.WorksheetFunction.VLookup(lookup_value, src_rng, column_index, range_lookup)
End Function

Пример, который я использовал для тестирования (у меня Excel в испанском sh):

enter image description here enter image description here

Формулы:

B1: =shifted_lookup(A1,$A$1:$B$6,2,1)
B2: =shifted_lookup(A2,$A$1:$B$6,2,0)
B3: =shifted_lookup(A3,$A$1:$B$6,2,1)
B4: =shifted_lookup(A4,$A$1:$B$6,2,0)
B5: =shifted_lookup(A5,$A$1:$B$6,2,1)

Примечания:

  1. Я бы не знал о производительности или возможных зависаниях, я не настроил " testbed "для этого.

  2. Вы можете использовать range_lookup As Integer в качестве необязательного параметра, аналогично VLOOKUP.

  3. Вы можете немного укоротить функцию, убрав несколько промежуточных переменных. Они были определены для упрощения автозаполнения, написания кода и отладки. Я не думаю, что это поможет каким-либо образом.

2 голосов
/ 01 апреля 2020

Ввод следующей формулы на любом листе даст вам последние 3 символа имени этого листа.

=RIGHT(MID(CELL("filename",$A$1),FIND("]",CELL("filename",$A$1))+1,255),3)

Итак, комбинируя это с функцией INDIRECT, вы можете сделать это:

=VLOOKUP(lookupvalue,INDIRECT(RIGHT(MID(CELL("filename",$A$1),FIND("]",CELL("filename",$A$1))+1,255),3)&"!A:B"),2,0)

Где lookupvalue - это то, что вы ищете, а A:B - диапазон на листах 001,002 и c. что вы выполняете поиск.


Просто добавьте к вышесказанному для будущих исследователей - функция CELL("filename"), как указано выше, будет работать только после сохранения файла. один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...