Excel относительные ссылки в макросах excel

Хитрости »

19 Февраль 2021              6712 просмотров


Использование относительных ссылок в макросах


Если Вы уже записывали макросы обработки таблиц, то наверняка сталкивались с ситуацией, когда макросом в таблицу добавляется столбец с формулами, которые потом необходимо распространить на все строки. Но если количество строк в таблице изменяется, то макрос работает некорректно: если строк стало больше, то формулы проставляются не на все строки, а если строк стало меньше – то появляются строки с лишними формулами.
Если Вы еще не знаете что такое макрос и как его записывать и воспроизводить, то рекомендуется сначала ознакомиться со статьей: Что такое макрос и где его искать?
К примеру, возьмем таблицу такого вида:
Исходная таблица
В конце таблицы нам необходимо добавить столбец «Стоимость», прописав в нем нехитрую формулу перемножения количества на цену:
=F2*G2
Перед записью макроса выделяем ячейку H1. При обычной записи макроса наши шаги такие:
1. Выделили I1
2. Записали в неё заголовок «Стоимость»
3. Перешли в I2
4. Записали формулу: =F2*G2
5. Распространили формулу до конца таблицы (через автозаполнение или путем копирования ячейки с формулой и вставки в остальные ячейки)
Макрос работает отлично. Пока количество строк не изменится. Если при записи макроса в таблице было 319 строк, а потом добавилось еще 20, то записанный макрос создаст формулу только в первых 319 строках. Все дело в том, что при обычной записи макрос использует абсолютную адресацию ячеек. Т.е. в нем каждый наш шаг обозначает выделение ячеек с конкретно указанным адресом (I1, I2, I319 и т.д.):
Пример абсолютных ссылок
Как выйти из такой ситуации? Все не слишком сложно. В группе кнопок код на вкладке Разработчик есть кнопка «Относительные ссылки». Если нажать её до записи макроса(или во время), то ссылки на ячейки будут уже запоминаться не как конкретный адрес, а как смещение относительно последней выделенной ячейки.
Например, запишем два простых макроса, которые будут делать одно и то же действие – перемещение вниз таблицы и выделение ячеек от нижней до верхней. Только первый макрос будет записан обычным способом, а перед записью второго мы нажмем кнопку «Относительные ссылки». Наши действия будут следующими (одинаковыми для обоих макросов):
1. До записи макроса выделяем ячейку I2
2. Начинаем запись макроса
3. Выделяем ячейку H2
4. Комбинацией клавиш Ctrl+↓(стрелка вниз) перемещаемся вниз таблицы
5. Стрелка вправо (т.е. выделяем последнюю ячейку в столбце I)
6. Комбинацией клавиш Ctrl+Shift+↑(стрелка вверх) выделяем столбец I от последней ячейки до первой
7. Завершаем запись макроса
Теперь можно посмотреть на код обоих макросов:
Сравнение кодов
Отличия очевидны: в первом используется обращение к ячейкам по их конкретным адресам. Во втором же все действия происходят относительно последней выделенной ячейки(на Range(«A1») не обращаем внимания – это из другой оперы и если их удалить ничего не изменится). Из этого можно сделать вывод, что для создания гибких универсальных макросов с использованием относительных ссылок необходимо как можно меньше использовать мышку и максимально стараться применять горячие клавиши. Попробую пояснить почему: когда мы применяем то же автозаполнение (наведение курсора мыши на нижний правый угол ячейки и протягивание вниз или двойной щелчок левой кнопкой мыши) – оно применяется к конкретно определенному количеству ячеек. Т.е. даже относительные ссылки не помогут заполнить его формулами, как того требует наша изначальная задача. Но если использовать горячие клавиши перемещения и выделения (Ctrl+стрелка и Ctrl+Shift+стрелка), то мы можем создать макрос, которому уже будет не важно сколько строк в нашей таблице. Чтобы в этом убедиться, запишем макрос из начала статьи, но уже с использованием относительных ссылок и исключительно клавиш для перемещения. Наши действия:
1. Перед записью макроса выделяем ячейку H1
2. Начали запись макроса
3. Нажимаем кнопку Относительные ссылки(если она еще не нажата)
4. Выделяем I1
5. Записываем в неё заголовок «Стоимость»
6. Переходим в I2
7. Записываем в I2 формулу: =F2*G2
8. Комбинацией клавиш Ctrl+C(или при помощи контекстного меню мыши) копируем ячейку с формулой
9. Стрелкой вправо перемещаемся в ячейку H2
10. Комбинацией клавиш Ctrl+↓(стрелка вниз) перемещаемся вниз таблицы
11. Стрелка вправо (т.е. выделяем последнюю ячейку в столбце I)
12. Комбинацией клавиш Ctrl+Shift+↑(стрелка вверх) выделяем столбец I от последней ячейки до первой
13. Комбинацией клавиш Ctrl+V вставляем скопированную формулу
14. Нажимаем Esc для сброса буфера обмена
15. Запись макроса можно завершить
Если теперь попробовать применить такой макрос к таблице, у которой строк больше или меньше, чем было при записи макроса – все пройдет идеально. Макрос создаст столбец и запишет в нем формулу только на нужное количество строк.
Более того. Если наша таблица находится уже в другом листе и даже начинается не с первой ячейки, а где-то в середине:
Хаотично расположенная таблица
Нам достаточно будет выделить ячейку заголовка последнего столбца(K5) и запустить наш макрос. Он без проблем добавит столбец с формулой в нужном месте и на все строки. Макрос же без использования относительных ссылок в такой ситуации спасует по полной: он создаст формулы начиная с ячейки I2 и до заголовка, только испортив таблицу и не сделав ничего полезного.
Так же хочу дополнить, что Относительные ссылки играют роль исключительно во время записи макроса. Во время воспроизведения совершенно не важно включены они или нет. Плюс можно(а иногда и нужно) комбинировать во время записи макросов режим относительных ссылок с обычным режимом. Например, когда столбцов в таблице у нас всегда одинаковое количество и таблица всегда в одном месте, и столбец мы добавляем всегда в столбец I. Но формулы при этом надо протягивать на разное количество строк. Тогда можно начать запись макроса обычным режимом, а после того, как записали название столбца — включить режим относительных ссылок, чтобы определение последней ячейки таблицы не зависело от количества строк в этой таблице.


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

