Предыдущий лист excel vba

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,

Visual Basic
1
2
3
4
Sub mmm()
Msgbox("Номер предыдущего листа :" ThisWorkbook.Sheets(ActiveSheet.Index - 1).Index)
Msgbox("Имя предыдущего листа :" ThisWorkbook.Sheets(ActiveSheet.Index - 1).Name)
End Sub



1



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

05.05.2020, 09:31

3

Visual Basic
1
2
3
4
5
Dim ws As Worksheet
Set ws = ActiveSheet.Previous
If ws Is Nothing Then
   MsgBox "Предыдущий лист изволит отсутствовать": Exit Sub
End If

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 это предыдущий день = лист

Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub proba()
Dim I As Integer, Pred As Integer
I = ActiveSheet.Index
If I > 1 Then
  Pred = I - 1
Else
  Pred = Day(CDate(DateSerial(Year(Date), Month(Date), 1)) - 1)
End If
MsgBox ActiveSheet.Index & "  " & Pred
End Sub

Добавлено через 16 минут
вместо строк 4-8 можно записать короче

Visual Basic
1
Pred = IIf(I = 1, Day(CDate(DateSerial(Year(Date), Month(Date), 1)) - 1), I - 1)



1



pashulka

4131 / 2235 / 940

Регистрация: 01.12.2010

Сообщений: 4,624

05.05.2020, 10:26

5

Ещё один принципиально иной способ, это использовать имя листа, те.

Visual Basic
1
2
3
4
Dim ws As Worksheet, i&
i = Val(ActiveSheet.Name) - 1: If i < 1 Then _
MsgBox "Опять нет нашего предыдущего листа": Exit Sub
Set ws = Worksheets(CStr(i))

Он будет работать, даже, если зачем-то, перемешать нумерацию листов
Но обломается или вернёт не тот лист (с точки зрения пользователя), если встретится лист, допустим, с именем «3-я застава Ильича»



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

В задании сказано:

Цитата
Сообщение от Leonid_bur
Посмотреть сообщение

Есть книга в ней 31 лист

— зачем проверять количество?
pashulka,

Цитата
Сообщение от pashulka
Посмотреть сообщение

Если предыдущим может быть, например, лист диаграммы, то тогда нужно так Dim ws As Object

Создал лист с диаграммой- попробовал нижеследующее — работает…

Visual Basic
1
2
3
4
Sub MMM()
Msgbox("Номер предыдущего листа :" & ThisWorkbook.Sheets(ActiveSheet.Index - 1).Index)
Msgbox("Имя предыдущего листа :"  & ThisWorkbook.Sheets(ActiveSheet.Index - 1).Name)
End Sub

Можете проверить..



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

Цитата
Сообщение от pashulka
Посмотреть сообщение

касательно диаграммы, касался моего кода

Sorry…



0



Вот решение на вопрос нашего читателя.

Когда в книге много листов, а работаешь, например, в 7-м и 27-м, хотелось бы переходить быстро на нужный предыдущий лист (без участия прокрутки). Как, к примеру, когда работаешь в двух документах Excel, очень удобно пользоваться «ctrl+Tab»

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

