Уважаемые знатоки экселя, прошу помощи. На форуме были похожие темы, но не одно решение мне не помогло, возможно в силу моей тупости. Я не очень опытный пользователь, можно сказать чайник. Макросами вообще пользоваться не умею, немного могу работать с формулами закладывая расчеты логически. Так вот сейчас столкнулся с такой проблемой - не могу сослаться на предыдущий лист.
Нужно именно ссылаться на ячейку из предыдущего листа (!), поскольку листов много и создаются они простым копированием текущего листа, соответственно все данные переносятся в новый в конец списка. Названия у листов после копирования меняются, они соответствуют датам, допустим лист с названием 10.12.2016, затем следует лист с названием 11.12.2016 и т.д.
Суть документа - продажи товара со склада. Есть ячейка с исходным числом товара на начало смены 100 шт., в ходе рабочего дня товар продается тем или иным способом, часть товара может возвращаться на склад, но не суть, суть что есть ячейка, которая считает количество товара на конец смены. Так вот и нужно чтобы количество товара в ячейке на конец смены автоматом переносилось на следующий лист (при копировании текущего листа) в ячейку с количеством товара на начало смены, автоматом.
На форуме нашел формулу ='10.12.2016'!I2 Но приходиться вручную менять название листа в формуле на предыдущий, а ячеек очень много, это неудобно.
Макросы я не знаю, не знаю вообще ничего про них, как вставлять, куда вставлять и т.д. Пробовал вставлять готовые коды в "Эта книга" при помощи alt+F11, которые предлагали эксперты на форуме, но ничего не получалось, может не туда вставлял, может руки кривые, не знаю. В общем надеюсь поможете найти решение, желательно с применением формул, ну а если формулами нельзя то объясните как макросом сделать, только доходчиво, пошагово, для чайника.
Уважаемые знатоки экселя, прошу помощи. На форуме были похожие темы, но не одно решение мне не помогло, возможно в силу моей тупости. Я не очень опытный пользователь, можно сказать чайник. Макросами вообще пользоваться не умею, немного могу работать с формулами закладывая расчеты логически. Так вот сейчас столкнулся с такой проблемой - не могу сослаться на предыдущий лист.
Нужно именно ссылаться на ячейку из предыдущего листа (!), поскольку листов много и создаются они простым копированием текущего листа, соответственно все данные переносятся в новый в конец списка. Названия у листов после копирования меняются, они соответствуют датам, допустим лист с названием 10.12.2016, затем следует лист с названием 11.12.2016 и т.д.
Суть документа - продажи товара со склада. Есть ячейка с исходным числом товара на начало смены 100 шт., в ходе рабочего дня товар продается тем или иным способом, часть товара может возвращаться на склад, но не суть, суть что есть ячейка, которая считает количество товара на конец смены. Так вот и нужно чтобы количество товара в ячейке на конец смены автоматом переносилось на следующий лист (при копировании текущего листа) в ячейку с количеством товара на начало смены, автоматом.
На форуме нашел формулу ='10.12.2016'!I2 Но приходиться вручную менять название листа в формуле на предыдущий, а ячеек очень много, это неудобно.
Макросы я не знаю, не знаю вообще ничего про них, как вставлять, куда вставлять и т.д. Пробовал вставлять готовые коды в "Эта книга" при помощи alt+F11, которые предлагали эксперты на форуме, но ничего не получалось, может не туда вставлял, может руки кривые, не знаю. В общем надеюсь поможете найти решение, желательно с применением формул, ну а если формулами нельзя то объясните как макросом сделать, только доходчиво, пошагово, для чайника.
О боже! Легче VBA изучить! Да тут и макроса то... И формула (во) [vba]
Код
Sub Следующий() Dim AL$, NL$, PS& 'определяем формат переменных AL = ActiveSheet.Name 'Имя активного листа NL = Str(CDate(AL) + 1) 'Имя нового листа ActiveSheet.Copy , Worksheets(Worksheets.Count) 'Создаем копию активного листа ActiveSheet.Name = NL 'Даем копии новое имя Range("X1") = AL 'В ячейку Х1 пишем имя копируемого (предыдущего) листа. PS = Range("A" & Rows.Count).End(xlUp).Row 'Поледняя строка списка Range("D2:G" & PS).ClearContents 'Удаляем старые данные End Sub
[/vba]
[p.s.]Да, имя листов можно было бы именовать короче - 1,2,3,4 и т.д. Легче было бы ориентироваться. А дату высвечивать где нибудь вверху таблицы.[/p.s.]
О боже! Легче VBA изучить! Да тут и макроса то... И формула (во) [vba]
Код
Sub Следующий() Dim AL$, NL$, PS& 'определяем формат переменных AL = ActiveSheet.Name 'Имя активного листа NL = Str(CDate(AL) + 1) 'Имя нового листа ActiveSheet.Copy , Worksheets(Worksheets.Count) 'Создаем копию активного листа ActiveSheet.Name = NL 'Даем копии новое имя Range("X1") = AL 'В ячейку Х1 пишем имя копируемого (предыдущего) листа. PS = Range("A" & Rows.Count).End(xlUp).Row 'Поледняя строка списка Range("D2:G" & PS).ClearContents 'Удаляем старые данные End Sub
[/vba]
[p.s.]Да, имя листов можно было бы именовать короче - 1,2,3,4 и т.д. Легче было бы ориентироваться. А дату высвечивать где нибудь вверху таблицы.[/p.s.]Wasilich
krosav4ig, из всех предложенных вариантов подходит ваш:
Излишнее цитирование удалено
Поскольку позволяет решить проблему если даты при создании следующего листа следуют не по порядку, допустим предпоследний лист датирован 11.12.2016, а за ним следует лист с датой 14.12.2016, т.е. идет перескок на 3 дня. Ваше решение работает при таком раскладе, у других нет. Огромное спасибо за ответ.
Но прошу объяснить "чайнику" как мне перенести эти данные в свой файл? В нем много больше строк как вы понимаете. Не понимаю как попасть в диспетчер имен и куда вводить предложенное вами: aa =ЯЧЕЙКА("имяфайла";ТЕКСТССЫЛ("RC")) bb =ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1) cc =ТЕКСТССЫЛ(ФОРМУЛА.ПРЕОБРАЗОВАТЬ("'"&ИНДЕКС(bb;ПОИСКПОЗ(ЗАМЕНИТЬ(aa;1;ПОИСК("[";aa)-1 ;bb)-1)&"'!A2:I999";1;0;1))
Заранее извиняюсь если мой вопрос покажется вам идиотским.
krosav4ig, из всех предложенных вариантов подходит ваш:
Излишнее цитирование удалено
Поскольку позволяет решить проблему если даты при создании следующего листа следуют не по порядку, допустим предпоследний лист датирован 11.12.2016, а за ним следует лист с датой 14.12.2016, т.е. идет перескок на 3 дня. Ваше решение работает при таком раскладе, у других нет. Огромное спасибо за ответ.
Но прошу объяснить "чайнику" как мне перенести эти данные в свой файл? В нем много больше строк как вы понимаете. Не понимаю как попасть в диспетчер имен и куда вводить предложенное вами: aa =ЯЧЕЙКА("имяфайла";ТЕКСТССЫЛ("RC")) bb =ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1) cc =ТЕКСТССЫЛ(ФОРМУЛА.ПРЕОБРАЗОВАТЬ("'"&ИНДЕКС(bb;ПОИСКПОЗ(ЗАМЕНИТЬ(aa;1;ПОИСК("[";aa)-1 ;bb)-1)&"'!A2:I999";1;0;1))
Заранее извиняюсь если мой вопрос покажется вам идиотским.ilya-yurasov
Как то странно, перенес данные в файл в точности как предложил krosav4ig в Сообщении 4 через макрофункции в диспетчере имен в свой файл - ничего не получилось, не считает. В моем файле больше данных чем с файлом с которым работали эксперты, видимо с этим конфликт связан. Стоит удалить данные ниже 2-й строки со всеми формулами все считается как нужно. Можете посмотреть файл во вложении?
И второй момент - пришлось добавить строку над строкой с которой работали эксперты, в результате 2-я строка с которой работали стала 3-й, после чего расчет оказывается неверным, формула не работает. Мне это не подходит т.к. в файл будут постоянно добавляться новые строки и это не должно влиять на расчеты.
Подскажите как быть?
Как то странно, перенес данные в файл в точности как предложил krosav4ig в Сообщении 4 через макрофункции в диспетчере имен в свой файл - ничего не получилось, не считает. В моем файле больше данных чем с файлом с которым работали эксперты, видимо с этим конфликт связан. Стоит удалить данные ниже 2-й строки со всеми формулами все считается как нужно. Можете посмотреть файл во вложении?
И второй момент - пришлось добавить строку над строкой с которой работали эксперты, в результате 2-я строка с которой работали стала 3-й, после чего расчет оказывается неверным, формула не работает. Мне это не подходит т.к. в файл будут постоянно добавляться новые строки и это не должно влиять на расчеты.
ilya-yurasov, если все-таки пользоваться макрофункциями, то лучше вторым вариантом из моего поста (с листом макросов), ибо могут возникнуть проблемы в расчетах при переключении на другие книги. по поводу формулы - забыл указать последний аргумент. Должно быть так
Код
=ВПР(A3;cc;9;)
Добавил UDF [vba]
Код
Function ПредыдущийЛист() As Range With Parent.Caller.Parent Set ПредыдущийЛист = .Parent.Sheets(.Index - 1).UsedRange End With End Function
[/vba]
ilya-yurasov, если все-таки пользоваться макрофункциями, то лучше вторым вариантом из моего поста (с листом макросов), ибо могут возникнуть проблемы в расчетах при переключении на другие книги. по поводу формулы - забыл указать последний аргумент. Должно быть так
Код
=ВПР(A3;cc;9;)
Добавил UDF [vba]
Код
Function ПредыдущийЛист() As Range With Parent.Caller.Parent Set ПредыдущийЛист = .Parent.Sheets(.Index - 1).UsedRange End With End Function
Wasilich, ваш вариант меня напугал тем что я не знаю куда вставлять эту формулу, подскажите какую кнопку нужно нажать и куда ставить предоставленный вами код? Я Макросами никогда не пользовался просто.
Wasilich, ваш вариант меня напугал тем что я не знаю куда вставлять эту формулу, подскажите какую кнопку нужно нажать и куда ставить предоставленный вами код? Я Макросами никогда не пользовался просто.ilya-yurasov
ilya-yurasov, первоначальные сведения о макросах можно получить в этой статье Чтобы увидеть макросы в приложенных файлах, нажмите Alt+F11. Чтобы увидеть скрытый лист макросов, кликните по ярлыку любого листа и выберите Показать
ilya-yurasov, первоначальные сведения о макросах можно получить в этой статье Чтобы увидеть макросы в приложенных файлах, нажмите Alt+F11. Чтобы увидеть скрытый лист макросов, кликните по ярлыку любого листа и выберите ПоказатьPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Wasilich, спасибо за формулу, но ваш вариант работает только если последующие даты идут по порядку, если идет перескок на несколько дней (например выпадают выходные дни) формула не считает уже.
Wasilich, спасибо за формулу, но ваш вариант работает только если последующие даты идут по порядку, если идет перескок на несколько дней (например выпадают выходные дни) формула не считает уже.ilya-yurasov
krosav4ig, по поводу "Добавил UDF" не понял что это и куда добавлять надо? Я чайник и в терминологии не силен, если не затруднит конкретно пишите куда нужно добавлять этот код, и как войти в это место куда добавлять нужно? Посмотрел ваш файл приложенный к сообщению № 10, да в нем все работает как надо и считает тоже как мне нужно - это решение меня устроило бы, но только вот когда переношу рекомендуемые данные в свой файл все перестает работать как у вас, может что-то не доделываю?
Ничего не работает, хотя сделал вроде все как вы пишите. Мой файл во вложении, подскажите, что не так делаю, пожалуйста.
krosav4ig, по поводу "Добавил UDF" не понял что это и куда добавлять надо? Я чайник и в терминологии не силен, если не затруднит конкретно пишите куда нужно добавлять этот код, и как войти в это место куда добавлять нужно? Посмотрел ваш файл приложенный к сообщению № 10, да в нем все работает как надо и считает тоже как мне нужно - это решение меня устроило бы, но только вот когда переношу рекомендуемые данные в свой файл все перестает работать как у вас, может что-то не доделываю?
В "Эта книга" добавил код, а вот в "Модуль" не могу добавить т.к. модуль у меня не отображается почему-то. Поддержку макросов в параметрах центра управления безопасностью включил.
Модуля не видно.
Wasilich, спасибо за ответ.
В "Эта книга" добавил код, а вот в "Модуль" не могу добавить т.к. модуль у меня не отображается почему-то. Поддержку макросов в параметрах центра управления безопасностью включил.
Function ПредыдущийЛист() As Range With Parent.Caller.Parent Set ПредыдущийЛист = .Parent.Sheets(.Index - 1).UsedRange End With End Function
[/vba]
вставить в стандартный модуль (он же просто модуль, про который писал Wasilich ) для этого открываете свою книгу, где нужна эта функция переводите раскладку клавиатуры на англицкий зажимаете Alt и жмете по очереди F11 I M вставляете вышеуказанный код, где заморгал текстовый курсор
Function ПредыдущийЛист() As Range With Parent.Caller.Parent Set ПредыдущийЛист = .Parent.Sheets(.Index - 1).UsedRange End With End Function
[/vba]
вставить в стандартный модуль (он же просто модуль, про который писал Wasilich ) для этого открываете свою книгу, где нужна эта функция переводите раскладку клавиатуры на англицкий зажимаете Alt и жмете по очереди F11 I M вставляете вышеуказанный код, где заморгал текстовый курсор