We have two options to refer a cell in excel VBA Absolute references and Relative references.  Default Excel records macro in Absolute mode.

In this article, we learn about Relative references in excel VBA.  We select a cell “A1”, turn on “Use Relative Reference” and record a macro to type some text in cells B2:B4.  

Since we turn on the “Relative reference” option.  Macro considers the number of rows and number of columns from active cells.  In our example, we select cell A1 and start type B2 which is to move one column and one row from A1 (Active cell).

Implementation:

Follow the below steps to implement relative reference in Excel Macros:

Step 1: Open Excel and Select Cell “A1”.

Step 2: Go to “Developer” Tab >> Press “Use Relative References” >> Click “Record Macro” .

Step 3: Enter the Macro name “relativeReference” and Press “OK”.

Step 4: Type “Australia” in cell B2  

Step 5: Type “Brazil” in cell B3

Step 6: Type “Mexico” in cell B4

Step 7: Select cell B5 and Press “Stop Recording”  

VBA Code (Recorded):

Sub relativeReference()
    ActiveCell.Offset(1, 1).Range("A1").Select
    ActiveCell.FormulaR1C1 = "Australia"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "Brazil"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "Mexico"
    ActiveCell.Offset(1, 0).Range("A1").Select
End Sub 

Step 8: You just delete the contents in cells B2:B4, Select Cell B1.

Step 9: Go to View >> Macros >> View Macros – to popup Macro dialog box [keyboard shortcut – Alt+F8].

Step 10: Select Macro from list (eg. relativeReference) and Press “Run”.

Output:

The active cell is B1 and run the macro.  So, the outputs (C2:C4) are placed one row and one column from the active cell B1.

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

Предположим, вам необходимо проанализировать данные избирателей, собранных в 280 избирательных округах. Для каждого избирательного округа собраны следующие данные:

  • Название избирательного округа.
  • Общая численность населения в избирательном округе.
  • Количество избирателей в избирательном округе.
  • Количество избирателей мужского пола, и
  • Количество женщин-избирателей.

Данные предоставляются вам на листе, как указано ниже.

Относительные ссылки

Невозможно проанализировать данные в вышеуказанном формате. Поэтому расположите данные в таблице, как показано ниже.

Таблица

Если вы пытаетесь расположить данные в вышеуказанном формате –

  • Сбор данных из 280 избирательных округов занимает значительное время

  • Это может быть подвержено ошибкам

  • Это становится мирской задачей, не позволяющей вам сосредоточиться на технических вещах

Сбор данных из 280 избирательных округов занимает значительное время

Это может быть подвержено ошибкам

Это становится мирской задачей, не позволяющей вам сосредоточиться на технических вещах

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

Использование относительных ссылок

Чтобы сообщить макрос-рекордеру, что он должен использовать относительные ссылки, сделайте следующее:

  • Нажмите вкладку VIEW на ленте.

  • Нажмите Макросы .

  • Нажмите « Использовать относительные ссылки» .

Нажмите вкладку VIEW на ленте.

Нажмите Макросы .

Нажмите « Использовать относительные ссылки» .

Относительная ссылка

Подготовка формата данных

Первым шагом в организации приведенных выше данных является определение формата данных в таблице с заголовками.

Создайте строку заголовков, как показано ниже.

Подготовка

Запись макроса

Запишите макрос следующим образом –

  • Нажмите Запись макроса.

  • Дайте осмысленное имя, скажем, DataArrange макросу.

  • Тип = строка () – 3 в ячейке B4. Это потому, что номер S. является текущим номером строки – 3 строки над ним.

  • Разрежьте ячейки B5, B6, B7, B8 и B9 и вставьте их в ячейки C4-C8 соответственно.

  • Теперь нажмите на ячейку B5. Ваша таблица выглядит так, как показано ниже.

Нажмите Запись макроса.

Дайте осмысленное имя, скажем, DataArrange макросу.

Тип = строка () – 3 в ячейке B4. Это потому, что номер S. является текущим номером строки – 3 строки над ним.

Разрежьте ячейки B5, B6, B7, B8 и B9 и вставьте их в ячейки C4-C8 соответственно.

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

Запись макроса

Первый набор данных расположен в первой строке таблицы. Удалите строки B6 – B11 и щелкните в ячейке B5.

Первый набор данных

Вы можете видеть, что активная ячейка B5 и следующий набор данных будет размещен здесь.

Прекратите запись макроса. Ваш макрос для размещения данных готов.

Запуск макроса

Вам необходимо многократно запускать макрос, чтобы завершить размещение данных в таблице, как указано ниже.

Активная ячейка B5. Запустите макрос. Второй набор данных будет размещен во второй строке таблицы, а активной ячейкой будет B6.

Макрос Бег

Запустите макрос снова. Третий набор данных будет размещен в третьей строке таблицы, и активной ячейкой станет B7.

Запустить макрос

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

Запускайте макрос, пока все 280 наборов данных не будут объединены в 280 строк таблицы. Этот процесс занимает несколько секунд, и, поскольку шаги автоматизированы, все упражнение не содержит ошибок.

Содержание

  • 1 Параметр «Относительные ссылки»
  • 2 Просмотр кода VBA
  • 3 Запуск записанного макроса в Excel
  • 4 Ограничения
  • 5 Как поменять ссылки в формулах на абсолютные?
  • 6 Как поменять ссылки в формулах на относительные?
    • 6.1 Способ преобразования без использования макросов
  • 7 Замечания

