Хитрости »
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 автоматически назовёт его Макрос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 |
Попробуем проверить работу макроса на простой таблице с формулами:
Выделяем диапазон ячеек с таблицей (в нашем случае это диапазон F6:J10) и запускаем макрос ChangeCellStyleInFormulas (в панели вкладок выбираем Разработчик -> Макросы (или нажимаем Alt + F8), далее находим нужный макрос и жмем Выполнить):
Все получилось, ссылки в таблице из относительных преобразовались в абсолютные.
Теперь рассмотрим другие случаи, когда в конечном результате нужны уже не абсолютные, а относительные или смешанные ссылки.
Как поменять ссылки в формулах на относительные?
За преобразование формулы в макросе отвечает функция ConvertFormula, в которой один из параметров задает тип ссылки:
- xlAbsolute. Абсолютная ($А$1);
- xlRelative. Относительная (А1);
- xlAbsRowRelColumn. Смешанная. Абсолютная строка и относительный столбец (А$1);
- xlRelRowAbsColumn. Смешанная. Относительная строка и абсолютный столбец ($А1).
Поэтому вместо xlAbsolute в коде макроса можно поставить любой из выше перечисленных параметров, в зависимости от того, что конкретно вам нужно.
Например, для той же таблицы применим макрос с параметром xlAbsRowRelColumn (абсолютная строка и относительный столбец, вид A$1):
И для параметра xlRelRowAbsColumn (относительная строка и абсолютный столбец, вид $A1):
Таким образом, меняя значения параметра в макросе можно получить абсолютно любой тип ссылки.
Способ преобразования без использования макросов
Если не хочется возиться с макросами, то преобразовать все ссылки в формулах в относительные также можно и без их применения.
Действительно, так как признаком абсолютной или смешанной ссылки является наличие в формуле знака $ (который используется для закрепления строки или столбца), то с помощью инструмента Найти и заменить можно избавиться от всех знаков $ в формулах.
Выделяем диапазон с данными, нажимаем Ctrl + H, в поле Найти указываем знак доллара, а поле Заменить на оставляем пустым, нажимаем Заменить все и получаем нужный результат:
Замечания
Будьте внимательны при работе с формулами массива, после работы макроса они превращаются в обычные и могут вернуть значение ошибки. Также из-за особенностей VBA макрос может некорректно обрабатывать большие по объему формулы.
Спасибо за внимание!
Если у вас есть мысли или вопросы по теме статьи — пишите в комментариях.
Удачи вам и до скорых встреч на страницах блога TutorExcel.Ru!
su60 Пользователь Сообщений: 40 |
Как заменить абсолютную ссылку типа fName = «C:UsersAnatoliyDesktopБаза HRШаблон для заявки на подбор.xlt» на относительную. Все файлы находятся в папке «База HR». Нужно чтобы база работала независимо от места её расположения.: с флешки, с другого диска, из дропбокса, на другом компе. В загруженном файле такая ссылка используется в макросе «Копирование списка». Спасибо. |
Kuzmich Пользователь Сообщений: 7998 |
У вас же в прошлой теме в этом файле был диалог выбора открываемого файла, |
su60 Пользователь Сообщений: 40 |
Я не ушёл. В прошлой теме я остальные макросы удалил для ясности и оставил только макрос с проблемой. Та проблема решилась с помощью форума и теперь остался последний вопрос со ссылками. |
Kuzmich Пользователь Сообщений: 7998 |
#4 25.12.2016 18:52:00 Я обычно использую диалог выбора файла
Там можно прописать путь к вашей папке InitialFileName = |
||
su60 Пользователь Сообщений: 40 |
Да, видимо я не ясно задал вопрос. |
Kuzmich Пользователь Сообщений: 7998 |
Задайте ясно. |
su60 Пользователь Сообщений: 40 |
В макросах есть абсолютные ссылки и чтобы файл работал будучи перенесённым с его папкой в другое место, нужно поменять эти ссылки на соответствующие этому новому месту. Нельзя ли уйти от этой проблемы применением относительных ссылок привязанных к этой папке? Чтобы не нужно было менять пути в макросе. |
marchenkoan Пользователь Сообщений: 59 |
#8 25.12.2016 21:02:48 Добрый вечер.
|
||
su60 Пользователь Сообщений: 40 |
Я сделал так: fName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, «Шаблон заявки на подбор.xlt») В двух файлах с абсолютно одинаковым текстом макросов. В одном (Список кандидатов) он работает в другом не находит файла»Шаблон заявки на подбор» . Все три файла лежат рядом в одной папке. В файле «Шаблон анкеты кандидата1» два макроса написаны с одинаковой относительной ссылкой, во втором макросе она работае, а в первом нет. Как это может быть? Где я чего не вижу? Помогите! marchenkoan результат тот же — не видит файла. Файлы удалены: превышение допустимого размера вложения [МОДЕРАТОР] Изменено: su60 — 26.12.2016 15:35:12 |
su60 Пользователь Сообщений: 40 |
Видимо никто не сталкивался с такой проблемой. |
Игорь Пользователь Сообщений: 3631 |
после строки кода добавьте строку и будет выскакивать окно с полным путем к файлу |
su60 Пользователь Сообщений: 40 |
Игорь, если пошагово проверять макрос,то и так окошко выскакивает и видно, что вместо полного пути там только имя файла, т е макрос думает, что это имя корня и понятно не находит файл. Если поставить перед именем файла обратный слеш и сохранить и не закрывая файла выполнить макрос, то всё ОК. Макрос выпоняется, путь распознаётся и пишется полный. Но стоит закрыть файл — всё та же петрушка, хоть со слешем, хоть без него. В инете нашёл штук пять разных вариантов прописи относительной ссылки и все работают одинаково как описано выше. Может что-то с настройками компа или excel? Ну не может же быть чтобы вообще нельзя было пользоваться относительными ссылками. |
Kuzmich Пользователь Сообщений: 7998 |
#13 26.12.2016 16:19:17 У вас же все книги в одной папке, поэтому
|
||
su60 Пользователь Сообщений: 40 |
Да я пробовал и эту формулу, результат тот же. Но не всё так темно как раньше. Сейчас я выяснил вот что. Приложенный файл (он же и проблемный) когда открывается, то открывается он уже под именем «Шаблон анкеты кандидата 1». Создаёт новый файл, чтобы не испортить сам шаблон. И макрос не может прописать полный путь из относительной ссылки и найти файл. А вот если не закрывая файл нажать «сохранить» и сохранить его в виде того же шаблона без единицы n t вернуть ему начальное имя, то всё работает замечательно. И ваш вариант Kuzmich тоже работет прекрасно. Маккрос почему-то не может прописать полный путь к другому файлу в этой же папке, если файл в котором он сидит меняет своё имя. Этот же маккрос с относительными адресами норм работает в другом файле, но этот другой (Список кандидатов) не меняет своего имени при открытии. Изменено: su60 — 26.12.2016 17:12:20 |
Kuzmich Пользователь Сообщений: 7998 |
#15 26.12.2016 17:22:55
Переименуйте шаблон в .xls и открывайте его в режиме только чтение (чтобы не испортить). |
||
su60 Пользователь Сообщений: 40 |
Мне кажется у меня есть мысль получше, только подскажите пож как её реализовать. Сразу после открытия шаблона создаётся новый файли конечно же он пока не в этой папке, а где-то в регистре Excel, поэтому он и не может прописать путь от какой-то там папки. Его надо сразу после открытия сохранить, (он окажется в нужной папке и сможет прописать полный путь) и потом выполнять все остальные макросы. А вот каким кодом его сразу после открытия сохранить я не знаю, потому что ещё не волшебник, а только учусь. Может кто подскажет? Т е сразу после открытия файла егонадо сохранить. |
Kuzmich Пользователь Сообщений: 7998 |
#17 26.12.2016 17:35:16
Не надо вам его сохранять. Вам надо из него скопировать диапазон в массив и закрыть, не сохраняя. |
||
RAN Пользователь Сообщений: 7091 |
#18 26.12.2016 17:36:39
При использовании шаблона происходит не открытие существующей книги, а создается новая, на основании выбранного шаблона. И как всякая вновь созданная книга, она имеет только имя. Так откуда же взять путь к этому файлу? |
||
su60 Пользователь Сообщений: 40 |
Да вы правы. Но для сохранения потребуется абсолютный путь. А изначально задача стояла отвязаться от абсолютных ссылок, чтобы база могла работать из любого места куда её ни положи, хоть с флешки. Но пока похоже задачка решения не имеет. |
su60 Пользователь Сообщений: 40 |
Kuzmich, вы правы, но тогда путь к файлу в который мы помещаем скопированный диапазон должен быть абсолютным. А это уже выходит за рамки поставленной задачи. Или может я чего-то не так понимаю? Изменено: su60 — 26.12.2016 17:47:30 |
RAN Пользователь Сообщений: 7091 |
#21 26.12.2016 18:10:28
Вот я я тоже.
|
||||
Kuzmich Пользователь Сообщений: 7998 |
А, если сразу открыть оба файла, и в коде макроса к шаблону «Шаблон заявки на подбор.xlt» |
su60 Пользователь Сообщений: 40 |
RAN, посмотрите пож в приложении. Я что-то не так сделал. Не работает. (out of range) Изменено: su60 — 26.12.2016 18:49:34 |
su60 Пользователь Сообщений: 40 |
Kuzmich, лучше в тексте кода пометьте, я пока не очень. Спасибо. |
su60 Пользователь Сообщений: 40 |
Куда-то файл с кодом пропал. Ещё разок. |
Kuzmich Пользователь Сообщений: 7998 |
#26 26.12.2016 19:15:59 Попробуйте так, в коде файл открывать не надо, закомментируйте эти строки
|
||
su60 Пользователь Сообщений: 40 |
Выбрасывает окно Run-Time Error 9 (out of range) и помечает жёлтым строку. Прикрепленные файлы
|
Kuzmich Пользователь Сообщений: 7998 |
Так вы запустили этот файл . (Оба файла должны быть открыты) |
su60 Пользователь Сообщений: 40 |
Да, оба открыты. Изменено: su60 — 26.12.2016 19:44:03 |
Kuzmich Пользователь Сообщений: 7998 |
#30 26.12.2016 19:54:16 Открытый файл «Шаблон заявки на подбор» , с какой цифрой в окне Excel ? |