Страницы: 1
RSS
Копирование четных/нечетных строк, Четные и нечетные строки
 
Имеется таблица с данными:
А1
А2
А3
А4
А5
Необходимо в новую таблицу скопировать только строки:
А1
А3
А5
Либо
А2
А4
Разумеется, строк в таблице значительно больше.
 
Добавить столбец с формулой =ОСТАТ(СТРОКА();2)
Отфильтровать по 0 либо по 1, скопировать - вставить.
 
Пусть диапазон с данными находится в столбце "A", начиная с ячейки "A1".
Пусть результат требуется расположить в столбце "D", начиная с ячейки "D1".
Макрос:
Код
Sub qq()
    Dim i As Long, j As Long, x As Range, y As Range
    Set x = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
    j = 1 'Для нечетных строк. Для четных j = 2
    For i = j To x.Count Step 2
        If y Is Nothing Then Set y = x.Cells(i) Else Set y = Union(y, x.Cells(i))
    Next
    [D:D].ClearContents: y.Copy [D1]
End Sub
Изменено: SAS888 - 17.07.2018 12:05:03
Чем шире угол зрения, тем он тупее.
 
Вариант формулой массива. Для четных.
=ИНДЕКС($A$1:$A$10;НАИМЕНЬШИЙ(ЕСЛИ(ОСТАТ($A$1:$A$10;2)=0;СТРОКА($A$1:$A$10));СТРОКА(A1)))
Для нечетных.
=ИНДЕКС($A$1:$A$10;НАИМЕНЬШИЙ(ЕСЛИ(ОСТАТ(($A$1:$A$10)+1;2)=0;СТРОКА($A$1:$A$10));СТРОКА(A1)))
 
Буду очень благодарен, если покажете не примере.
См. файл.
Нужно с помощью формул, которые можно будет растянуть на более длинный столбец, извлечь данные из одной таблицы в другую.
В первом случае вытягиваем нечетные ячейки, во втором - четные.
Пробовал вашу формулу, не получилось((
 
=ИНДЕКС(A:A;СТРОКА()*2-1)
=ИНДЕКС(A:A;СТРОКА()*2)
 
Цитата
Catboyun написал:
1)
Спасибо огромное, получилось. Понял как работает))
 
Подскажите, как это работает в обратную сторону? Как вставить скопированные данные из одного файла только в четные строчки другого файла, не нарушив формулы в нечетных строчках
 
еще как вариант
познакомился с Excel
 
Вариант с дополнительным столбцом
Код
=ЕСЛИ(ОСТАТ(СТРОКА();2)=1;C1;ИНДЕКС($A$1:$A$7;ЦЕЛОЕ(СТРОКА()/2)))
 
Вариант макросом.
Код
Option Explicit

Sub Скопировать_в_чётные()
    Dim rSource As Range, rTarget As Range
    Set rSource = GetSourceRange()
    If rSource Is Nothing Then Exit Sub
    Set rTarget = GetTargetRange()
    If rTarget Is Nothing Then Exit Sub
    
    Dim pref As String
    pref = GetFormulaPrefix(rSource, rTarget)
    
    If rTarget.Rows.Count <= 2 * rSource.Rows.Count Then
        Set rTarget = rTarget.Resize(2 * rSource.Rows.Count)
    End If
    
    If Not Intersect(rSource, rTarget) Is Nothing Then Exit Sub
    
    Dim trr As Variant, yt As Long, ys As Long
    trr = rTarget.Formula
    For ys = 1 To rSource.Rows.Count
        yt = yt + 2
        trr(yt, 1) = "=" & pref & rSource.Cells(ys, 1).Address(0, 0, xlA1)
    Next
    
    Do
        yt = yt + 2
        If yt > rTarget.Rows.Count Then Exit Do
        rTarget.Cells(yt, 1).ClearContents
    Loop
    
    rTarget.Formula = trr
End Sub

Private Function GetSourceRange() As Range
    Dim rr As Range
    On Error Resume Next
    Set rr = Application.InputBox("Выберите диапазон-источник.", "Источник", "A1:A7", Type:=8)
    Set GetSourceRange = Intersect(rr, rr.Parent.UsedRange)
    On Error GoTo 0
End Function
Private Function GetTargetRange() As Range
    Dim rr As Range
    On Error Resume Next
    Set rr = Application.InputBox("Выберите диапазон-приёмник.", "Приёмник", "$C1:C14", Type:=8)
    Set GetTargetRange = Intersect(rr, rr.Parent.UsedRange)
    On Error GoTo 0
End Function

