JayBhagavan
Пользователь
Сообщений: 11833
Регистрация: 17.01.2014
ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64
=ДВССЫЛ(«‘»&ТЕКСТ(ЛЕВБ(ПРАВБ(ЯЧЕЙКА(«имяфайла»;C3);ДЛСТР(ЯЧЕЙКА(«имяфайла»;C3))-ПОИСК(«]»;ЯЧЕЙКА(«имяфайла»;C3)));2)-1;»00″)&ПРАВБ(ПРАВБ(ЯЧЕЙКА(«имяфайла»;C3);ДЛСТР(ЯЧЕЙКА(«имяфайла»;C3))-ПОИСК(«]»;ЯЧЕЙКА(«имяфайла»;C3)));3)&»‘!»&ЯЧЕЙКА(«адрес»;C3))+$B3
или
=INDIRECT(«‘»&TEXT(LEFTB(RIGHTB(CELL(«имяфайла»,C3),LEN(CELL(«имяфайла»,C3))-SEARCH(«]»,CELL(«имяфайла»,C3))),2)-1,»00″)&RIGHTB(RIGHTB(CELL(«имяфайла»,C3),LEN(CELL(«имяфайла»,C3))-SEARCH(«]»,CELL(«имяфайла»,C3))),3)&»‘!»&CELL(«адрес»,C3))+$B3
ЗЫ Если в именах листов будут посторонние символы (как в примере лишние пробелы), то формула не будет работать. Формула только для одного месяца.
<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Ссылка на предыдущий лист. |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Хитрости »
20 Август 2020 3457 просмотров
Имя предыдущего листа
Иногда возникают ситуации, когда необходимо знать имя листа(текущего или на котором ссылка) — об этом я уже писал в статье Как получить имя листа формулой. Но куда сложнее ситуация с получением имени предыдущего листа. Т.е. имя того листа, который расположен перед тем листом, на котором записана формула. Зачем это может потребоваться? Например, если в книге ведут учет касс и каждый лист это отдельная дата. И в определенной ячейке необходимо получить данные по остаткам из предыдущего листа(дня).
Стандартные формулы(та же ЯЧЕЙКА(CELL)) могут это сделать, но в силу специфики получается так, что они бесполезны. В той же ЯЧЕЙКА для получения имени конкретного листа необходимо указать ссылку на ячейку на этом самом листе. Замкнутый круг. Ведь можно сразу указать эту ссылку. А если лист со ссылкой будет удален, то получим ошибку и ссылку надо будет перепрописывать заново.
А значит обычные формулы нам в автоматизации не помогут — такое возможно только через VBA. Лучше всего делать это при помощи функции пользователя(UDF). И главное, эта функция не так уж и сложна:
'--------------------------------------------------------------------------------------- ' Author : Щербаков Дмитрий(The_Prist) ' https://www.excel-vba.ru ' info@excel-vba.ru ' Purpose: Функция возвращает имя листа, расположенного перед листом с функцией ' Не требует аргументов ' Если функция записана на первом по порядку листе - функция вернет ПУСТО '--------------------------------------------------------------------------------------- Function GetPrevSheet_Name() 'заставляем пересчитывать формулу при любом изменении Application.Volatile True Dim ws As Worksheet 'получаем ссылку на лист, в котором записана формула Set ws = Application.Caller.Parent 'если лист с формулой 2-ой или более по порядку If ws.Index > 1 Then 'получаем имя предыдущего листа GetPrevSheet_Name = ws.Previous.Name Else GetPrevSheet_Name = vbNullString End If End Function
Чтобы правильно использовать приведенный код, необходимо сначала ознакомиться со статьей Что такое функция пользователя(UDF)?. Вкратце: скопировать текст кода выше, перейти в редактор VBA(Alt+F11) -создать стандартный модуль(Insert —Module) и в него вставить скопированный текст. После чего функцию можно будет вызвать из Диспетчера функций(Shift+F3), отыскав её в категории Определенные пользователем (User Defined Functions).
Синтаксис записи функции на лист:
=GetPrevSheet_Name()
Функция будет исправно работать даже если предыдущий лист будет удален — ведь она непосредственно на него никак на завязана.
Однако, сама по себе функция в таком виде не очень практична — она ничего не дает, кроме имени листа. Чтобы получить с её помощью значение конкретной ячейки предыдущего листа(пусть это будет ячейка «А1»), необходимо использовать функцию преобразования текстового представления адреса в реальный — ДВССЫЛ(INDIRECT):
=ДВССЫЛ(«‘»&GetPrevSheet_Name()&»‘!A1»)
=INDIRECT(«‘»&GetPrevSheet_Name()&»‘!A1»)
Формула не очень наглядна, хоть и не сложна. Самое непонятное здесь, наверное, это апострофы. Я добавил их до и после имени листа на тот случай, если в имени листа будут различные знаки препинания и другие «неугодные» именам листов символы(пробел в том числе). В этом случае апострофы обязательны, но они никак не мешают, если никаких символов нет.
Но даже в связке с ДВССЫЛ(INDIRECT) наиболее часто функция будет использоваться для получения значения одной конкретной ячейки(как в примере выше). И куда реже в составе каких-либо других функций(ИНДЕКС, ВПР и т.п.), требующих указания диапазонов. Поэтому было бы неправильно, если бы я не привел в статье функцию, которая сразу делает именно нужное — возвращает значение указанной ячейки из предыдущего листа:
'--------------------------------------------------------------------------------------- ' Author : Щербаков Дмитрий(The_Prist) ' https://www.excel-vba.ru ' info@excel-vba.ru ' Purpose: Функция возвращает значение указанной ячейки на предыдущем листе ' Если функция записана на первом по порядку листе - функция вернет ошибку ЗНАЧ! ' Аргументы: ' rc - ссылка на ячейку на текущем листе, ' по адресу которой необходимо получить значение из предыдущего листа '--------------------------------------------------------------------------------------- Function GetPrevSheet_Value(Optional rc As Range) 'заставляем пересчитывать формулу при любом изменении Application.Volatile True Dim rCell As Range If rc Is Nothing Then Set rCell = Application.Caller Else Set rCell = rc End If Dim ws As Worksheet 'получаем ссылку на лист, в котором записана формула Set ws = Application.Caller.Parent 'если лист с формулой 2-ой или более по порядку If ws.Index > 1 Then 'получаем значение из предыдущего листа 'на основании адреса указанной ячейки GetPrevSheet_Value = ws.Previous.Range(rCell.Address).Value Else GetPrevSheet_Value = CVErr(xlErrValue) End If End Function
Используется функция так же, как и предыдущая.
Синтаксис записи на листе для получения значения ячейки А1 из предыдущего листа:
=GetPrevSheet_Value(A1)
Если надо получить из предыдущего листа значение ячейки, адрес которой равен адресу ячейки, в которую введена сама функция:
=GetPrevSheet_Value()
Если функция записана на первом по порядку листе, то результатом будет значение ошибки #ЗНАЧ!(#VALUE!)
Значение из предыдущего листа нужно получать куда чаще, чем из следующего. Но раз есть одно — нужно и другое. Функции ниже получают имя и значение ячейки следующего листа:
'--------------------------------------------------------------------------------------- ' Author : Щербаков Дмитрий(The_Prist) ' https://www.excel-vba.ru ' info@excel-vba.ru ' Purpose: Функция возвращает имя листа, расположенного после листа с функцией ' Не требует аргументов ' Если функция записана на первом по порядку листе - функция вернет ПУСТО '--------------------------------------------------------------------------------------- Function GetNextSheet_Name() 'заставляем пересчитывать формулу при любом изменении Application.Volatile True Dim ws As Worksheet 'получаем ссылку на лист, в котором записана формула Set ws = Application.Caller.Parent 'если лист с формулой не последний If ws.Index < ws.Parent.Worksheets.Count Then 'получаем имя предыдущего листа GetNextSheet_Name = ws.Next.Name Else GetNextSheet_Name = vbNullString End If End Function '--------------------------------------------------------------------------------------- ' Author : Щербаков Дмитрий(The_Prist) ' https://www.excel-vba.ru ' info@excel-vba.ru ' Purpose: Функция возвращает значение указанной ячейки на предыдущем листе ' Если функция записана на первом по порядку листе - функция вернет ошибку ЗНАЧ! ' Аргументы: ' rc - ссылка на ячейку на текущем листе, ' по адресу которой необходимо получить значение из предыдущего листа '--------------------------------------------------------------------------------------- Function GetNextSheet_Value(Optional rc As Range) 'заставляем пересчитывать формулу при любом изменении Application.Volatile True Dim rCell As Range If rc Is Nothing Then Set rCell = Application.Caller Else Set rCell = rc End If Dim ws As Worksheet 'получаем ссылку на лист, в котором записана формула Set ws = Application.Caller.Parent 'если лист с формулой не последний If ws.Index < ws.Parent.Worksheets.Count Then 'получаем значение из предыдущего листа 'на основании адреса указанной ячейки GetNextSheet_Value = ws.Next.Range(rCell.Address).Value Else GetNextSheet_Value = CVErr(xlErrValue) End If End Function
Скачать файл пример:
Имя предыдущего листа.xls (85,5 KiB, 513 скачиваний)
Так же см.:
Как получить имя листа формулой
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Как ссылаться на конкретное значение ячейки из предыдущего листа при создании копии в Excel? Например, при создании копии Sheet2 вы можете захотеть автоматически ссылаться на ячейку A1 Sheet2 на новый скопированный рабочий лист (говорит Sheet3). Как этого добиться? Эта статья вам поможет.
Использовать / ссылочное значение из предыдущего рабочего листа с пользовательской функцией
Используйте/ссылочное значение из предыдущего рабочего листа с Kutools for Excel
Использовать / ссылочное значение из предыдущего рабочего листа с пользовательской функцией
Честно говоря, ни один метод не может автоматически ссылаться на определенное значение ячейки при создании копии рабочего листа. Фактически, вы можете создать новый лист, а затем ссылаться на значение ячейки из предыдущего листа с помощью следующей пользовательской функции.
1. После создания нового пустого листа (говорит Sheet3), нажмите другой + F11 в то же время, чтобы открыть Microsoft Visual Basic для приложений окно.
2. в Microsoft Visual Basic для приложений окна, нажмите Вставить > Модули. Затем скопируйте и вставьте следующий код VBA в окно кода.
VBA: использовать / ссылочное значение из предыдущего листа в Excel
Function PrevSheet(RCell As Range)
Dim xIndex As Long
Application.Volatile
xIndex = RCell.Worksheet.Index
If xIndex > 1 Then _
PrevSheet = Worksheets(xIndex - 1).Range(RCell.Address)
End Function
3. нажмите другой + Q клавиши одновременно, чтобы закрыть Microsoft Visual Basic для приложений окно.
4. Выберите пустую ячейку Sheet3 (говорит A1), введите формулу = PrevSheet (A1) в Панель формул и затем нажмите Enter .
Теперь вы получите значение ячейки A1 предыдущего листа (Sheet2) на текущем листе.
Внимание: Код автоматически идентифицирует рабочий лист, который принадлежит предыдущему из текущего рабочего листа.
Используйте/ссылочное значение из предыдущего рабочего листа с Kutools for Excel
Для Динамически обращаться к рабочим листам полезности Kutools for Excel, вы можете легко использовать или ссылаться на значение из предыдущего листа в Excel.
1. Если вы хотите связать значение ячейки A1 из предыдущего листа с текущим листом, выберите ячейку A1 в текущем листе и нажмите Кутулс > Больше > Динамически обращаться к рабочим листам. Смотрите скриншот:
2. в Заполнить рабочие листы Ссылки диалоговом окне, проверьте только предыдущее имя рабочего листа в Список рабочих листов поле, а затем щелкните Диапазон заполнения кнопку.
Затем вы можете увидеть, что значение ячейки A1 на предыдущем листе указано в текущем листе.
Внимание: С помощью этой утилиты вы можете одновременно ссылаться на одно и то же значение ячейки из разных листов в текущий лист.
Если вы хотите получить бесплатную пробную версию (30-день) этой утилиты, пожалуйста, нажмите, чтобы загрузить это, а затем перейдите к применению операции в соответствии с указанными выше шагами.
Используйте/ссылочное значение из предыдущего рабочего листа с Kutools for Excel
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
Комментарии (22)
Оценок пока нет. Оцените первым!
0 / 0 / 0 Регистрация: 11.08.2016 Сообщений: 4 |
|
1 |
|
Как в книге проставить формулу со ссылкой на предыдущий лист11.08.2016, 15:00. Показов 14311. Ответов 10
Здравствуйте! Нужна помощь. Есть книга, выбираю ячейку и хочу проставить формулу =’1′!G44:H45+E44, на каждый лист в определённую ячейку и главное со ссылкой на предыдущий лист. Т.е. вопрос: что надо сделать, чтобы во всю сразу книгу вставить формулу в которой есть ссылка на пред.лист? Спасибо
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
11.08.2016, 15:45 |
2 |
0115432, Зачем вам такая формула в ячейке? Формула вернет значение ошибки.
0 |
0 / 0 / 0 Регистрация: 11.08.2016 Сообщений: 4 |
|
11.08.2016, 16:38 [ТС] |
3 |
посмотрите пожалуйста. выделенная ячейка, после первого листа в ней формула, уже на третьем листе видна ссылка в этой формуле на первый лист. Я во всей книге (она на самом деле больше, но это же неважно) выделил эту ячейку и вставил эту формулу, но хочу сделать (не в ручную), чтобы формула ссылалась на предыдущий лист. вроде так просто, а разобраться не получается пока
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
11.08.2016, 17:47 |
4 |
Так надо? надо писать так т.е. указывать верхнюю левую ячейку объединенной ячейки. Иначе возврачается не одно значение, а диапазон, типа {3;0:0;0}
0 |
0 / 0 / 0 Регистрация: 11.08.2016 Сообщений: 4 |
|
11.08.2016, 18:10 [ТС] |
5 |
да, хорошо, но особо волнует именно вами выделенная
‘1’ , понимаете? на третьем листе она должна стать ‘2’, на четвертом ‘3’, на 198 надо ‘197’… как заменить то, что в этих кавычках на универсально понятное екселю =’ предыдущий лист ‘!G44+E44 ?
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
11.08.2016, 18:15 |
6 |
Сообщение было отмечено 0115432 как решение РешениеВы откройте файл и изучите формулы. Я ваши формулы с ссылкой на предыдущий лист заменил все. Имя предыдущего листа получаем формулой Код ПСТР(ЯЧЕЙКА("имяфайла";A1);ПОИСК("]";ЯЧЕЙКА("имяфайла";A1))+1;255)-1
2 |
0 / 0 / 0 Регистрация: 11.08.2016 Сообщений: 4 |
|
11.08.2016, 18:39 [ТС] |
7 |
прошу прощения! Спасибо вам огромное! работает! пойду изучать как вы это сделали
0 |
0 / 0 / 0 Регистрация: 27.08.2018 Сообщений: 10 |
|
06.11.2018, 18:21 |
8 |
Подскажите, а если название листов заданы не числами, а словами или вот названиями месяцев хотя бы (типа: «январь», «февраль» и т.д.), возможно ли тогда получить ссылку на предыдущий лист?
0 |
0 / 0 / 0 Регистрация: 08.04.2019 Сообщений: 2 |
|
08.04.2019, 07:55 |
9 |
Всем добра! Господа профессионалы, нужна помощь профану) Вопрос совершенно тот же, при копирровании листа нужно использовать в некоторых ячейках данные с предыдущего листа, в частности, необходимо в отчете во вложении прописать такую формулу в ячейках B2 и столбце С листа 7.04Н, чтобы брались данные соответственно B3 и столбца F листа и так продолжая при каждом добавлении листа. Помогите пожалуйста с формулой…
0 |
2640 / 1697 / 694 Регистрация: 04.09.2015 Сообщений: 3,367 |
|
08.04.2019, 10:25 |
10 |
Goorito, если вам не подходит решение из этой темы, то ваша задача отличается от этой. Создайте свою тему. Добавлено через 11 минут
0 |
0 / 0 / 0 Регистрация: 08.04.2019 Сообщений: 2 |
|
11.04.2019, 06:55 |
11 |
ок спс
0 |