SirExcel - макрос переключения на предыдущий активный лист

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) -создать стандартный модуль(InsertModule) и в него вставить скопированный текст. После чего функцию можно будет вызвать из Диспетчера функций(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
ссылки
статистика

Переход на ранее активный лист

Вячеслав

Дата: Пятница, 01.02.2013, 12:56 |
Сообщение № 1

День добрый!
Подскажите, может кто в курсе, есть удобная штука в винде Alt+tab, когда нажимаешь тебя перекидывает на файл которым ты пользовался до того как активировал текущий файл. Экономит кучу времени если много файлов открыто.
Есть ли такая же штука внутри файла экселевского?
Например я на листе 1, потом перехожу на лист 5. И чтобы не искать потом лист1 (ну или 30 листов в файле и не на лист 1 надо а туда обратно с листа 3 на лист 27) нажать какое нибудь сочетание клавиш. Ну или если нет то может кто в курсе как это на VBA реализовать

 

Ответить

Вячеслав

Дата: Пятница, 01.02.2013, 14:25 |
Сообщение № 2

Неужели никого не мучил данный вопрос?

 

Ответить

Serge_007

Дата: Пятница, 01.02.2013, 14:34 |
Сообщение № 3

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Нет
Ума не приложу для чего это может пригодится…
При правильной организации данных в книге не может быть более трёх листов и заблудиться в них достаточно сложно


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Вячеслав

Дата: Пятница, 01.02.2013, 14:52 |
Сообщение № 4

Ну это при правильной)))) А вот если чужие файлы разгребаешь и там по 30 листов и разделять на 10 файлов не вариант то приходится и по листам поскакать. А вот макрос какой нибудь на сочетание клавиш повесить было бы интересно. Но чем лучше узнаю ВБА тем яснее я понимаю что знаю очень мало))) Вот и интересуюсь может есть какая нибудь вшитая переменная типа PrevActSheet (ну типа ранее активный лист) и если кто нибудь что нибудь такое знает то можно за это зацепиться и попрограммировать маленько))

 

Ответить

Serge_007

Дата: Пятница, 01.02.2013, 14:57 |
Сообщение № 5

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Цитата (Вячеслав)

если чужие файлы разгребаешь

А с чужими файлами я просто поступаю:
Переименовываю листы согласно контенту, ПКМ на стрелках прокрутки листов и выбор нужного из списка

К сообщению приложен файл:

8857979.gif
(11.0 Kb)


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Вячеслав

Дата: Пятница, 01.02.2013, 15:04 |
Сообщение № 6

Это конечно можно, но мозг ищет варианты как сие замутить через сочетание клавиш)) Часто использую ALT+Tab и хочется аналогии внутри EXCEL))

 

Ответить

Serge_007

Дата: Пятница, 01.02.2013, 15:07 |
Сообщение № 7

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Цитата (Вячеслав)

хочется аналогии внутри EXCEL

Ну нету её smile


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Вячеслав

Дата: Пятница, 01.02.2013, 15:12 |
Сообщение № 8

Но это не повод сдаваться))

 

Ответить

Serge_007

Дата: Пятница, 01.02.2013, 15:20 |
Сообщение № 9

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Я думаю что можно так:
Отслеживать текущий лист, по событию deactivate текущего листа записывать в переменную его название и макросом активировать его по необходимости…


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Вячеслав

Дата: Пятница, 01.02.2013, 15:26 |
Сообщение № 10

а как реализовать отслеживание деактивированного листа в реальном времени без запуска макроса?

 

Ответить

Serge_007

Дата: Пятница, 01.02.2013, 15:29 |
Сообщение № 11

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Никак
А какое отношение это имеет к Вашей задаче?


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Вячеслав

Дата: Пятница, 01.02.2013, 15:37 |
Сообщение № 12

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

 

Ответить

Serge_007

Дата: Пятница, 01.02.2013, 15:39 |
Сообщение № 13

Группа: Админы

Ранг: Местный житель

Сообщений: 15894


Репутация:

2623

±

Замечаний:
±


Excel 2016

Внимательнее читайте что я написал:

Цитата (Serge_007)

по событию deactivate текущего листа

Последний текущий лист и будет последним деактивированным


ЮMoney:41001419691823 | WMR:126292472390

 

Ответить

Саня

Дата: Пятница, 01.02.2013, 15:46 |
Сообщение № 14

Группа: Друзья

Ранг: Ветеран

Сообщений: 1067


Репутация:

560

±

Замечаний:
0% ±


XL 2016

в модуль «ЭтаКнига»:
[vba]

