Страницы: 1
RSS
Дублирование столбцов с формулами в выделенном диапазоне n-раз через m-интервал, Дублирование столбцов с шагом
 
Собственно вопрос в шапке, но повторюсь:
Как продублировать столбцы с формулами (без их изменения) в выделенном диапазоне n-раз через m-интервал?
Пример прикреплен: Лист1 - было, а Лист2 - хорошо бы стало.

В примере, 3 раза копия через 2 раза интервал, но так будет не всегда, поэтому важно и выделение (если сложно, то хотя бы маркер указания диапазона) и возможность поменять количество копий и шаг.

P.S.: обыскался уже, на форумах, даже в наборах надстроек типа Kutools For Excel, DigDB и т.д. нет ничего, что довольно странно, ведь интервальное выделение-вставка есть, а дублирования нет…

Помогите с макросом кто сможет такое.
 
Формулу проще:
=ЕСЛИ(C4>=90;5;ЕСЛИ(C4>=80;4;ЕСЛИ(C4>=75;4;ЕСЛИ(C4>=70;3;ЕСЛИ(C4>=60;3;ЕСЛИ(C4>=35;2;ЕСЛИ(C4>=1;2;ЕСЛИ(C4="ошибка";"ошибка";"ошибка"))))))))
Незачем проверять ону из границ второй раз. Еще короче - с помощью ВПР. Примеров на форуме много.
 
Спасибо, но формула не важна, да и там еще другие будут формулы, а вот макрос интервального дублирования с выделением, это важно и непонятно как.
 
Иван Иванов,
попробуйте так:
Скрытый текст
Изменено: heso - 03.05.2017 20:06:21
 
Цитата
Как продублировать столбцы с формулами (без их изменения) в выделенном диапазоне n-раз
На мой взгляд в столбце формулы должны иметь абсолютные адреса, тогда при копировании они будут без изменения.
Код
Sub iDublicate()
Dim n As Integer  'число копий
Dim k As Integer
Dim iLastRow As Long
Dim iLastColumn As Integer
  iLastRow = Cells(Rows.Count, "B").End(xlUp).Row
  iLastColumn = Range("B2").CurrentRegion.Columns.Count
  ActiveSheet.Copy after:=Worksheets(Worksheets.Count)
    n = 2
  For k = iLastColumn To 3 Step -1
    If Cells(4, k).HasFormula Then
      Columns(k + 1).Resize(, n).Insert
      Range(Cells(4, k), Cells(iLastRow, k)).Copy
      Range(Cells(4, k + 1), Cells(iLastRow, k + 1)).Resize(, n).PasteSpecial xlPasteFormulas
    End If
  Next
End Sub
 
heso,
Спасибо, работает, столбцы копируются, формулы не изменяются – это хорошо.

Но, здесь видимо моя неточность в пояснении (из-за недостатка подобного опыта).
"Выделите столбцы, к-е необходимо дублировать:" - этот пункт не нужен (их там будут десятки),
а нужно общее выделение диапазона работы, где они содержаться.

Например,
Запрос «Диапазон дублирования?» это выделение-указание столбцов D:ZZ
(самих данных будет больше, но дублирование там лишнее),
где D – начальный дублируемый столбец, ZZ – последний дублируемый столбец;
далее вопрос «Сколько раз дублировать?» (простое число, это есть и работает);
затем вопрос «Через какой интервал?» (он будет равномерный, простое число, но разный в зависимости от выделения).

P.S.: удивлен скоростью реакции форума, заранее благодарю, если сможете изменить макрос.
Изменено: Иван Иванов - 03.05.2017 21:01:19
 
Kuzmich,
Ваш вариант тоже работает (во всех смыслах без вопросов :)), но формулы меняются.
Абсолютными их делать нежелательно, т.к. они будут активно меняться.
Как вариант, можно конечно воспользоваться известным трюком замены = в формулах на ++, а потом наоборот.

Заметил, что дополнительно создается новый лист, это обязательно?
Дело в том, что там будут постоянно ситуации с множественным выделением и дублированием на одном и том же листе. Да и уже имеющихся листов будет очень много, каждый раз придется удалять старые.

Спасибо за участие и вариант.
 
Цитата
дополнительно создается новый лист, это обязательно?
Нет, не обязательно. Уберите строку
Код
  ActiveSheet.Copy after:=Worksheets(Worksheets.Count)

и макрос будет работать с активным на данный момент листом. Удачи!

 
немного попаразитировал на коде Kuzmich'a, чтобы формулы не изменялись:
Код
Sub iDublicate()
    Dim n%, k%, i%, iLastColumn%  'где n - число копий
    Dim iLastRow&

    iLastRow = Cells(Rows.Count, "B").End(xlUp).Row
    iLastColumn = Range("B2").CurrentRegion.Columns.Count
    
    n = 3

    Application.ScreenUpdating = False
    For k = iLastColumn To 3 Step -1
        If Cells(4, k).HasFormula Then
            Columns(k + 1).Resize(, n).Insert
            For i = 1 To n
                Range(Cells(1, k + i), Cells(iLastRow, k + i)).FormulaLocal = Range(Cells(1, k), Cells(iLastRow, k)).FormulaLocal
            Next
        End If
    Next
    Application.ScreenUpdating = True
    
End Sub
 
heso,
Благодарю за паразитирование :) все работает! Принцип понятен.
Изменено: Иван Иванов - 04.05.2017 09:32:31
 
Дополнение к теме.

Каюсь, из-за срочности и неожидания быстрого ответа создал тему на другом ресурсе, там также есть вариант решения для интересующихся:
Дублирование столбцов с формулами в выделенном диапазоне n-раз через m-интервал

Извините, правила точнее прочитал.
Страницы: 1
Наверх