【问题标题】:Copy every nth line from one sheet to another将每 n 行从一张纸复制到另一张纸
【发布时间】:2016-09-26 23:19:08
【问题描述】:

我有一个 1 列 700 行的 Excel 电子表格。我关心每七行。我不想进入并删除我关心的每一行之间的 6 行。所以我的解决方案是创建另一个工作表并指定对我想要的每个单元格的引用。

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

但我不想输入这些公式中的每一个......`100 次。我想如果我选择三个并拖动框,它会理解我想要做什么,但没有运气。

关于如何优雅/高效地做到这一点的任何想法?

【问题讨论】:

    标签: excel


    【解决方案1】:

    在新工作表的 A1 中,输入:

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

    ...然后复制下来。如果您从第 1 行以外的地方开始,请将 ROW() 更改为 ROW(A1) 或第 1 行的其他单元格,然后再次向下复制。

    如果要复制第n行但多列,请使用公式:

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

    这也可以直接复制。

    【讨论】:

    • 这个问题怎么能被浏览超过 104k 次,但这个答案只得到 50 次投票?我要求进行调查。
    • @JeromyFrench 可能是因为它不起作用?至少在我的 Excel 版本上没有。
    • 对我有用,一条路径有 5000 gps 坐标,细节太多 - 只需要 50 分 - 就像一个魅力!
    【解决方案2】:

    在我看来,这个问题的答案太具体了。这里尝试使用两种不同的方法和一个完整的示例来获得更一般的答案。

    OFFSET 方法

    OFFSET 接受 3 个强制参数。第一个是我们想要偏移的给定单元格。接下来的两个是我们想要偏移的行数和列数(向下和向右)。 OFFNET 返回由此产生的单元格的内容。例如,OFFSET(A1, 1, 2) 返回单元格 C2 的内容,因为 A1 是单元格 (1,1),如果我们将 (1,2) 添加到其中,我们将得到 (2,3)对应于单元格C2

    要让它从另一列中每隔 n 行返回一次,我们可以使用ROW 函数。当这个函数没有参数时,它返回当前单元格的行号。因此,我们可以将OFFSETROW 组合在一起,通过将乘数添加到ROW 返回的值来创建一个返回每个第n 个单元格的函数。例如OFFSET(A$1,ROW()*3,0)。请注意在目标单元格中​​使用$1。如果不使用,偏移量将从不同的单元格偏移,因此实际上将1 添加到乘数。

    ADDRESS + INDIRECT 方法

    ADDRESS 接受两个整数输入并将单元格的地址/名称作为字符串返回。例如,ADDRESS(1,1) 返回"$A$1"INDIRECT 获取单元格的地址并返回内容。例如,INDIRECT("A1") 返回单元格A1 的内容(它也接受带有$ 的输入)。如果我们在ADDRESS 中使用ROW 和一个乘数,我们可以得到每个第n 个单元格的地址。例如,第 1 行中的 ADDRESS(ROW(), 1) 将返回 "$A$1",第 2 行中将返回 "$A$2" 等等。所以,如果我们把它放在INDIRECT 中,我们可以得到每第 n 个单元格的内容。例如,INDIRECT(ADDRESS(1*ROW()*3,1)) 向下拖动时会返回第一列中每个第三个单元格的内容。

    示例

    考虑以下电子表格的屏幕截图。标题(第一行)包含以下行中使用的调用。 A 列包含我们的示例数据。在这种情况下,它只是正整数(计数在所示区域之外继续)。这些是我们希望每 3 次获得的值,即我们希望获得 1、4、7、10 等。

    B 包含使用OFFSET 方法的错误尝试,但我们忘记使用$。可以看出,当我们乘以 3 时,我们实际上每 4 行得到一次。

    C 包含使用OFFSET 方法的错误尝试,我们记得使用$,但忘记减去。因此,虽然我们确实获得了每 3 个值,但我们跳过了一些值(1 和 4)。

    D 列包含使用 OFFSET 方法的正确函数。

    E 列包含使用ADDRESS + INDRECT 方法的错误尝试,但我们忘记减去。因此,我们最初跳过了一些行。与列 C 相同的问题。

    F 列包含使用 ADDRESS + INDRECT 方法的正确函数。

    【讨论】:

      【解决方案3】:

      如果我遇到提取每 7 行的问题,我会在“A”列之前“插入”一列。然后我会(假设第 1 行有标题行)在第 2、3、4、5、6、7、8 行中输入数字 1、2、3、4、5、6、7,我会突出显示 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……。现在对列“A”进行数据升序排序。排序后,所有 1 将成为系列中的第一项,所有 7 将成为第七项。

      【讨论】:

      • 太棒了。谢谢。直截了当并避免使用宏......我应该指定的东西。偏移解决方案更优雅一些,但这种方法本来就很漂亮。再次感谢。
      【解决方案4】:

      插入一个新列并在 1,2,3,4 等中放入一个系列。然后创建另一个新列并使用命令 =if(int(a1/7)=(a1/7),1,0 ) 你应该在每 7 行得到一个 1,过滤 1 上的列

      【讨论】:

        【解决方案5】:

        突出显示第 7 行。将前 7 行的格式刷几次。然后做一大块画笔复制格式,直到你完成。每第 7 行应突出显示。按颜色过滤,然后从突出显示的单元格中复制并粘贴(粘贴值)到新工作表中。

        【讨论】:

        • 一种非常有创意的方式,在某些情况下非常有用。
        【解决方案6】:

        创建一个宏并使用以下代码抓取数据并将其放入新工作表(Sheet2)中:

        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
        

        如果这有帮助,请告诉我! 捷豹路虎

        【讨论】:

        • 看起来可行。我应该指定我宁愿避免使用宏。感谢您提交.​​..下次我将不得不重新整理我的 VBA 书以考虑解决方案。
        【解决方案7】:

        如果您的原始数据采用多列的列形式,并且原始数据在 C42 中的第一个条目,并且您希望新的(下采样)数据也采用列形式,但仅每第七行,那么你还需要减去第一个条目的行号,如下所示:

        =OFFSET(C$42,(ROW(C42)-ROW(C$42))*7,0)
        

        【讨论】:

          【解决方案8】:

          添加新列并用升序填充它。然后过滤 ([column] mod 7 = 0) 或类似的东西(我面前没有 Excel 来实际尝试这个);

          如果您无法按公式过滤,请再添加一列并在其中使用公式 =MOD([column; 7]) 然后过滤零,您将获得所有第七行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多