По умолчанию, во время записи макроса, все действия по выбору ячеек и диапазонов записываются как абсолютные. Если Вы выбрали ячейку C5 и записали для нее какие-то манипуляции, то последующие воспроизведения макроса будут производить эти действия именно над этой ячейкой. Такое поведение не всегда может соответствовать имеющимся задачам.

Поэтому в приложение Excel предусмотрена специальная возможность записи макросов с относительными ссылками. Если перед запуском макрорекодера было включено данное свойство, то любые ссылки будут записываться как смещенные относительно той ячейки, которая была активна на может этого запуска. Если изначально была выделена ячейка A1, а затем выбрана ячейка C5, то в код макроса попадет такая запись:

ActiveCell.Offset(4, 2).Range("A1").Select

Она указывает приложению на необходимость выделить ячейку, смещенную на 4 строки и 2 столбца от активной на данный момент ячейки. Это значит, если при последующем выполнении макроса предварительно выделить ячейку G10, то смещенной на 4 строки и 2 столбца окажется ячейка I14.

Для активации описанного параметра перейдите на вкладку «Вид», найдите область «Макросы» и в раскрывающемся меню кликните по пункту «Относительные ссылки».

Если материалы office-menu.ru Вам помогли, то поддержите, пожалуйста, проект, чтобы мы могли развивать его дальше.

У Вас недостаточно прав для комментирования.

Простую последовательность действий, которую нужно повторить несколько раз, можно записать в виде программного кода и сохранить как макрос. Если последовательность действий записана в макрос, то выполнять её можно снова и снова, просто запуская этот макрос. Это гораздо эффективнее, чем выполнять раз за разом одни и те же действия вручную.

Чтобы записать макрос, нужно включить режим записи. Это можно сделать на вкладке Вид (View) в разделе Макросы (Macros) или в меню Сервис (Tools), если у Вас Excel 2003. Ниже на картинках показано, как выглядят эти меню.

Далее откроется диалоговое окно Запись макроса (Record Macro), как показано на картинке ниже:

как сделать относительную ссылку в excel для макроса

Здесь, по желанию, можно ввести имя и описание для макроса. Рекомендуется давать макросу такое имя, чтобы, вернувшись к нему спустя некоторое время, можно было без труда понять, для чего этот макрос нужен. Так или иначе, если не ввести для макроса имя, то Excel автоматически назовёт его Макрос1, Макрос2 и так далее.

Здесь же можно назначить сочетание клавиш для запуска записанного макроса. Запускать макрос таким способом будет значительно проще. Однако будьте осторожны! Если случайно назначить для макроса одно из предустановленных клавиатурных сочетаний Excel (например, Ctrl+C), то в дальнейшем макрос может быть запущен случайно.

Когда макросу дано подходящее имя и (при желании) задано сочетание клавиш, нажмите ОК, чтобы запустить запись макроса. С этого момента каждое действие (ввод данных, выделение ячеек, изменение формата ячеек, пролистывание листа и так далее) будет записано в макрос и сохранено в виде кода VBA.

При включении режима записи макроса в строке состояния (внизу слева) появляется кнопка Стоп. В Excel 2003 эта кнопка находится на плавающей панели инструментов.

Нажмите Стоп, когда выполните все действия, которые должны быть записаны в макрос. Теперь код записанного макроса сохранён в модуле редактора Visual Basic.

Параметр «Относительные ссылки»

Если перед началом записи макроса включить параметр Относительные ссылки (Use Relative References), то все ссылки в записываемом макросе будут создаваться как относительные. Если же параметр выключен, то при записи макроса будут создаваться абсолютные ссылки (подробнее об этих двух типах ссылок можно узнать в статьях, посвящённых теме ссылок на ячейки в Excel).

Параметр Относительные ссылки (Use Relative References) находится в разделе Макросы (Macros) на вкладке Вид (View). В Excel 2003 этот параметр расположен на плавающей панели инструментов.

Просмотр кода VBA