Код

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
     Debug.Print «SheetActivate: «, Sh.Index; Sh.Name
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
     Debug.Print «SheetDeactivate: «, Sh.Index; Sh.Name
End Sub

[/vba]

пощелкай по ярлыкам листов той самой ЭтойКниги, смотри окно Immedite (Alt+F11, Ctrl+G), сделай соотв. выводы. smile

 

Ответить

RAN

Дата: Пятница, 01.02.2013, 15:51 |
Сообщение № 15

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Цитата (Serge_007)

Ума не приложу для чего это может пригодится…
При правильной организации данных в книге не может быть более трёх листов и заблудиться в них достаточно сложно

А это ты зазря. У меня есть сборники трудоемкости, так там по 50 листов с лишним. (правда на листе может быть и 5 строк) И ярлычки там скрыты. Вся навигация — через гиперссылки и макросы.

Да и в рабочем реестре 12 видимых листов, да 8 скрытых. И еще добавить бы надо. Зато там — все. И справочники, и реестр, и телефоны, и форма для договора и…

Код примерно такой
Модуль ЭтаКнига

[vba]

Код

Private Sub Workbook_Open()
Sheets(«Содержание»).Activate
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If ActiveSheet.Name <> «Калькуляция» Then
ShName = ActiveSheet.Name
Else
ActiveSheet.DrawingObjects(«Bevel 1»).Caption = «Вернуться на   » & ShName
End If
End Sub

[/vba]

Стандартный модуль
[vba]

Код

Option Explicit
Public ShName As String

Private Sub return_to_sheet()
     Worksheets(ShName).Activate
End Sub

[/vba]


Быть или не быть, вот в чем загвоздка!

 

Ответить

Вячеслав

Дата: Пятница, 01.02.2013, 16:18 |
Сообщение № 16

Саня,
вставленный код действительно порадовал)) значит не все потеряно.
Не могу только привязать к глобальной переменной Ш.Нэйм деактивированного листа, чтоб автоматом присваивалось.
Можешь помочь?

 

Ответить

Саня

Дата: Пятница, 01.02.2013, 16:29 |
Сообщение № 17

Группа: Друзья

Ранг: Ветеран

Сообщений: 1067


Репутация:

560

±

Замечаний:
0% ±


XL 2016

в стандартн. модуль:[vba]

Код

Public glPrev As Long
Public glAct As Long

Sub ActPrev()      ‘ сюда прицепишь сочетание клавиш
     If glPrev > 0 Then Sheets(glPrev).Activate
End Sub

[/vba]

в модуль «ЭтаКнига»:
[vba]

Код

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
     ‘Debug.Print «SheetActivate: «, Sh.Index; Sh.Name
     glAct = Sh.Index
End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
     ‘Debug.Print «SheetDeactivate: «, Sh.Index; Sh.Name
     glPrev = Sh.Index
End Sub

[/vba]

 

Ответить

Вячеслав

Дата: Пятница, 01.02.2013, 16:54 |
Сообщение № 18

Спасибо, все работает, только что то у меня с сочетание клавиш проблема какая то. Не стартует по сочетанию.
во второй строчке написал
‘Сочетание клавиш: Alt+q
правильно? или че то опять фтупляю?
Я просто обычно через кнопки или надстройки макросы пишу

 

Ответить

Вячеслав

Дата: Пятница, 01.02.2013, 17:08 |
Сообщение № 19

Привязал через разработчика, так что в принципе на предыдущее сообщение внимание можно не обращать.
Спасибо огромное! Сейчас размножу сие великолепие во все многолистовые файлы и будет мне счастье!
Жаль только что идет привязка к конкретной книге)) в смысле что в каждой книге надо это прописать))
Но лучше так чем никак))

 

Ответить

argetlam

Дата: Пятница, 26.06.2015, 10:54 |
Сообщение № 20

Группа: Пользователи

Ранг: Новичок

Сообщений: 46


Репутация:

0

±

Замечаний:
20% ±