Private Function GetFormulaPrefix(rSource As Range, rTarget As Range) As String
    If rSource.Parent.Parent.Name = rTarget.Parent.Parent.Name Then
        If rSource.Parent.Name = rTarget.Parent.Name Then
            GetFormulaPrefix = ""
            Exit Function
        End If
        GetFormulaPrefix = "'" & rSource.Parent.Name & "'!"
        Exit Function
    End If
    GetFormulaPrefix = "'[" & rSource.Parent.Parent.Name & "]" & rSource.Parent.Name & "'!"
End Function

Изменено: МатросНаЗебре - 24.08.2026 13:44:12 (Приложил файл.)
 
Цитата
o-gurova:  Результат (вставить только в четные строки, не нарушив формулы в нечетных)
Скопировать в буфер обмена (Ctrl+C) формулу: =ИНДЕКС(A:A;СТРОКА()/2) ->> Выделить диапазон (C1:C14)  ->> Нажать F5 ->> 'Выделить…' ->> 'константы' (возможно надо 'пустые ячейки') ->> В строке формул: Ctrl+V ->> Ctrl+Enter
 
К сожалению в офисе запуск макросов отключен. Остальные варианты не подошли, формула в нечетных строках сбивается. Формулы высчитывают цену без НДС от вставляемого значения в четных строках.  
 
o-gurova, что-то не получается?)
результат #12 в файле
 
Здравствуйте.
Цитата
написал:
Остальные варианты не подошли,
Вариант из ответа #12 немного измененной последовательности: Скопировать в буфер обмена (Ctrl+C) ячейку С1->> Выделить диапазон (C1:C14)  ->> Нажать F5 ->> 'Выделить…' ->>  'пустые ячейки' ->> В строке формул: Ctrl+V
Еще вариант: включаете автофильтр по столбцу в ячейке С1--выбираете пустые ячейки--протягиваете формулу из С1 вниз-- снимаете фильтр. Соседняя тема
Ещё вариант: в соседнем столбце пропишите формулу =$C2/1,22, выделите ячейку с формулой и пустую ячейку ниже, протяните эти две ячейки вниз, скопируйте протянуты диапазон, Активируйте ячейку С1 и вызовите Специальную вставку--выберите там 'пропускать пустые ячейки' -- ОК.
Может быть из этих вариантов чтото подойдет?
Изменено: gling - 24.08.2026 21:48:56
 
ПавелW, к сожалению не получается)) возможно я замахнулась на серьезное. Но вручную вбивать более 500 позиций в четные строчки это слишком трудоемко. Решила попробовать с помощью формул
Прикреплю сюда таблицу. мне надо данные из столбца L вставить в E или F или G, но только в четные строчки, чтоб в нечетных формула которая там есть, не нарушилась. На примере выше я вижу, что у вас получилось, но как, я пока понять не могу)
 
o-gurova, добрый день. Во вложении (если правильно понял) на основании формулы от ПавелW, :
Цитата
написал:
Скопировать в буфер обмена (Ctrl+C) формулу: =ИНДЕКС(A:A;СТРОКА()/2) ->> Выделить диапазон (C1:C14)  ->> Нажать F5 ->> 'Выделить…' ->> 'константы' (возможно надо 'пустые ячейки') ->> В строке формул: Ctrl+V ->> Ctrl+Enter
 
Ещё раз здравствуйте.
o-gurova, откройте файл--протяните ячейку Е12 вниз-- сбросьте фильтр.
Или откройте файл--скопируйте ячейку Е12-- выделите диапазон E12:E412--Специальной вставкой вставьте формулы--сбросьте фильтр.
 
Alex,  ПавелW, спасибо, то что нужно, но не поняла, откуда я копирую формулу в буфер обмена?
 
o-gurova, пожалуйста
можно и целиком на столбец (сдвиг разумеется надо учитывать):
=ИНДЕКС(L:L;(СТРОКА()+СТРОКА(M$11))/2)
Цитата
откуда я копирую формулу в буфер обмена?
) да хоть прям отсюда (или где её пропишите). Можно и в строке формул ручками прописать)
Но в вашем случае формулы повторяются и проще протянуть сразу две ячейки

o-gurova, и вот зачем себе всё усложнять делая расчёты через строку?
см Лист2
 
ПавелW, утвержденная форма расчета, не могу изменить. Коллеги вручную вбивают значения, но 500 позиций, вот решила попробовать упростить себе жизнь
 
ПавелW, Все получилось! спасибо огромное за терпение!

Всем большое спасибо за помощь!
Страницы: 1
Читают тему
Наверх