Шаблоны содержат в себе формулы (объем * на цену=затраты). Поэтому нужно, чтобы шаблоны полностью копировались и добавлялись в том виде как указанны в таблице (в разделе). В случае если шаблон уже заполнен данными (цифрами), нужно его перед добавлением очищать (кроме формул) от предыдущих данных, т.е чтобы в новом добавленном шаблоне можно было внести новые показатели.
Шаблоны содержат в себе формулы (объем * на цену=затраты). Поэтому нужно, чтобы шаблоны полностью копировались и добавлялись в том виде как указанны в таблице (в разделе). В случае если шаблон уже заполнен данными (цифрами), нужно его перед добавлением очищать (кроме формул) от предыдущих данных, т.е чтобы в новом добавленном шаблоне можно было внести новые показатели.Лорик
Отвлекли на работу... Сделать до отъезда не успею. Есть только мысли. 1. Все шаблоны удобнее вынести на отдельный лист, назвав его, например, "Образец" и после отладки скрыв от пользователей. "Во избежание" так сказать. 2. Шаблоны я бы делал "во всю строку". Так, мне кажется, будет удобнее вставлять. 3. Имена "имя1", …, "имя3" удобнее было бы заменить на осмысленные "Заголовок1", …, "Заголовок3". И при этом, может быть их тоже целыми строками сделать? Тогда даблклик по любой ячейке заголовка вызовет добавление шаблона. 4. Что-то у Вас, кажется, в структуре не совсем верно. Ваши формулы, вставляемые вместе с шаблонами, будут считать только ИТОГО по каждому шаблону, а не суммарные затраты по разделу. Тут бы надо, наверное, ещё и строку с формулой, считающей общую сумму добавить. А если дать этим строкам имена "Сумма1", …"Сумма3", то это будет перемещающийся по мере роста раздела указатель его нижней границы, по которому очень удобно будет макросом строки шаблонов вставлять в конец списка каждого раздела.
Ну, что-то типа этого. Только я пока формулы для сумм по разделам не прописал. (У меня с формулами вообще отношения сложные )
Отвлекли на работу... Сделать до отъезда не успею. Есть только мысли. 1. Все шаблоны удобнее вынести на отдельный лист, назвав его, например, "Образец" и после отладки скрыв от пользователей. "Во избежание" так сказать. 2. Шаблоны я бы делал "во всю строку". Так, мне кажется, будет удобнее вставлять. 3. Имена "имя1", …, "имя3" удобнее было бы заменить на осмысленные "Заголовок1", …, "Заголовок3". И при этом, может быть их тоже целыми строками сделать? Тогда даблклик по любой ячейке заголовка вызовет добавление шаблона. 4. Что-то у Вас, кажется, в структуре не совсем верно. Ваши формулы, вставляемые вместе с шаблонами, будут считать только ИТОГО по каждому шаблону, а не суммарные затраты по разделу. Тут бы надо, наверное, ещё и строку с формулой, считающей общую сумму добавить. А если дать этим строкам имена "Сумма1", …"Сумма3", то это будет перемещающийся по мере роста раздела указатель его нижней границы, по которому очень удобно будет макросом строки шаблонов вставлять в конец списка каждого раздела.
Ну, что-то типа этого. Только я пока формулы для сумм по разделам не прописал. (У меня с формулами вообще отношения сложные )Alex_ST
Чтобы обратиться к листу, на котором расположен именованный диапазон, нужно использовать свойство .Parent. Например, снять защиту с листа, на котором расположен диапазон "шаблон": [шаблон].Parent.Unprotect
Тогда уж не Parent, а Worksheet - нагляднее и "полезнее" в плане доступности списка методов по точке: [vba]
Чтобы обратиться к листу, на котором расположен именованный диапазон, нужно использовать свойство .Parent. Например, снять защиту с листа, на котором расположен диапазон "шаблон": [шаблон].Parent.Unprotect
Тогда уж не Parent, а Worksheet - нагляднее и "полезнее" в плане доступности списка методов по точке: [vba]
Gustav, спасибо за поправку. Что-то я почему-то до такого простого решения не допёр. Что у листа есть свойство ДИАПАЗОН - это очевидно. Но ведь и у диапазона есть свойство ЛИСТ!
Лорик, я-таки Вас не бросил и сделал файл. Всё оказалось элементарно просто.
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect([Заголовок1], Target) Is Nothing Then [Шаблон1].Copy: [Сумма1].Insert Shift:=xlDown If Not Intersect([Заголовок2], Target) Is Nothing Then [Шаблон2].Copy: [Сумма2].Insert Shift:=xlDown If Not Intersect([Заголовок3], Target) Is Nothing Then [Шаблон3].Copy: [Сумма3].Insert Shift:=xlDown Cancel = True End Sub
[/vba]
Лист "Образец" надо будет потом скрыть на всякий случай (Формат-Лист-Скрыть в 2003. Как в 2007 и позднее - не знаю). Диапазоны "Заголовок", даблклик по которым вызывает добавление шаблона, вполне можно сделать и не на всю строку, а только на несколько (хоть одну) ячеек.
На листе "Образец" серым залита табличка соответствия имён и диапазонов. Она для работы не нужна. Только для пояснения тем, кто будет разбираться. Её вполне можно удалить если всё и так ясно.
Ловите файл.
Gustav, спасибо за поправку. Что-то я почему-то до такого простого решения не допёр. Что у листа есть свойство ДИАПАЗОН - это очевидно. Но ведь и у диапазона есть свойство ЛИСТ!
Лорик, я-таки Вас не бросил и сделал файл. Всё оказалось элементарно просто.
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect([Заголовок1], Target) Is Nothing Then [Шаблон1].Copy: [Сумма1].Insert Shift:=xlDown If Not Intersect([Заголовок2], Target) Is Nothing Then [Шаблон2].Copy: [Сумма2].Insert Shift:=xlDown If Not Intersect([Заголовок3], Target) Is Nothing Then [Шаблон3].Copy: [Сумма3].Insert Shift:=xlDown Cancel = True End Sub
[/vba]
Лист "Образец" надо будет потом скрыть на всякий случай (Формат-Лист-Скрыть в 2003. Как в 2007 и позднее - не знаю). Диапазоны "Заголовок", даблклик по которым вызывает добавление шаблона, вполне можно сделать и не на всю строку, а только на несколько (хоть одну) ячеек.
На листе "Образец" серым залита табличка соответствия имён и диапазонов. Она для работы не нужна. Только для пояснения тем, кто будет разбираться. Её вполне можно удалить если всё и так ясно.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect([Заголовок1], Target) Is Nothing Then If MsgBox("Добавить шаблон?", 36) - 7 Then [Шаблон1].Copy: [Сумма1].Insert Shift:=xlDown If Not Intersect([Заголовок2], Target) Is Nothing Then If MsgBox("Добавить шаблон?", 36) - 7 Then [Шаблон2].Copy: [Сумма2].Insert Shift:=xlDown If Not Intersect([Заголовок3], Target) Is Nothing Then If MsgBox("Добавить шаблон?", 36) - 7 Then [Шаблон3].Copy: [Сумма3].Insert Shift:=xlDown Cancel = True End Sub
[/vba]
А если не понятно, то вот точно то же самое, но в "классической" записи (намного длиннее):
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect([Заголовок1], Target) Is Nothing Then If MsgBox("Добавить шаблон?", vbYesNo + vbQuestion) = vbYes Then [Шаблон1].Copy: [Сумма1].Insert Shift:=xlDown End If End If If Not Intersect([Заголовок2], Target) Is Nothing Then If MsgBox("Добавить шаблон?", vbYesNo + vbQuestion) = vbYes Then [Шаблон2].Copy: [Сумма2].Insert Shift:=xlDown End If End If If Not Intersect([Заголовок3], Target) Is Nothing Then If MsgBox("Добавить шаблон?", vbYesNo + vbQuestion) = vbYes Then [Шаблон3].Copy: [Сумма3].Insert Shift:=xlDown End If End If Cancel = True End Sub
[/vba]
Или вот так с запросами подтверждения:
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect([Заголовок1], Target) Is Nothing Then If MsgBox("Добавить шаблон?", 36) - 7 Then [Шаблон1].Copy: [Сумма1].Insert Shift:=xlDown If Not Intersect([Заголовок2], Target) Is Nothing Then If MsgBox("Добавить шаблон?", 36) - 7 Then [Шаблон2].Copy: [Сумма2].Insert Shift:=xlDown If Not Intersect([Заголовок3], Target) Is Nothing Then If MsgBox("Добавить шаблон?", 36) - 7 Then [Шаблон3].Copy: [Сумма3].Insert Shift:=xlDown Cancel = True End Sub
[/vba]
А если не понятно, то вот точно то же самое, но в "классической" записи (намного длиннее):
[vba]
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect([Заголовок1], Target) Is Nothing Then If MsgBox("Добавить шаблон?", vbYesNo + vbQuestion) = vbYes Then [Шаблон1].Copy: [Сумма1].Insert Shift:=xlDown End If End If If Not Intersect([Заголовок2], Target) Is Nothing Then If MsgBox("Добавить шаблон?", vbYesNo + vbQuestion) = vbYes Then [Шаблон2].Copy: [Сумма2].Insert Shift:=xlDown End If End If If Not Intersect([Заголовок3], Target) Is Nothing Then If MsgBox("Добавить шаблон?", vbYesNo + vbQuestion) = vbYes Then [Шаблон3].Copy: [Сумма3].Insert Shift:=xlDown End If End If Cancel = True End Sub
Немного удобнее и интенсивнее понятнее: ПКМ на скрываемом листе - Скрыть
Может быть и так. Я не знаю. У меня в обоих офисах надстройка работает, добавляющая в меню ПКМ на ярлыке листа пункты "Скрыть", "Запрятать" (в смысле VeryHidden ) и "Управление видимостью листов" (есть в "Готовых решениях"). Поэтому я не помню, что там моё, а что родное
Немного удобнее и интенсивнее понятнее: ПКМ на скрываемом листе - Скрыть
Может быть и так. Я не знаю. У меня в обоих офисах надстройка работает, добавляющая в меню ПКМ на ярлыке листа пункты "Скрыть", "Запрятать" (в смысле VeryHidden ) и "Управление видимостью листов" (есть в "Готовых решениях"). Поэтому я не помню, что там моё, а что родное Alex_ST