Скопируйте каждую n-ю строку с одного листа на другой - PullRequest
54 голосов
/ 17 октября 2008

У меня есть таблица Excel с 1 столбцом, 700 строк. Я забочусь о каждой седьмой строчке. Я не хочу идти и удалять 6 строк между каждой строкой, которая мне нужна. Поэтому я решил создать другой лист и указать ссылку на каждую ячейку, которую я хочу.

=sheet1!a1
=sheet1!a8
=sheet1!a15

Но я не хочу вводить каждую из этих формул ... `100 раз. Я подумал, что если я выберу три и перетащу рамку, я пойму, что я пытаюсь сделать, но не повезло.

Есть идеи, как сделать это элегантно / эффективно?

Ответы [ 8 ]

120 голосов
/ 17 октября 2008

В A1 вашего нового листа поместите это:

=OFFSET(Sheet1!$A$1,(ROW()-1)*7,0)

... и скопировать вниз. Если вы начинаете где-то, кроме строки 1, измените ROW () на ROW (A1) или какую-либо другую ячейку в строке 1, а затем скопируйте снова.

Если вы хотите скопировать n-ю строку, но несколько столбцов, используйте формулу:

=OFFSET(Sheet1!A$1,(ROW()-1)*7,0)

Это тоже можно скопировать.

11 голосов
/ 26 сентября 2016

На мой взгляд, ответы на этот вопрос слишком конкретны. Вот попытка дать более общий ответ с двумя разными подходами и полным примером.

OFFSET подход

OFFSET принимает 3 обязательных аргумента. Первая - это заданная ячейка, от которой мы хотим сместить. Следующие два - это количество строк и столбцов, которые мы хотим сместить (вниз и вправо). OFFNET возвращает содержимое ячейки, к которой это приводит. Например, OFFSET(A1, 1, 2) возвращает содержимое ячейки C2, потому что A1 это ячейка (1,1), и если мы добавим (1,2) к этому, мы получим (2,3) что соответствует ячейке C2.

Чтобы заставить эту функцию возвращать каждую n-ю строку из другого столбца, мы можем использовать функцию ROW. Когда этой функции не передается аргумент, она возвращает номер строки текущей ячейки. Таким образом, мы можем объединить OFFSET и ROW, чтобы создать функцию, которая возвращает каждую n-ю ячейку, добавляя множитель к значению, возвращаемому ROW. Например OFFSET(A$1,ROW()*3,0). Обратите внимание на использование $1 в целевой ячейке. Если это не используется, смещение будет смещаться от разных ячеек, таким образом, фактически добавляя 1 к множителю.

ADDRESS + INDIRECT подход

ADDRESS принимает два целочисленных ввода и возвращает адрес / имя ячейки в виде строки. Например, ADDRESS(1,1) return "$A$1". INDIRECT берет адрес ячейки и возвращает содержимое. Например, INDIRECT("A1") возвращает содержимое ячейки A1 (она также принимает ввод с $ в нем). Если мы используем ROW внутри ADDRESS с множителем, мы можем получить адрес каждой n-й ячейки. Например, ADDRESS(ROW(), 1) в строке 1 вернет "$A$1", в строке 2 вернет "$A$2" и так далее. Итак, если мы поместим это в INDIRECT, мы можем получить содержимое каждой n-й ячейки. Например, INDIRECT(ADDRESS(1*ROW()*3,1)) возвращает содержимое каждой третьей ячейки в первом столбце при перетаскивании вниз.

Пример

Рассмотрим следующий скриншот таблицы. Заголовки (первая строка) содержит вызов, используемый в строках ниже. enter image description here Столбец A содержит данные нашего примера. В данном случае это просто положительные целые числа (подсчет продолжается за пределами показанной области). Это значения, которые мы хотим получить каждый третий, то есть мы хотим получить 1, 4, 7, 10 и т. Д.

Столбец B содержит неверную попытку использования подхода OFFSET, но там, где мы забыли использовать $. Как видно, хотя мы умножаем на 3, мы на самом деле получаем каждую четвертую строку.

Столбец C содержит неверную попытку использования подхода OFFSET, когда мы помнили использовать $, но забыли вычесть. Поэтому, пока мы получаем каждое третье значение, мы пропустили некоторые значения (1 и 4).

Столбец D содержит правильную функцию с использованием подхода OFFSET.

Столбец E содержит неверную попытку использования подхода ADDRESS + INDRECT, но там, где мы забыли вычесть. Таким образом, мы пропустили несколько строк изначально. Та же проблема, что и с колонкой C.

Столбец F содержит правильную функцию с использованием подхода ADDRESS + INDRECT.

11 голосов
/ 17 октября 2008

Если бы я столкнулся с извлечением каждой 7-й строки, я бы «вставил» столбец перед столбцом «А». Затем я бы (если предположить, что в строке 1 есть строка заголовка) набрал бы цифры 1,2,3,4,5,6,7 в строках 2,3,4,5,6,7,8, я бы выделите 1,2,3,4,5,6,7 и вставьте этот блок до конца листа (стоит 700 строк). Результат будет 1,23,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7 ……. Теперь выполните сортировку данных по возрастанию в столбце «А». После сортировки все 1 будут первыми в серии, все 7 - седьмым.

4 голосов
/ 24 ноября 2012

вставьте новый столбец и поместите ряд в 1,2,3,4 и т. Д. Затем создайте другой новый столбец и используйте команду = if (int (a1 / 7) = (a1 / 7), 1,0 ) вы должны получить 1 в каждой 7-й строке, отфильтруйте столбец на 1

3 голосов
/ 20 декабря 2013

Выделите 7-ю строку. Кисть в формате для первых 7 строк несколько раз. Затем сделайте большую часть кисти, копируя формат, пока не закончите. Каждая 7-я строка должна быть выделена. Фильтруйте по цвету, а затем скопируйте и вставьте (вставьте значения) из выделенных ячеек в новый лист.

1 голос
/ 17 октября 2008

Создайте макрос и используйте следующий код, чтобы получить данные и поместить их на новый лист (Лист 2):

Dim strValue As String
Dim strCellNum As String
Dim x As String
x = 1

For i = 1 To 700 Step 7
    strCellNum = "A" & i
    strValue = Worksheets("Sheet1").Range(strCellNum).Value
    Debug.Print strValue
    Worksheets("Sheet2").Range("A" & x).Value = strValue
    x = x + 1
Next

Дайте мне знать, если это поможет! JFV

0 голосов
/ 30 марта 2016

Если ваши исходные данные представлены в виде столбцов с несколькими столбцами и первой записью исходных данных в C42, и вы хотите, чтобы ваши новые данные (с пониженной выборкой) были также в форме столбцов, но только в каждой седьмой строке тогда вам также нужно будет вычесть номер строки первой записи, например:

=OFFSET(C$42,(ROW(C42)-ROW(C$42))*7,0)
0 голосов
/ 17 октября 2008

Добавьте новый столбец и заполните его возрастающими числами. Затем отфильтруйте по ([column] mod 7 = 0) или что-то в этом роде (у меня нет Excel передо мной, чтобы попробовать);

Если вы не можете фильтровать по формуле, добавьте еще один столбец и используйте в нем формулу = MOD ([column; 7]), затем отфильтруйте нули, и вы получите все седьмые строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...