Код VBA, записанный в макрос, размещается в модуле, который можно просмотреть в редакторе Visual Basic. Редактор можно запустить нажатием Alt+F11 (одновременное нажатие клавиш Alt и F11).

Код находится в одном из модулей, которые расположены в окне Project слева от области редактирования. Если дважды кликнуть по Module1 в окне Project, то справа появится код записанного макроса.

Записывая макрос, Excel всегда создаёт процедуру Sub (не Function). Если при создании макроса к нему было прикреплено сочетание клавиш, то именно с его помощью запустить макрос будет проще всего. Существует и другой способ запустить макрос:

  • Нажмите Alt+F8 (одновременно нажмите клавиши Alt и F8);
  • В появившемся списке макросов выберите тот, который нужно запустить;
  • Нажмите кнопку Выполнить (Run).

Ограничения

Инструмент Excel для записи макросов – это очень простой способ создавать код VBA, но подходит он только для создания самых простых макросов. Дело в том, что этот инструмент не умеет использовать многие возможности VBA, такие как:

  • Константы, переменные и массивы;
  • Выражения IF;
  • Циклы;
  • Обращения к встроенным функциям или внешним процедурам.

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

Автоматическое создание кода VBA в Excel отлично работает для простых макросов, но если нужно построить более сложный макрос, то придётся научиться писать код VBA самостоятельно. Тем не менее, запись макроса в Excel – это отличны инструмент, при помощи которого можно создавать первоначальный код, а в дальнейшем исправлять или вставлять его в более сложные макросы.

Урок подготовлен для Вас командой сайта office-guru.ru
Источник: /> Перевел: Антон Андронов

Правила перепечаткиЕще больше уроков по Microsoft Excel

Оцените качество статьи. Нам важно ваше мнение:

Разберемся как сделать все ссылки абсолютными, относительными или смешанными в диапазоне ячеек в Excel, а не только для одной конкретной ссылки в формуле.

Приветствую всех, дорогие читатели блога TutorExcel.Ru.

Как мы уже хорошо знаем всего в Excel выделяют 3 типа ссылок: относительные (А1), абсолютные ($А$1) и смешанные ($А1 и А$1).
Применение каждого из типов имеет свой смысл и определенные преимущества, поэтому зачастую бывает полезно в формулах заменить все относительные ссылки на абсолютные (или наоборот), к примеру, часто может пригодиться при копировании диапазона ячеек.

Поменять тип для конкретной ссылки в ячейке можно с помощью клавиши F4.
Для этого выделяем ссылку в формуле (либо на ячейку, либо на диапазон ячеек) и поочередно нажимаем F4, в результате ссылки будут меняться в порядке A1 -> $A$1 -> $A1 -> A$1. Затем останавливаемся на нужном шаге и задача смены типа решена.

Однако как это нередко случается в Excel, что удобно сделать 1 раз, не совсем удобно делать десятки, а то и сотни раз.
Так с помощью клавиши F4 мы сможем быстро изменить тип для одной ссылки, но никак не для большого диапазона ячеек с данными.

Поэтому чтобы проделать эту операцию вручную для множества ссылок потребуется другой способ (представьте сколько у вас займет времени поменять ссылки в 100 ячейках), в связи с чем обратимся к помощи макроса, который автоматизирует процесс и существенно ускорит время выполнения работы.

Как поменять ссылки в формулах на абсолютные?

Алгоритм действия макроса построим по следующему принципу: мы заходим в каждую ячейку диапазона, где содержится формула, а далее преобразовываем ссылку в нужный нам вид.
На словах все выглядит просто, давайте перейдем к реализации алгоритма.

Переходим в редактор VBA (для быстрого перехода нажимаем Alt + F11), создаем новый модуль (щелкаем правой кнопкой мыши в панели проектов и выбираем Insert -> Module) и добавляем туда код макроса:

