While ActiveWorkbook.Sheets(NewSheet).Cells(i, 10) <> "Z-ОТЧЕТ" If (ActiveWorkbook.Sheets(NewSheet).Cells(i, 2).Value <> "") And (ActiveWorkbook.Sheets(NewSheet).Cells(i, 1).Value <> "") Then ActiveWorkbook.Sheets(NewSheet).Cells(i, 3).FormulaR1C1 = "='" & OldSheet & "'!RC[6]" ActiveWorkbook.Sheets(NewSheet).Range(Cells(i, 4), Cells(i, 7)).ClearContents End If i = i + 1 Wend
UserForm1.Hide End Sub
Private Sub CommandButton2_Click() UserForm1.Hide End Sub
Private Sub SpinButton1_Change() If SpinButton1.Value < 0 Then SpinButton1.Value = 0 End If
UserForm1.Label2.Caption = CStr(CDate(Sheets.Item(ActiveWorkbook.Sheets.Count).Name) + 1 + SpinButton1.Value) End Sub
Private Sub UserForm_Activate() SpinButton1.Value = 0 UserForm1.Label2.Caption = CStr(CDate(Sheets.Item(ActiveWorkbook.Sheets.Count).Name) + 1) End Sub
[/vba]
Единственное не понятно что делать с разделом доставка, поэтому в коде он обрабатывается наравне с другими строками.
Веселиться в VBA, так по полной программе и с формами :-)
в модуль вставляем [vba]
Код
Sub List_PLUS() UserForm1.Show End Sub
[/vba]
Делаем форму с двумя лейблами (во втором лейбле будет новое имя листа), spinbutton и две простые кнопки (Ок и Cancel)
Код для формы
[vba]
Код
Private Sub CommandButton1_Click() OldSheet = CStr(CDate(Sheets.Item(ActiveWorkbook.Sheets.Count).Name))
While ActiveWorkbook.Sheets(NewSheet).Cells(i, 10) <> "Z-ОТЧЕТ" If (ActiveWorkbook.Sheets(NewSheet).Cells(i, 2).Value <> "") And (ActiveWorkbook.Sheets(NewSheet).Cells(i, 1).Value <> "") Then ActiveWorkbook.Sheets(NewSheet).Cells(i, 3).FormulaR1C1 = "='" & OldSheet & "'!RC[6]" ActiveWorkbook.Sheets(NewSheet).Range(Cells(i, 4), Cells(i, 7)).ClearContents End If i = i + 1 Wend
UserForm1.Hide End Sub
Private Sub CommandButton2_Click() UserForm1.Hide End Sub
Private Sub SpinButton1_Change() If SpinButton1.Value < 0 Then SpinButton1.Value = 0 End If
UserForm1.Label2.Caption = CStr(CDate(Sheets.Item(ActiveWorkbook.Sheets.Count).Name) + 1 + SpinButton1.Value) End Sub
Private Sub UserForm_Activate() SpinButton1.Value = 0 UserForm1.Label2.Caption = CStr(CDate(Sheets.Item(ActiveWorkbook.Sheets.Count).Name) + 1) End Sub
[/vba]
Единственное не понятно что делать с разделом доставка, поэтому в коде он обрабатывается наравне с другими строками.dim34rus
Wasilich, вынужден вернуться к обсуждению, поскольку в ходе работы над файлом предложенное решение в Сообщение № 18 не совсем корректно работает, а именно если добавляем новые товары в таблицу (строки), то все съезжает на одну строку. Ну допустим в листе 19.12.2016 - 100 строк с товарами, им соответствует определенное количество товаров со своими наименованиями, которое считается по предложенной вами формуле с учетом предыдущего листа, в котором то же количество строк, и чтобы понятно было в 88 строке то же название товара как и на 88 строке следующего листа. Но стоит нам добавить в последний лист на 20.12.2016 1 товар (строку), где-нибудь посередине, то получиться уже 101 товар и все, что ниже добавленного съезжает, а считает то по предыдущему листу, а там на 1 строку меньше, получается неверно. Приходиться во всех листах дублировать добавление этой новой строки, а как вы понимаете это нереально. Как быть?
Wasilich, вынужден вернуться к обсуждению, поскольку в ходе работы над файлом предложенное решение в Сообщение № 18 не совсем корректно работает, а именно если добавляем новые товары в таблицу (строки), то все съезжает на одну строку. Ну допустим в листе 19.12.2016 - 100 строк с товарами, им соответствует определенное количество товаров со своими наименованиями, которое считается по предложенной вами формуле с учетом предыдущего листа, в котором то же количество строк, и чтобы понятно было в 88 строке то же название товара как и на 88 строке следующего листа. Но стоит нам добавить в последний лист на 20.12.2016 1 товар (строку), где-нибудь посередине, то получиться уже 101 товар и все, что ниже добавленного съезжает, а считает то по предыдущему листу, а там на 1 строку меньше, получается неверно. Приходиться во всех листах дублировать добавление этой новой строки, а как вы понимаете это нереально. Как быть?ilya-yurasov
если добавляем новые товары в таблицу (строки), то все съезжает на одну строку
, так это же логично. В чем прелесть формулы заключается. Ссылается она на соседнюю строку на предыдущем листе, НО, что самое главное на ТЕЖЕ самые данные. Всего то надо: 1. восстановить формулы с суммами, а формулу, которая берет данные с предыдущего листа необходимо скопировать/восстановить только на СЛЕДУЮЩЕМ листе. И не надо синхронизировать номенклатуру разных листов.
если добавляем новые товары в таблицу (строки), то все съезжает на одну строку
, так это же логично. В чем прелесть формулы заключается. Ссылается она на соседнюю строку на предыдущем листе, НО, что самое главное на ТЕЖЕ самые данные. Всего то надо: 1. восстановить формулы с суммами, а формулу, которая берет данные с предыдущего листа необходимо скопировать/восстановить только на СЛЕДУЮЩЕМ листе. И не надо синхронизировать номенклатуру разных листов.dim34rus
Извращение - это писать формулы в Word'овских таблицах. ЯД 410014340958327
а формулу, которая берет данные с предыдущего листа необходимо скопировать/восстановить только на СЛЕДУЮЩЕМ листе.
тоже непонятно. Это каждый раз при создании листов нужно что-то менять в формулах, восстанавливать формул на текущем и предыдущем листе. Есть решение которое позволит при добавлении строки на последнем листе, автоматически добавлять эту же строку на всех предыдущих листах, чтобы на 1-м и на 100-м листе, допустим, в итоге было одинаковое количество строк?
dim34rus, логично, но из-за этого предложенное решение не подходит.
а формулу, которая берет данные с предыдущего листа необходимо скопировать/восстановить только на СЛЕДУЮЩЕМ листе.
тоже непонятно. Это каждый раз при создании листов нужно что-то менять в формулах, восстанавливать формул на текущем и предыдущем листе. Есть решение которое позволит при добавлении строки на последнем листе, автоматически добавлять эту же строку на всех предыдущих листах, чтобы на 1-м и на 100-м листе, допустим, в итоге было одинаковое количество строк?ilya-yurasov
чтобы на 1-м и на 100-м листе, допустим, в итоге было одинаковое количество строк?
Это как? Вы собираетесь нагромождать книгу листами до бесконечности? Да еще и хотите вставку строк на всех листах делать? А в году примерно 245 р.д. Я думал, максимум на месяц - 20 - 22 листов. Не верным путем идёте товариСЧ! Заблудитесь в листах. Надо поменять подход к решению задачи. Ибо, в вашем случае со ссылкой на предыдущий лист, будут ещё проблемы. А подход простой, убрать ссылки на пред. лист оставив значения, потом просто сделать копию текущего листа, сменить имя текущего листа (не копии) на новую дату, значения из графы "на конец смены" скопировать в графу "на начало смены". И будет Вам счастье. Потом добавляйте строки куда хотите. И эти действия можно легко автоматизировать. Только этот метод желательно применить в новой книге, скопировав таблицу из последнего рабочего листа старой книги в новую книгу на Лист1.
чтобы на 1-м и на 100-м листе, допустим, в итоге было одинаковое количество строк?
Это как? Вы собираетесь нагромождать книгу листами до бесконечности? Да еще и хотите вставку строк на всех листах делать? А в году примерно 245 р.д. Я думал, максимум на месяц - 20 - 22 листов. Не верным путем идёте товариСЧ! Заблудитесь в листах. Надо поменять подход к решению задачи. Ибо, в вашем случае со ссылкой на предыдущий лист, будут ещё проблемы. А подход простой, убрать ссылки на пред. лист оставив значения, потом просто сделать копию текущего листа, сменить имя текущего листа (не копии) на новую дату, значения из графы "на конец смены" скопировать в графу "на начало смены". И будет Вам счастье. Потом добавляйте строки куда хотите. И эти действия можно легко автоматизировать. Только этот метод желательно применить в новой книге, скопировав таблицу из последнего рабочего листа старой книги в новую книгу на Лист1.Wasilich
Сообщение отредактировал Wasilich - Суббота, 24.12.2016, 11:02
ilya-yurasov, Буквально на днях решал подобную задачу. Без дополнительного листа, с учетом поставленных условий, не обойтись и все строится на корректном наименовании листов. Пример в приложении. Первая дата, из начального листа, далее столбцы A,B размножить по количеству дней. Принцып прост. на странице settings сперва определяем какие страницы есть в наличии, в данном случае исходя из даты. Дальше
АДРЕС(2;9 - строка 2 столбец 9 (i2) Ну и подставляетя ближайшее предыдущее имя листа. Ищется просто в массиве из предыдущих значений уже готовых в столбце B
- имя текущего листа, а в дату переводим, для упрощения поиска.
ilya-yurasov, Буквально на днях решал подобную задачу. Без дополнительного листа, с учетом поставленных условий, не обойтись и все строится на корректном наименовании листов. Пример в приложении. Первая дата, из начального листа, далее столбцы A,B размножить по количеству дней. Принцып прост. на странице settings сперва определяем какие страницы есть в наличии, в данном случае исходя из даты. Дальше
АДРЕС(2;9 - строка 2 столбец 9 (i2) Ну и подставляетя ближайшее предыдущее имя листа. Ищется просто в массиве из предыдущих значений уже готовых в столбце B
bmv98rus, смотрю на ваш файл и не могу понять как вы это сделали? В своей книги: 1. Создал лист settings как у вас 2. На последнем листе вижу у вас формулу в ячейке С2, копирую вставляю ее туда же на свой лист
, в ответ на что всплывающее окно "невозможно ввести указанную формулу поскольку она содержит больше уровней вложения, чем допускается текущим форматом файла". 3. Далее вы приводите еще три формулы
АДРЕС(2;9 - строка 2 столбец 9 (i2) Ну и подставляетя ближайшее предыдущее имя листа. Ищется просто в массиве из предыдущих значений уже готовых в столбце B [Перевод / Translate] СМЕЩ(Settings!$B$1;1;0;ПОИСКПОЗ(ДАТАЗНАЧ(ЗАМЕНИТЬ(ЯЧЕЙКА("filename";A1);1;НАЙТИ("]";ЯЧЕЙКА("filename";A1));""));Settings!$B:$B;0)-2;1)
единственное что надо ограничить область строкой, за которой следует наименование текущего листа [Перевод / Translate] ПОИСКПОЗ(ДАТАЗНАЧ(ЗАМЕНИТЬ(ЯЧЕЙКА("filename";A1);1;НАЙТИ("]";ЯЧЕЙКА("filename";A1));"")) ; где [Перевод / Translate] ЗАМЕНИТЬ(ЯЧЕЙКА("filename";A1);1;НАЙТИ("]";ЯЧЕЙКА("filename";A1) - имя текущего листа, а в дату переводим, для упрощения поиска.
Тут я вообще не понял куда их вставлять нужно? 4. Так же пробовал в вашем файле скопировать формулу на 3-ю строку где будет следующий товар, как вы понимаете товаров там будет очень много, так во копирую, данные не меняются для третьей строки, а просто копируется то же самое со второй строки, те же цифры получаются как и на строке от куда копирую формулу.
bmv98rus, смотрю на ваш файл и не могу понять как вы это сделали? В своей книги: 1. Создал лист settings как у вас 2. На последнем листе вижу у вас формулу в ячейке С2, копирую вставляю ее туда же на свой лист
, в ответ на что всплывающее окно "невозможно ввести указанную формулу поскольку она содержит больше уровней вложения, чем допускается текущим форматом файла". 3. Далее вы приводите еще три формулы
АДРЕС(2;9 - строка 2 столбец 9 (i2) Ну и подставляетя ближайшее предыдущее имя листа. Ищется просто в массиве из предыдущих значений уже готовых в столбце B [Перевод / Translate] СМЕЩ(Settings!$B$1;1;0;ПОИСКПОЗ(ДАТАЗНАЧ(ЗАМЕНИТЬ(ЯЧЕЙКА("filename";A1);1;НАЙТИ("]";ЯЧЕЙКА("filename";A1));""));Settings!$B:$B;0)-2;1)
единственное что надо ограничить область строкой, за которой следует наименование текущего листа [Перевод / Translate] ПОИСКПОЗ(ДАТАЗНАЧ(ЗАМЕНИТЬ(ЯЧЕЙКА("filename";A1);1;НАЙТИ("]";ЯЧЕЙКА("filename";A1));"")) ; где [Перевод / Translate] ЗАМЕНИТЬ(ЯЧЕЙКА("filename";A1);1;НАЙТИ("]";ЯЧЕЙКА("filename";A1) - имя текущего листа, а в дату переводим, для упрощения поиска.
Тут я вообще не понял куда их вставлять нужно? 4. Так же пробовал в вашем файле скопировать формулу на 3-ю строку где будет следующий товар, как вы понимаете товаров там будет очень много, так во копирую, данные не меняются для третьей строки, а просто копируется то же самое со второй строки, те же цифры получаются как и на строке от куда копирую формулу.ilya-yurasov
ilya-yurasov, "невозможно ввести указанную формулу поскольку она содержит больше уровней вложения, чем допускается текущим форматом файла". - проверю в 2010 отпишу. Странно, вроде ничего такого не намудрил с глубиной. Проверил, видимо глюк при вставке формулы с портала. Если c Excel в Excel переносить, то все корректно.
по поводу копирования , тут еще проще . Весь набор формул был приведен только для описания решения. Там же была сразу сноска на АДРЕС(2;9 - строка 2 столбец 9 (i2). Это жестко на ячейку i2 завязано. Если нужно по другим ячейкам , то
в данном случае универсально ссылаемся на на любую ячейку относительно I2 , для примера на лист "10.12.2016"
Код
ADDRESS(ROW(I2);COLUMN(I2);;1;"10.12.2016")
при желании закрепите I - $I2'
добавил в файл. Но если товаров много, то желательно минимизировать расчеты. например имя прдыдущего листа достаточно расчитать один раз и положив его в одну из ячеек (скрытых, например в первой строке столбца следующего за последним (M1)
ilya-yurasov, "невозможно ввести указанную формулу поскольку она содержит больше уровней вложения, чем допускается текущим форматом файла". - проверю в 2010 отпишу. Странно, вроде ничего такого не намудрил с глубиной. Проверил, видимо глюк при вставке формулы с портала. Если c Excel в Excel переносить, то все корректно.
по поводу копирования , тут еще проще . Весь набор формул был приведен только для описания решения. Там же была сразу сноска на АДРЕС(2;9 - строка 2 столбец 9 (i2). Это жестко на ячейку i2 завязано. Если нужно по другим ячейкам , то
в данном случае универсально ссылаемся на на любую ячейку относительно I2 , для примера на лист "10.12.2016"
Код
ADDRESS(ROW(I2);COLUMN(I2);;1;"10.12.2016")
при желании закрепите I - $I2'
добавил в файл. Но если товаров много, то желательно минимизировать расчеты. например имя прдыдущего листа достаточно расчитать один раз и положив его в одну из ячеек (скрытых, например в первой строке столбца следующего за последним (M1)
Wasilich, Я б наверно тоже порекомендовал сменить подход, но часто пользователю удобно именно так и не иначе, "солнце встает на востоке ....". А мой вариант не так и сложен, если приглядется. А с очень незначительной доработкой по замене "]" на соответствующий разделить, заработает и в Libre в Open, хотя ресурс всеж про любимый Excel. Меня тоже порой угнетает увлечение такими решениями Сумма прописью без макросов или Сумма прописью без макросов 2, но бывает это более рационально. Например в компании где использование VBA, под запретом по безопасности.
Wasilich, Я б наверно тоже порекомендовал сменить подход, но часто пользователю удобно именно так и не иначе, "солнце встает на востоке ....". А мой вариант не так и сложен, если приглядется. А с очень незначительной доработкой по замене "]" на соответствующий разделить, заработает и в Libre в Open, хотя ресурс всеж про любимый Excel. Меня тоже порой угнетает увлечение такими решениями Сумма прописью без макросов или Сумма прописью без макросов 2, но бывает это более рационально. Например в компании где использование VBA, под запретом по безопасности.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Понедельник, 26.12.2016, 21:56