Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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,我在这里得到了关于这个问题的帮助: 但我需要给这艘潜艇添加另一个条件 当前发生的情况是,宏将复制工作簿中所有工作表的A列和B列中的数据,并将它们粘贴到摘要工作表的B列和C列中,A列中是从中复制数据的工作表的名称 但是,有两张图纸的B列中没有数据,因此,复制的唯一数据是第2行的数据。在下面的宏中,我添加了一个查找这两个图纸名称的条件,并将其从宏中排除,但我也需要对这些图纸应用相同的复制/粘贴方法 另外一个问题,我认为不是太大的问题,就是当复制第一张工作表时,它会删除摘要工作表上的标题,但是当复制

我在这里得到了关于这个问题的帮助:

但我需要给这艘潜艇添加另一个条件

当前发生的情况是,宏将复制工作簿中所有工作表的A列和B列中的数据,并将它们粘贴到摘要工作表的B列和C列中,A列中是从中复制数据的工作表的名称

但是,有两张图纸的B列中没有数据,因此,复制的唯一数据是第2行的数据。在下面的宏中,我添加了一个查找这两个图纸名称的条件,并将其从宏中排除,但我也需要对这些图纸应用相同的复制/粘贴方法

另外一个问题,我认为不是太大的问题,就是当复制第一张工作表时,它会删除摘要工作表上的标题,但是当复制其他每一张工作表时,它会粘贴在最后一个单元格下面,其中包含数据

代码如下:

Sub ThirdParty_CopySheetNameToColumn()

    Dim sh As Worksheet
    Dim DestSh As Worksheet
    Dim Last As Long
    Dim CopyRng As Range

    With Application

        .ScreenUpdating = False
        .EnableEvents = False

    End With

    'Delete the sheet "Summary" if it exist
    Application.DisplayAlerts = False
    On Error Resume Next
    ActiveWorkbook.Worksheets("Summary").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True

    'Add a worksheet with the name "Summary"
    Set DestSh = ActiveWorkbook.Worksheets.Add
    DestSh.Name = "Summary"

    'loop through all worksheets and copy the data to the DestSh
    For Each sh In ActiveWorkbook.Worksheets

        If sh.Name <> DestSh.Name And sh.Name <> "fakeSheet1" And sh.Name <> "fakeSheet2" Then

            'Find the last row with data on the DestSh
            Last = lastRow(DestSh)

            'Fill in the range that you want to copy
            Set CopyRng = sh.Range("A2", sh.Range("B" & Rows.count).End(xlUp))

            'Test if there enough rows in the DestSh to copy all the data
            If Last + CopyRng.Rows.count > DestSh.Rows.count Then

                MsgBox "There are not enough rows in the Destsh"
                GoTo ExitTheSub

            End If

            'This example copies values/formats, if you only want to copy the
            'values or want to copy everything look at the example below this macro
            CopyRng.Copy

            With DestSh.Cells(Last + 1, "B")

                .PasteSpecial xlPasteValues
                '.PasteSpecial xlPasteFormats
                Application.CutCopyMode = False

            End With

            This will copy the sheet name in the A column
            DestSh.Cells(Last + 1, "A").Resize(CopyRng.Rows.count).Value = sh.Name

        End If

    Next

ExitTheSub:

    Application.Goto DestSh.Cells(1)

    'AutoFit the column width in the DestSh sheet
    DestSh.Columns.AutoFit

    With Application

        .ScreenUpdating = True
        .EnableEvents = True

    End With

End Sub

Function lastRow(sh As Worksheet)
    On Error Resume Next
    lastRow = sh.Cells.Find(What:="*", _
                            After:=sh.Range("A1"), _
                            Lookat:=xlPart, _
                            LookIn:=xlFormulas, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False).Row
    On Error GoTo 0
End Function

Function lastCol(sh As Worksheet)
    On Error Resume Next
    lastCol = sh.Cells.Find(What:="*", _
                            After:=sh.Range("A1"), _
                            Lookat:=xlPart, _
                            LookIn:=xlFormulas, _
                            SearchOrder:=xlByColumns, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False).Column
    On Error GoTo 0