Sub ChangeCellStyleInFormulas()

    Dim MyCell As Range

    On Error Resume Next ‘Обработка ошибки, если рассматриваемый диапазон ячеек не содержит формул

    For Each MyCell In Selection.SpecialCells(xlCellTypeFormulas) ‘Цикл для каждой ячейки диапазона содержащая формулу

        MyCell.Formula = Application.ConvertFormula(MyCell.Formula, xlA1, xlA1, xlAbsolute) ‘Меняем тип ссылки

    Next

End Sub

Попробуем проверить работу макроса на простой таблице с формулами:

как сделать относительную ссылку в excel для макроса
Выделяем диапазон ячеек с таблицей (в нашем случае это диапазон F6:J10) и запускаем макрос ChangeCellStyleInFormulas (в панели вкладок выбираем Разработчик -> Макросы (или нажимаем Alt + F8), далее находим нужный макрос и жмем Выполнить):

как сделать относительную ссылку в excel для макроса
Все получилось, ссылки в таблице из относительных преобразовались в абсолютные.

Теперь рассмотрим другие случаи, когда в конечном результате нужны уже не абсолютные, а относительные или смешанные ссылки.

Как поменять ссылки в формулах на относительные?

За преобразование формулы в макросе отвечает функция ConvertFormula, в которой один из параметров задает тип ссылки:

  • xlAbsolute. Абсолютная ($А$1);
  • xlRelative. Относительная (А1);
  • xlAbsRowRelColumn. Смешанная. Абсолютная строка и относительный столбец (А$1);
  • xlRelRowAbsColumn. Смешанная. Относительная строка и абсолютный столбец ($А1).

Поэтому вместо xlAbsolute в коде макроса можно поставить любой из выше перечисленных параметров, в зависимости от того, что конкретно вам нужно.

Например, для той же таблицы применим макрос с параметром xlAbsRowRelColumn (абсолютная строка и относительный столбец, вид A$1):

как сделать относительную ссылку в excel для макроса
И для параметра xlRelRowAbsColumn (относительная строка и абсолютный столбец, вид $A1):

как сделать относительную ссылку в excel для макроса
Таким образом, меняя значения параметра в макросе можно получить абсолютно любой тип ссылки.

Способ преобразования без использования макросов

Если не хочется возиться с макросами, то преобразовать все ссылки в формулах в относительные также можно и без их применения.

Действительно, так как признаком абсолютной или смешанной ссылки является наличие в формуле знака $ (который используется для закрепления строки или столбца), то с помощью инструмента Найти и заменить можно избавиться от всех знаков $ в формулах.

Выделяем диапазон с данными, нажимаем Ctrl + H, в поле Найти указываем знак доллара, а поле Заменить на оставляем пустым, нажимаем Заменить все и получаем нужный результат:

как сделать относительную ссылку в excel для макроса

Замечания

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

Спасибо за внимание!
Если у вас есть мысли или вопросы по теме статьи — пишите в комментариях.

Удачи вам и до скорых встреч на страницах блога TutorExcel.Ru!

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Как заменить абсолютную ссылку типа   fName = «C:UsersAnatoliyDesktopБаза HRШаблон для заявки на подбор.xlt» на относительную. Все файлы находятся в папке «База HR». Нужно чтобы база работала независимо от места её расположения.: с флешки, с другого диска, из дропбокса, на другом компе.  В загруженном файле такая ссылка используется в макросе «Копирование списка». Спасибо.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

У вас же в прошлой теме в этом файле был диалог выбора открываемого файла,
почему ушли от этого

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Я  не ушёл. В прошлой теме я остальные макросы удалил для ясности и оставил только макрос с проблемой. Та проблема решилась с помощью форума и теперь остался последний вопрос со ссылками.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#4

25.12.2016 18:52:00

Я обычно использую диалог выбора файла

Код
Application.FileDialog(msoFileDialogFilePicker)

Там можно прописать путь к вашей папке InitialFileName =
И при открытии окна будет сразу открываться эта папка

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Да, видимо я не ясно задал вопрос.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

Задайте ясно.
Подошел ли вам вариант, который я указал в прошлой теме?

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

