Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA复制多个工作表并粘贴到另一个工作表_Vba_Excel - Fatal编程技术网

VBA复制多个工作表并粘贴到另一个工作表

VBA复制多个工作表并粘贴到另一个工作表,vba,excel,Vba,Excel,我试着制作一个宏来遍历每一张纸,在每一张纸上,从B4:Y复制到最后一行,然后从B4开始粘贴到一个名为“Total”的纸上 例如: 我有5张纸,名字是:a,b,c,d,e。我的宏应该复制并粘贴 B4:Y54处“a”起50行,B55:Y115处“b”起60行……以此类推 开 我试着在网上查找,但我的代码无法正常工作。请帮忙,非常感谢 Sub TransferData() Dim LTot As Integer ' represents the line in the total tab

我试着制作一个宏来遍历每一张纸,在每一张纸上,从B4:Y复制到最后一行,然后从B4开始粘贴到一个名为“Total”的纸上

例如:

我有5张纸,名字是:a,b,c,d,e。我的宏应该复制并粘贴 B4:Y54处“a”起50行,B55:Y115处“b”起60行……以此类推 开

我试着在网上查找,但我的代码无法正常工作。请帮忙,非常感谢

Sub TransferData()
    Dim LTot As Integer ' represents the line in the total tab
    Dim WsTot As Worksheet ' represents your sheet tab
    Dim i As Integer

    Set WsTot = ThisWorkbook.Sheets("Total") 'declare your Total tab
    WsTot.Range("B4:Y10000").Clear ' clear the old data

    For i = 1 To 5 ' numbers of your tabs
        With ThisWorkbook.Sheets("" & i)
            .Range(.Cells(4, 2), .Cells(.Range("B10000").End(xlUp).Rows, 25)).Copy WsTot.Cells(LTot, 2)
            LTot = LTot + .Range("B10000").End(xlUp).Rows - 4
        End With
    Next

End Sub

您的总计工作表需要称为总计,它将在工作簿的所有活动工作表中循环

Option Explicit
Sub Outlier()
Dim ws As Worksheet
Dim wsc As Workbook

Set wsc = Workbooks(ActiveWorkbook.name)
For Each ws In ActiveWorkbook.Worksheets
    If ws.name <> "Total" And Sheets("Total").Range("A1") = vbNullString Then
    ws.Range("A1:" & ws.Range("A1").SpecialCells(xlCellTypeLastCell).Address).Copy Destination:=Sheets("Total").Range("A1")
    ElseIf ws.name <> "Total" And Sheets("Total").Range("A1") <> vbNullString Then
    ws.Range("A1:" & ws.Range("A1").SpecialCells(xlCellTypeLastCell).Address).Copy Destination:=Sheets("Total").Range("A1").End(xlDown).Offset(1, 0)
    End If
Next
End Sub
选项显式
次离群值()
将ws设置为工作表
将wsc设置为工作簿
设置wsc=工作簿(ActiveWorkbook.name)
对于ActiveWorkbook.Worksheets中的每个ws
如果ws.name“Total”和Sheets(“Total”).Range(“A1”)=vbNullString,则
ws.Range(“A1:”&ws.Range(“A1”)。特殊单元格(xlCellTypeLastCell)。地址)。复制目的地:=工作表(“总计”)。范围(“A1”)
ElseIf ws.name“Total”和Sheets(“Total”).Range(“A1”)vbNullString然后
ws.Range(“A1:”&ws.Range(“A1”)。特殊单元格(xlCellTypeLastCell)。地址)。复制目的地:=工作表(“总计”)。范围(“A1”)。结束(xlDown)。偏移量(1,0)
如果结束
下一个
端接头
如果您想做特定的列,那么您需要清楚所有的列名,但是您需要做如下操作

Set wsc = Workbooks(ActiveWorkbook.name)
For Each ws In ActiveWorkbook.Worksheets
    If ws.name <> "Total" And Sheets("Total").Range("A1") = vbNullString Then
    ws.Range("B1:B" & ws.Range("B1").SpecialCells(xlCellTypeLastCell).row).Copy Destination:=Sheets("Total").Range("B1")
    ElseIf ws.name <> "Total" And Sheets("Total").Range("A1") <> vbNullString Then
    ws.Range("B1:B" & ws.Range("A1").SpecialCells(xlCellTypeLastCell).oww).Copy Destination:=Sheets("Total").Range("B1").End(xlDown).Offset(1, 0)
    End If