Excel 2010

Доброго времени всем, прошу прощения за некропостинг, но по моей задаче половина решения тут уже есть. В чем суть — необходимо чтобы при переходе с листа на лист а отдельные ячейки записывались имена листов на которые перешли, вот что у меня получилось:
Модуль «ЭтаКнига»
[vba]

Код

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
lastrow = Worksheets(«logs»).Range(«A60000»).End(xlUp).Row
If ActiveSheet.Name <> «Лист 1» Then
ShName = ActiveSheet.Name
Worksheets(«logs»).Cells(lastrow + 1, 5) = ShName
End If
End Sub

[/vba]

Но по какой то причине имена листов пишутся в одну и ячейку, пока не перезайдешь в книгу, потом в следующей до следующего перезахода. Прошу помощи профессионалов))

[moder]Читайте правила форума, создавайте свою тему!
Эта тема закрыта.[/moder]

Сообщение отредактировал ManyashaПятница, 26.06.2015, 11:08

 

Ответить

Если я Вас правильно понял, то гораздо проще будет:
1. скопировать целиком лист Я4, ссылающийся на лист Я3,
2. заменить его название на Ф5,
3. выделить все его ячейки
3. в меню ПРАВКА / ЗАМЕНИТЬ (Cntr+H)

заменить все

вхождения текста Я3! на Я4!

Но если Вы очень хотите сделать единую универсальную формулу для всех листов, то можно воспользоваться сочетанием функций ЯЧЕЙКА(«адрес»;ссылка_на_ячейку) и ДВССЫЛ(текст;необязательный параметр)
Первая из этих функций вернет Вам текстовую строку с полным адресом ячейки, которую ей передали в качестве второго параметра (если ссылка будет на другой лист, то вернется также и название листа).
Эту строку нужно будет преобразовать в строку с адресом для нового листа и использовать в качестве аргумента функции ДВССЫЛ()

Преобразование строк можно осуществить с помощью текстовых функций:
НАЙТИ(«!»;ЯЧЕЙКА(…);1) — вернет номер символа, разделяющего имя листа и адрес ячейки на листе
НАЙТИ(«]»;ЯЧЕЙКА(…);1) — вернет номер символа, разделяющего имя файла и имя листа
ПСТР(текст;НАЙТИ(«]»;…)+1;НАЙТИ(«]»;…)-НАЙТИ(«!»;…)-Константа) — вернет имя листа (Константа зависит от того, есть ли в имени файла или листа пробелы, и если есть, то между «!» и самим именем листа будет апостроф.
С помощью функции ЗАМЕНИТЬ() потребуется подставить новые символы на соответствующие места старой строки.
СОВЕТ_1: откажитесь от «разнобуквенного» обозначения листов и используйте всегда две цифры для обозначения недели, тогда модификация формул станет существенно проще:
функция Т(1+ЗНАЧЕН(ПСТР(текст;НАЙТИ(«!»;…)-2-Константа;2))) вернет Вам текстовую строку, содержащую номер на единицу больщий, нежели чем номер листа ссылки.
СОВЕТ_2: Сформируйте где-нибудь список названий листов, определяйте название текущего листа, с помощью функции ПОИСКПОЗ(найденое_имя;список_названий_листов) находите его номер в списке, после чего с помощью функции ИНДЕКС(список_названий_листов;ПОИСКПОЗ(…)+1) возвращайте имя следующего листа

Таким образом вместо простой записи:
=Я03!А1
потребуется записать
=ДВССЫЛ(Сложная_формула_преобразования_текста(ЯЧЕЙКА(«адрес»;Я03!А1 )))

Удачи!
Надеюсь, что помог.

Понравилась статья? Поделить с друзьями:
  • Предыдущий год в excel
  • Предыдущий вид в word
  • Предыдущие редакции документа word
  • Предыдущие версии документа word 2003
  • Предыдущая страница в excel