В макросах есть абсолютные ссылки и чтобы файл работал будучи перенесённым с его папкой в другое место, нужно поменять эти ссылки на соответствующие этому новому месту. Нельзя ли уйти от этой проблемы применением относительных ссылок привязанных к этой папке? Чтобы не нужно было менять пути в макросе.

 

marchenkoan

Пользователь

Сообщений: 59
Регистрация: 18.07.2016

#8

25.12.2016 21:02:48

Добрый вечер.
Попробуйте так

Код
  fName = ThisWorkbook.Path & "База HRШаблон заявки на подбор.xlt"  'Ïóòü ê ôàéëó øàáëîíà çàÿâêè íà ïîäáîð
 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Я сделал так:  fName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, «Шаблон заявки на подбор.xlt») В двух файлах с абсолютно одинаковым текстом макросов. В одном (Список кандидатов) он работает в другом не находит файла»Шаблон заявки на подбор» . Все три файла лежат рядом в одной папке. В файле «Шаблон анкеты кандидата1» два макроса написаны с одинаковой относительной ссылкой, во втором макросе она работае, а в первом нет. Как это может быть? Где я чего не вижу? Помогите!
При вашем варианте

marchenkoan

результат тот же — не видит файла.

Файлы удалены: превышение допустимого размера вложения [МОДЕРАТОР]

Изменено: su6026.12.2016 15:35:12

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Видимо никто не сталкивался с такой проблемой.

 

Игорь

Пользователь

Сообщений: 3631
Регистрация: 23.12.2012

после строки кода
fName = … ‘ тут что-то с относительными ссылками

добавьте строку
msgbox  fName

и будет выскакивать окно с полным путем к файлу
потом проверяете, есть ли такие папки / подпапки / файлы на компе
и сразу поймете причину проблемы

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Игорь, если пошагово проверять макрос,то и так окошко выскакивает и видно, что вместо полного пути там только имя файла, т е  макрос думает, что это имя корня и понятно не находит файл. Если поставить перед именем файла обратный слеш и сохранить и  не закрывая файла выполнить макрос, то всё ОК. Макрос выпоняется, путь распознаётся и пишется полный. Но стоит закрыть файл — всё та же петрушка, хоть со слешем, хоть без него. В инете нашёл штук пять разных вариантов прописи относительной ссылки и все работают одинаково как описано выше. Может что-то с настройками компа или excel? Ну не может же быть чтобы вообще нельзя было пользоваться относительными ссылками.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#13

26.12.2016 16:19:17

У вас же все книги в одной папке, поэтому

Код
fName = ThisWorkbook.Path & "Шаблон заявки на подбор.xlt"
 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Да я пробовал и эту формулу, результат тот же. Но не всё так темно как раньше. Сейчас я выяснил вот что. Приложенный файл (он же и проблемный) когда открывается, то открывается он уже под именем «Шаблон анкеты кандидата 1». Создаёт новый файл, чтобы не испортить сам шаблон. И макрос не может прописать полный путь из относительной ссылки и найти файл. А вот если не закрывая файл нажать «сохранить» и сохранить его в виде того же шаблона без единицы n t вернуть ему начальное имя, то всё работает замечательно. И ваш вариант Kuzmich тоже работет прекрасно. Маккрос почему-то не может прописать полный путь к другому файлу в этой же папке, если файл в котором он сидит меняет своё имя. Этот же маккрос с относительными адресами норм работает в другом файле, но этот другой (Список кандидатов) не меняет своего имени при открытии.  

Изменено: su6026.12.2016 17:12:20

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#15

26.12.2016 17:22:55

Цитата
Создаёт новый файл, чтобы не испортить сам шаблон

Переименуйте шаблон в .xls и открывайте его в режиме только чтение (чтобы не испортить).
Я вот только не нашел в шаблоне именованных диапазонов, из которых вы берете данные
в массив

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Мне кажется у меня есть мысль получше, только подскажите пож как её реализовать.