End Function
Sub-third party_copysheetnameto column()
将sh设置为工作表
将DestSh设置为工作表
持续时间一样长
暗拷贝As范围
应用
.ScreenUpdate=False
.EnableEvents=False
以
'删除工作表“摘要”(如果存在)
Application.DisplayAlerts=False
出错时继续下一步
Active工作簿。工作表(“摘要”)。删除
错误转到0
Application.DisplayAlerts=True
'添加名为“摘要”的工作表'
设置DestSh=ActiveWorkbook.Worksheets.Add
DestSh.Name=“摘要”
'循环浏览所有工作表并将数据复制到DestSh
对于ActiveWorkbook.工作表中的每个sh
如果sh.Name DestSh.Name和sh.Name“fakeSheet1”和sh.Name“fakeSheet2”,则
'查找DestSh上包含数据的最后一行
最后一行=最后一行(DestSh)
'填写要复制的范围
设置CopyRng=sh.Range(“A2”,sh.Range(“B”和Rows.count).End(xlUp))
'测试DestSh中是否有足够的行来复制所有数据
如果Last+CopyRng.Rows.count>DestSh.Rows.count,则
MsgBox“Destsh中没有足够的行”
下地狱
如果结束
'如果您只想复制
'值或要复制所有内容请参见此宏下面的示例
复制,复制
带目标单元格(最后+1,“B”)
.Paste特殊XLPaste值
'.Paste特殊XLPaste格式
Application.CutCopyMode=False
以
这将复制A列中的图纸名称
DestSh.Cells(Last+1,“A”).Resize(CopyRng.Rows.count).Value=sh.Name
如果结束
下一个
退出主题:
应用程序。转到DestSh。单元格(1)
'自动调整DestSh工作表中的列宽
DestSh.Columns.AutoFit
应用
.ScreenUpdate=True
.EnableEvents=True
以
端接头
函数lastRow(sh作为工作表)
出错时继续下一步
lastRow=sh.Cells.Find(内容:=“*”_
之后:=sh.Range(“A1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
错误转到0
端函数
函数lastCol(sh作为工作表)
出错时继续下一步
lastCol=sh.Cells.Find(内容:=“*”_
之后:=sh.Range(“A1”)_
看:=xlPart_
LookIn:=xl公式_
SearchOrder:=xlByColumns_
搜索方向:=xlPrevious_
MatchCase:=False)。列
错误转到0
端函数

这应该解决第一点——在CopyRng行中添加的注释

Sub ThirdParty_CopySheetNameToColumn()

Dim sh As Worksheet
Dim DestSh As Worksheet
Dim Last As Long
Dim CopyRng As Range

With Application
    .ScreenUpdating = False
    .EnableEvents = False
End With

Application.DisplayAlerts = False
On Error Resume Next
ActiveWorkbook.Worksheets("Summary").Delete
On Error GoTo 0
Application.DisplayAlerts = True

Set DestSh = ActiveWorkbook.Worksheets.Add
DestSh.Name = "Summary"
'Sample headers for DestSh
DestSh.Range("A1:C1").Value = Array("One", "Two", "Three")

For Each sh In ActiveWorkbook.Worksheets
    If sh.Name <> DestSh.Name Then
        Last = lastRow(DestSh)
        'Base the range on the number of rows in col A and resize to add col B
        Set CopyRng = sh.Range("A2", sh.Range("A" & Rows.Count).End(xlUp)).Resize(, 2)
        If Last + CopyRng.Rows.Count > DestSh.Rows.Count Then
            MsgBox "There are not enough rows in the Destsh"
            GoTo ExitTheSub
        End If
        CopyRng.Copy
        With DestSh.Cells(Last + 1, "B")
            .PasteSpecial xlPasteValues
            Application.CutCopyMode = False
        End With
        DestSh.Cells(Last + 1, "A").Resize(CopyRng.Rows.Count).Value = sh.Name
    End If
Next

ExitTheSub:
Application.Goto DestSh.Cells(1)
DestSh.Columns.AutoFit

With Application
    .ScreenUpdating = True
    .EnableEvents = True
End With

End Sub
Sub-third party_copysheetnameto column()
将sh设置为工作表
将DestSh设置为工作表
持续时间一样长
暗拷贝As范围
应用
.ScreenUpdate=False
.EnableEvents=False
以
Application.DisplayAlerts=False
出错时继续下一步
Active工作簿。工作表(“摘要”)。删除
错误转到0
Application.DisplayAlerts=True
设置DestSh=ActiveWorkbook.Worksheets.Add
DestSh.Name=“摘要”
'DestSh的示例标题
DestSh.Range(“A1:C1”).Value=数组(“一”、“二”、“三”)
对于ActiveWorkbook.工作表中的每个sh
如果sh.Name DestSh.Name那么
最后一行=最后一行(DestSh)
'根据列A中的行数调整范围,并调整大小以添加列B
设置CopyRng=sh.Range(“A2”,sh.Range(“A”和Rows.Count)。结束(xlUp))。调整大小(,2)
如果Last+CopyRng.Rows.Count>DestSh.Rows.Count,则
MsgBox“Destsh中没有足够的行”
下地狱
如果结束
复制,复制
带目标单元格(最后+1,“B”)
.Paste特殊XLPaste值
Application.CutCopyMode=False
以
DestSh.Cells(Last+1,“A”).Resize(CopyRng.Rows.Count).Value=sh.Name
如果结束
下一个
退出主题:
应用程序。转到DestSh。单元格(1)
DestSh.Columns.AutoFit
应用
.ScreenUpdate=True
.EnableEvents=True
以
端接头

关于第二个问题,您正在代码中创建工作表,因此当您开始创建工作表时,它将为空-我为一些标题添加了一行。

“(..)但我也需要对这些工作表应用相同的复制/粘贴方法。”-请指定您的问题。另外,不要发布你的全部代码,把它减少到你有问题的部分。你能设置copyRng=sh.Range(“A2”,sh.Range(“A”)和sh.Rows.Count)。结束(xlUp)。偏移量(,1))谢谢你的回复@QHarr。我看到SJR在下面的回答中也包含了您的建议。谢谢你:)谢谢@SJR。。我通信