Next
End Sub
Set wsc=工作簿(ActiveWorkbook.name)
对于ActiveWorkbook.Worksheets中的每个ws
如果ws.name“Total”和Sheets(“Total”).Range(“A1”)=vbNullString,则
ws.Range(“B1:B”和ws.Range(“B1”).SpecialCells(xlCellTypeLastCell).row)。复制目的地:=工作表(“总计”).Range(“B1”)
ElseIf ws.name“Total”和Sheets(“Total”).Range(“A1”)vbNullString然后
ws.Range(“B1:B”和ws.Range(“A1”)。特殊单元格(xlCellTypeLastCell).oww)。复制目的地:=工作表(“总计”)。Range(“B1”)。End(xlDown)。偏移量(1,0)
如果结束
下一个
端接头

以下代码将按照您在问题中所述执行。您的代码中有一些问题,我没有在此基础上构建代码,而是以自己的方式重写了代码

Sub TransposeData()
    Dim wsList() As String, wsName As Variant, ws As Worksheet
    Dim wsTotal As Worksheet: Set wsTotal = ThisWorkbook.Sheets("Total")
    Dim minRow As Long, maxRow As Long, nextRow As Long

    wsList = Split("a,b,c,d,e", ",")

    For Each wsName In wsList
        Set ws = ThisWorkbook.Sheets(wsName)
        maxRow = ws.Range("B" & ws.Rows.Count).End(xlUp).Row
        Select Case wsName
            Case "a"
                minRow = 4
            Case "b"
                minRow = 55
            Case "c"
                minRow = 116
            Case "d"
                minRow = 171
            Case "e"
                minRow = 181
        End Select

        nextRow = wsTotal.Range("B" & wsTotal.Rows.Count).End(xlUp).Row + 1

        ws.Range("B" & minRow & ":Y" & maxRow).Copy wsTotal.Range("B" & nextRow)
    Next wsName
End Sub
下面是为满足OPs特定需求而定制的相同代码:

Sub TransposeData()
    Dim wsList() As String, wsName As Variant, ws As Worksheet
    Dim wsTotal As Worksheet: Set wsTotal = ThisWorkbook.Sheets("Total")
    Dim minRow As Long, maxRow As Long, nextRow As Long

    wsList = Split("Engineering Salary,Mailroom Salary,Reception Salary,D0 Salary,Dock Worker Salary", ",")

    For Each wsName In wsList
        Set ws = ThisWorkbook.Sheets(wsName)
        maxRow = ws.Range("B" & ws.Rows.Count).End(xlUp).Row
        Select Case wsName
            Case "Engineering Salary"
                minRow = 1
            Case "Mailroom Salary"
                minRow = 1
            Case "Reception Salary"
                minRow = 1
            Case "D0 Salary"
                minRow = 1
            Case "Dock Worker Salary"
                minRow = 1
        End Select

        nextRow = wsTotal.Range("B" & wsTotal.Rows.Count).End(xlUp).Row + 1

        ws.Range("B" & minRow & ":Y" & maxRow).Copy 
        wsTotal.Range("B" & nextRow).PasteSpecial xlPasteValues
        Application.CutCopyMode = xlCopy
    Next wsName
End Sub
我的工作表选项卡如下所示:

5张纸中的每一张在B1单元中分别有1、2、3、4、5张。运行代码后,我的“总计”表如下所示:


请提出一个问题,并发布您迄今为止尝试过的代码。我可以使用什么代码生成上述请求?谢谢到目前为止你试过什么代码?(这不是一个代码编写服务。)@Cassie.L你是想让我们给你代码,还是想让我们帮助你理解为什么你的代码不起作用?对不起,我编辑了我的帖子。谢谢你的回复。如果我有几个选项卡,并且我只想复制特定的选项卡“a、b、c、d、e”,我应该更改什么?与其使用ws.name“Total”,不如使用If ws.name=“name of SHEET1 YOU want”和ws.name=“name of SHEET2 YOU want”,然后继续添加and,但我会听Tyeler的,这是一个更好的答案谢谢!我会给它一个尝试,在每个标签页上都会有不同的行数,它会相应地改变,这只是一个例子,我想在第一个“50行”之后粘贴第二个标签页哦,所以范围不会增加到每页设定的数量?不,它在每个标签页上都有不同的行tabs@Cassie.L更新了代码。只需将最小/最大行更改为该工作表上范围的最小/最大值。非常感谢!!!!!!