将多个工作表中的单行复制到新工作表中

时间:2018-07-01 16:54:27

标签: excel vba excel-vba

我不是开发人员,但是最近被聘用为新创建的职位,这意味着我正在尝试从头开始创建报告和以前从未做过的事情。 IT部门没有时间教我,因此我正在尝试学习VBA和Access和其他高级数据分析工具,但是我还不了解如何编写所需的代码。我使用了这些论坛中的一些内容,但我很幸运,几乎可以复制并粘贴以获得所需的内容。

我从这个论坛复制了此内容(第二个答案):copy the same row from multiple sheets into one sheet in excel

这是我复制的代码:

Sub copyrow()
Dim Nrow As Long, Nsheet As Long
Dim i As Long

Nrow = 7
Nsheet = 6

For i = 1 To Nsheet - 1
    Sheets(i).Cells(Nrow, 1).EntireRow.Copy Sheets(Nsheet).Cells(i, 1)
Next i
End Sub

我对其进行了测试并成功运行,但是我没有意识到Nsheet意味着它将转到第6张表并替换那里的数据。所以我再次开始,在其他人的前面打开了一个空白工作表。我所做的只是将Nrow更改为6,因为那是我要复制的行。然后我将Nsheet更改为1,以便将结果放在第一张纸上。一旦我对Nsheet进行了更改,它将无法正常工作。我对代码的了解不足,无法知道我做错了什么。

这是我的代码现在的样子:

Sub copyrow()
Dim Nrow As Long, Nsheet As Long
Dim i As Long

Nrow = 6
Nsheet = 1

For i = 1 To Nsheet - 1
    Sheets(i).Cells(Nrow, 1).EntireRow.Copy Sheets(Nsheet).Cells(i, 1)
Next i
End Sub

但是当我运行它时,什么也没发生。我目前将代码粘贴到第一个工作表中。我以为也许应该将代码添加到另一个工作表中,但这在尝试运行时给了我一个错误。我不知道这是否重要。我真的很愚蠢,可以肯定这只是小事,所以请随时滚动眼睛。

谢谢!

2 个答案:

答案 0 :(得分:0)

浏览表格

从第2张到第6页循环以收集 数据。 Nsheet现在更改回6,并且循环将i从2增加到6。如果您可以可以删除“ Nsheet”分配并将For循环更改为For i = 2 to 6,则其工作原理相同。 / p>

使代码动态适应

如果每个电子表格的张数发生变化,则可以使用Sheets.Count代替指定6

.Cells(i - 1, 1)中,添加了-1是因为i被重用了。 i在遍历工作表收集数据时用作工作表参考;在这里,它被重新用作行号变量。 Sheet2数据将添加到sheet1的第1行,sheet3数据将添加到sheet1的第2行,依此类推。如果sheet1上有标题,则可以删除-1

Sub copyrow()
    Dim Nrow As Long, Nsheet As Long
    Dim i As Long

    Nrow = 7
    Nsheet = 6

    For i = 2 To Nsheet
        Sheets(i).Cells(Nrow, 1).EntireRow.Copy Sheets(1).Cells(i - 1, 1)
    Next i
End Sub

答案 1 :(得分:0)

  

昏昏欲睡,Nsheet漫长
昏昏欲睡

您在这里的位置正确。始终使用Long;永远不要使用整数。整数不是很酷,并且无形地破坏您的代码比其他任何东西都快。多头很酷,不会因为愚蠢的原因而破坏您的代码。

  

...,并在其他页面的前面打开了一个空白工作表。

您的代码可以轻松做到这一点。

worksheets.add(before:=worksheets(1)).name = "All Rows"

如果第二次运行,则必须更改名称或首先删除名为“所有行”的现有工作表。

  

Nrow = 7
Nsheet = 6

您希望从所有其他工作表中复制第6行,因此NRow =6。Nsheet可用于保存工作簿中工作表的总数。

Nrow = 6
Nsheet = worksheets.count
  

对于i = 1到Nsheet-1
...
下一个i

您在队列的开头创建了一个新的工作表,以便从2开始处理其他工作表。循环浏览,直到达到工作表的总数,即上面分配的Nsheet。

for i=2 to Nsheet
    ' <copying code goes here>
next i
  

Sheets(i).Cells(Nrow,1).EntireRow.Copy Sheets(1).Cells(i-1,1)

现在应该“按原样”工作。我更喜欢使用工作表集合而不是工作表集合,因为图表页面,宏工作表等是工作表的成员,而不是工作表的成员。我通常还会添加Destination参数名称,因为它使代码更易于阅读。为了清楚起见,您可能希望使用列字母而不是列序号。

Worksheets(i).Cells(Nrow, "A").EntireRow.Copy Destination:=Worksheets(1).Cells(i - 1, "A")

将其全部放在公共模块代码表中,而不是工作表的私有代码表中。专用代码表有其用途,通常用于仅主要涉及该工作表的代码。该代码更适合于公共模块。

Sub copyrow()

    Dim Nrow As Long, Nsheet As Long
    Dim i As Long

    worksheets.add(before:=worksheets(1)).name = "All Rows"

    Nrow = 6    'row to copy
    Nsheet = worksheets.count  'the count AFTER adding the destination worksheet

    For i = 2 To Nsheet
        Worksheets(i).Cells(Nrow, "A").EntireRow.Copy Destination:=Worksheets(1).Cells(i - 1, "A")
    Next i

End Sub

缩进代码以提高可读性。

进入VBE的“工具”,“选项”,然后在“需要变量声明”旁边打勾。这会将Option Explicit放在您创建/插入的每个新代码表的顶部。它将为您节省数小时的无聊的错误拼写错误或遗漏。它也很有可能是您最大的节省时间的编码器。

enter image description here