2016-04-22 2 views
0

У меня есть книга, содержащая множество листов, одна из которых является, по существу, листом входа. Каждая строка имеет ячейку «Имя», которая имеет раскрывающийся список «Проверка данных», который ссылается на отдельный лист «Список заполняющих». Смежные ячейки затем используют VLOOKUP, ссылаясь на ячейку Name и выбирают нужные значения (ID, номер телефона и т. Д.). Это работает очень хорошо.Ссылка на относительную прокрутку двигателя?

У меня есть макрос, который разбивает книгу на отдельные рабочие листы. Легкий способ поставить это вместо того, чтобы я отправлял электронную почту всей книге, я просто разделил ее и отправил по электронной почте лист входа. Чтобы облегчить ссылку со входа в листинге на лист, я скопировал листок списков листов в новую книгу «Вход в листы».

... 
xWs.Copy 
Application.ActiveWorkbook.SaveAs Filename:=xPath & "\" & xWs.Name & ".xlsm", FileFormat:=52 
... 
masterWB.Sheets("List Filler").Copy Before:=newWB.Sheets(1) 
... 

Когда я открываю новую книгу, как лист, так и лист ввода видимы, как и ожидалось. Однако ссылки ВПР и ссылка проверки данных Источник все точки на главной книге:

проверки данных Источник изменен:

='[workbookname.xlsm]List Filler'!#REF! 

ВПР изменено на:

=IFERROR(VLOOKUP(O14,'[workbookname.xlsm]List Filler'!A:M,12,FALSE),"") 

Так ВПР поддерживается его ссылка, но полностью указана в листе списка наполнителей в основной книге.

В принципе, у меня есть 2 проблемы.

1) Ссылка VLOOKUP должна относительно ссылаться на лист наполнителя списка, а не искать его в основной книге. Я мог бы исправить это с помощью специальной функции (как это сделать в другом месте), но исправить здесь, вероятно, то же самое, что и для (2), что и является калечащим меня.

2) Ссылка источника данных Проверка должна быть направлена ​​к «локальному» листу списка листов, а не оригиналу в основной книге.

Любая помощь по этому вопросу будет принята с благодарностью. Если какое-либо разъяснение необходимо, просто сообщите мне, и я также с удовольствием предоставил дополнительные фрагменты кода, если это необходимо.

Спасибо!

Редактировать 1: Чтобы добавить, я хочу, чтобы ссылка на список Filler была «локальной», потому что листок ввода в конечном итоге будет перемещен/скопирован обратно в основную книгу. Лист входа переходит из основной книги в отдельную, а затем обратно к главному, все время, когда ему нужен доступ к листу списка заполнений, который всегда будет существовать как список Filler в любом листе входа в книгу. Как и мы делаем $ A $ 1, чтобы ВСЕГДА ссылаться на А1, я хочу сделать «$ List Filler», если это имеет смысл.

+0

Для второй проблемы вы можете найти find-replace на «[workbookname.xlsm]» и заменить ее на «» – OpiesDad

+0

. Для первого я бы поиграл с названием номера в основной книге, а затем удалив названный диапазон в новой книге и добавление нового в новую книгу с тем же именем. Затем используйте именованный диапазон в валидации данных вместо перечисления ячеек. Я не знаю, будет ли это работать, но стоит попробовать. – OpiesDad

+0

Это может вызвать предупреждение, которое выдается при копировании ... что-то вроде «Вы хотите использовать именованный диапазон из начальной книги», но вы, вероятно, могли бы подавить предупреждение, а затем справиться с ним. – OpiesDad

ответ

0

Проводка от имени @OpiesDad

Вместо ссылки на диапазон, как:

'List Filler'!A:M 

или что-то подобное, определить именованный диапазон, который предотвратит привязку внешней книги до тех пор, как ссылка существует локально, как объясняется в задаче.

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

Tablename[[SomeVar:AnotherVar]] 

Это позволяет добавлять записи к списку проверки данных, не подвергая риску пустые пробелы или пропущенные данные.

0

Одна из идей - заменить ссылки в новой книге. Так что это может сработать, новая книга должна быть сохранена. Если книга сохранена, вы можете сказать, что она сохранена.

masterWB.Sheets("List Filler").Copy Before:=newWB.Sheets(1) 
    ... 
    newWB.Saved = True 
    newWB.ChangeLink Name:=masterWB.Name, NewName:=newWB.Name, Type:=xlExcelLinks 
    newWB.Saved = False 

Это отлично работает для меня на Excel2013.

Смежные вопросы