我不是开发人员,但是最近被聘用为新创建的职位,这意味着我正在尝试从头开始创建报告和以前从未做过的事情。 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
但是当我运行它时,什么也没发生。我目前将代码粘贴到第一个工作表中。我以为也许应该将代码添加到另一个工作表中,但这在尝试运行时给了我一个错误。我不知道这是否重要。我真的很愚蠢,可以肯定这只是小事,所以请随时滚动眼睛。
谢谢!
答案 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
放在您创建/插入的每个新代码表的顶部。它将为您节省数小时的无聊的错误拼写错误或遗漏。它也很有可能是您最大的节省时间的编码器。