Сразу после открытия шаблона создаётся новый файли конечно же он пока не в этой папке, а где-то в регистре Excel, поэтому он и не может прописать путь от какой-то там папки. Его надо сразу после открытия сохранить, (он окажется в нужной папке и сможет прописать полный путь) и потом выполнять все остальные макросы. А вот каким кодом его сразу после открытия сохранить я не знаю, потому что ещё не волшебник, а только учусь. Может кто подскажет? Т е сразу после открытия файла егонадо сохранить.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#17

26.12.2016 17:35:16

Цитата
Т е сразу после открытия файла егонадо сохранить.

Не надо вам его сохранять. Вам надо из него скопировать диапазон в массив и закрыть, не сохраняя.

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#18

26.12.2016 17:36:39

Цитата
su60 написал:
Маккрос почему-то не может прописать полный путь к другому файлу в этой же папке, если файл в котором он сидит меняет своё имя

При использовании шаблона происходит не открытие существующей книги, а создается новая, на основании выбранного шаблона. И как всякая вновь созданная книга, она имеет только имя. Так откуда же взять путь к этому файлу?
Если вам нужны в шаблоне макросы, сохраняйте сего как xlsm, при открытии сохраняйте как (SaveAs) с нужныь именем, и с этим файлом работайте. У него путь будет.

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Да вы правы. Но для сохранения потребуется абсолютный путь. А изначально задача стояла отвязаться от абсолютных ссылок, чтобы база могла работать из любого места куда её ни положи, хоть с флешки. Но пока похоже задачка решения не имеет.

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Kuzmich, вы правы, но тогда путь к файлу в который мы помещаем скопированный диапазон должен быть абсолютным. А это уже выходит за рамки поставленной задачи. Или может я чего-то не так понимаю?

Изменено: su6026.12.2016 17:47:30

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#21

26.12.2016 18:10:28

Цитата
su60 написал:
Или может я чего-то не так понимаю?

Вот я я тоже.
вариант из #18 будет работать из любого места.
Если так люб шаблон, привязывайтесь а адресу книги «Список кандидатов.xlsm»

Код
   On Error Resume Next
    fName = Workbooks("Список кандидатов.xlsm").Path & "Шаблон анкеты1.xltm"
 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

А, если сразу открыть оба файла, и в коде макроса к шаблону «Шаблон заявки на подбор.xlt»
обращаться как
Set WB_template =Workbooks(«Шаблон заявки на подбор1»)

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

RAN, посмотрите пож в приложении. Я что-то не так сделал. Не работает. (out of range)

Изменено: su6026.12.2016 18:49:34

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Kuzmich, лучше в тексте кода пометьте, я пока не очень. Спасибо.  

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Куда-то файл с кодом пропал. Ещё разок.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#26

26.12.2016 19:15:59

Попробуйте так, в коде файл открывать не надо, закомментируйте эти строки

Код
Dim WB_template As Workbook
   Set WB_template = Workbooks("Шаблон заявки на подбор1")
     sAdress = "Должность[Должность]"                     'указываем диапазон
    vData = WB_template.Sheets("Списки").Range(sAdress).Value 'получаем значение указанного диапазона
 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Выбрасывает окно Run-Time Error 9 (out of range) и помечает жёлтым строку.

Прикрепленные файлы

  • Ji.PNG (52.1 КБ)

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

Так вы запустили этот файл . (Оба файла должны быть открыты)

 

su60

Пользователь

Сообщений: 40
Регистрация: 04.09.2015

Да, оба открыты.

Изменено: su6026.12.2016 19:44:03

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#30

26.12.2016 19:54:16

Открытый файл «Шаблон заявки на подбор» , с какой цифрой в окне Excel ?

Like this post? Please share to your friends:
  • Excel относительная ссылка на ячейку диапазон
  • Excel относительная ссылка на столбец
  • Excel относительная ссылка на лист в формуле
  • Excel относительная ссылка на другой файл
  • Excel относительная ссылка на документ