0 / 0 / 0 Регистрация: 23.01.2017 Сообщений: 5 |
|
1 |
|
Обращение к предыдущему листу05.05.2020, 08:42. Показов 1679. Ответов 13
Есть книга в ней 31 лист на каждый день, нужно обратиться к предыдущему листу что бы взять информацию с прошлого дня, подскажите пожалуйста, знающие люди как это реализовать?
0 |
Narimanych 2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,149 |
||||
05.05.2020, 09:13 |
2 |
|||
Leonid_bur,
1 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
05.05.2020, 09:31 |
3 |
|||
P.S. Если предыдущим может быть, например, лист диаграммы, то тогда нужно так Dim ws As Object
1 |
Burk 1813 / 1135 / 346 Регистрация: 11.07.2014 Сообщений: 4,002 |
||||||||
05.05.2020, 09:58 |
4 |
|||||||
Leonid_bur, а я бы так написал с учетом, что текущий лист первый, если речь идет об индексе текущего листа, ну и добавить проверку по pashulka Pred это предыдущий день = лист
Добавлено через 16 минут
1 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
05.05.2020, 10:26 |
5 |
|||
Ещё один принципиально иной способ, это использовать имя листа, те.
Он будет работать, даже, если зачем-то, перемешать нумерацию листов
1 |
1813 / 1135 / 346 Регистрация: 11.07.2014 Сообщений: 4,002 |
|
05.05.2020, 10:44 |
6 |
pashulka, да вот задача поставлена некоректно, то ли это индексы, то ли имена листов такие. Мой код тоже имеет ограничение — расположение листов подряд и первый лист соответствует первому числу. А в вашем последнем коде можно поставить проверку на число и количество цифр < 3
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
05.05.2020, 10:48 |
7 |
Burk, Да всё нормально, уверен, что речь идёт о именах листов с 1 до 31. И в этом случае будут работать все варианты решения.
0 |
1813 / 1135 / 346 Регистрация: 11.07.2014 Сообщений: 4,002 |
|
05.05.2020, 10:55 |
8 |
pashulka, а вот если I < 1, то должны переходить на последнее число предыдущего месяца. У меня так и происходит
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
05.05.2020, 10:58 |
9 |
Burk, я не уверен, что в книге данные за все года и месяца. Мне, почему-то, кажется, что только за один месяц.
1 |
Narimanych 2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,149 |
||||
05.05.2020, 11:11 |
10 |
|||
В задании сказано:
Есть книга в ней 31 лист — зачем проверять количество?
Если предыдущим может быть, например, лист диаграммы, то тогда нужно так Dim ws As Object Создал лист с диаграммой- попробовал нижеследующее — работает…
Можете проверить..
1 |
0 / 0 / 0 Регистрация: 23.01.2017 Сообщений: 5 |
|
05.05.2020, 11:12 [ТС] |
11 |
Спасибо всем большое, все получилось!!!
0 |
1813 / 1135 / 346 Регистрация: 11.07.2014 Сообщений: 4,002 |
|
05.05.2020, 11:15 |
12 |
pashulka, я тоже в этом уверен. у меня определяется номер листа по последнему числу предыдущего месяца. Именно число меня и интересует, месяц не нужен. Например 1 мая определится номер страницы/имя страницы как 30. Вот с листа 30 и будут переносится исходные в лист 1
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
05.05.2020, 11:17 |
13 |
Narimanych, У меня нет проверки на количество листов и мой комментарий, касательно диаграммы, касался моего кода.
0 |
2632 / 1637 / 745 Регистрация: 23.03.2015 Сообщений: 5,149 |
|
05.05.2020, 11:21 |
14 |
касательно диаграммы, касался моего кода Sorry…
0 |
Вот решение на вопрос нашего читателя.
Когда в книге много листов, а работаешь, например, в 7-м и 27-м, хотелось бы переходить быстро на нужный предыдущий лист (без участия прокрутки). Как, к примеру, когда работаешь в двух документах Excel, очень удобно пользоваться «ctrl+Tab»
Тут решение в виде макроса на событие смены листа. Для работы код необходимо поместить в «ЭтаКнига». Код макроса для перехода на предыдущий активный лист указан под картинкой. Далее, для удобства необходимо присвоить макросу горячую клавишу и наслаждаться удобством. Для этого откройте окно с макросами, выберите необходимый, перейдите в «Параметры», и пропишите сочетание клавиш, по которому будет срабатывать данный макрос.
Public LastActiveList As Worksheet Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) Set LastActiveList = Sh 'запомнить текущий активный лист End Sub Sub GoToLastList() LastActiveList.Activate 'активируем предыдущий активный лист End Sub
Хитрости »
20 Август 2020 3464 просмотров
Имя предыдущего листа
Иногда возникают ситуации, когда необходимо знать имя листа(текущего или на котором ссылка) — об этом я уже писал в статье Как получить имя листа формулой. Но куда сложнее ситуация с получением имени предыдущего листа. Т.е. имя того листа, который расположен перед тем листом, на котором записана формула. Зачем это может потребоваться? Например, если в книге ведут учет касс и каждый лист это отдельная дата. И в определенной ячейке необходимо получить данные по остаткам из предыдущего листа(дня).
Стандартные формулы(та же ЯЧЕЙКА(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, 514 скачиваний)
Так же см.:
Как получить имя листа формулой
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Переход на ранее активный лист |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Если я Вас правильно понял, то гораздо проще будет:
1. скопировать целиком лист Я4, ссылающийся на лист Я3,
2. заменить его название на Ф5,
3. выделить все его ячейки
3. в меню ПРАВКА / ЗАМЕНИТЬ (Cntr+H)
заменить все
вхождения текста Я3! на Я4!
Но если Вы очень хотите сделать единую универсальную формулу для всех листов, то можно воспользоваться сочетанием функций ЯЧЕЙКА(«адрес»;ссылка_на_ячейку) и ДВССЫЛ(текст;необязательный параметр)
Первая из этих функций вернет Вам текстовую строку с полным адресом ячейки, которую ей передали в качестве второго параметра (если ссылка будет на другой лист, то вернется также и название листа).
Эту строку нужно будет преобразовать в строку с адресом для нового листа и использовать в качестве аргумента функции ДВССЫЛ()
Преобразование строк можно осуществить с помощью текстовых функций:
НАЙТИ(«!»;ЯЧЕЙКА(…);1) — вернет номер символа, разделяющего имя листа и адрес ячейки на листе
НАЙТИ(«]»;ЯЧЕЙКА(…);1) — вернет номер символа, разделяющего имя файла и имя листа
ПСТР(текст;НАЙТИ(«]»;…)+1;НАЙТИ(«]»;…)-НАЙТИ(«!»;…)-Константа) — вернет имя листа (Константа зависит от того, есть ли в имени файла или листа пробелы, и если есть, то между «!» и самим именем листа будет апостроф.
С помощью функции ЗАМЕНИТЬ() потребуется подставить новые символы на соответствующие места старой строки.
СОВЕТ_1: откажитесь от «разнобуквенного» обозначения листов и используйте всегда две цифры для обозначения недели, тогда модификация формул станет существенно проще:
функция Т(1+ЗНАЧЕН(ПСТР(текст;НАЙТИ(«!»;…)-2-Константа;2))) вернет Вам текстовую строку, содержащую номер на единицу больщий, нежели чем номер листа ссылки.
СОВЕТ_2: Сформируйте где-нибудь список названий листов, определяйте название текущего листа, с помощью функции ПОИСКПОЗ(найденое_имя;список_названий_листов) находите его номер в списке, после чего с помощью функции ИНДЕКС(список_названий_листов;ПОИСКПОЗ(…)+1) возвращайте имя следующего листа
Таким образом вместо простой записи:
=Я03!А1
потребуется записать
=ДВССЫЛ(Сложная_формула_преобразования_текста(ЯЧЕЙКА(«адрес»;Я03!А1 )))
Удачи!
Надеюсь, что помог.