【问题标题】:excel vba - specific copy/paste row to another sheet with all kind of shapes if conditions are metexcel vba - 如果满足条件,将特定行复制/粘贴到具有各种形状的另一张表
【发布时间】:2015-09-30 08:17:43
【问题描述】:

我有非常具体的情况。如果该行中的列“AD”在单元格“NOK”中标记“x”或“X”,我需要将每一行从 sheet1(ot.2)复制到 sheet2(odch.l.2)。形状必须与数据保持一致。

到目前为止,无论是否存在 x 或 X,我都设法复制了所有形状,而数据取决于是否存在 x 或 X - 但是数据和形状没有粘在一起 - 数据被一个接一个地排序,形状被复制按源表中的位置

我不知道如何继续,我是这方面的新手,我会很感激各种帮助。

如果你需要更多信息,请告诉我,我会一直看这个帖子:-D 谢谢

这是我的代码:

 Sub test150929()

Application.ScreenUpdating = False

    Dim DestSheet        As Worksheet
    Dim Destsheet2       As Worksheet
    Set DestSheet = Worksheets("odch.l.2")
    Set Destsheet2 = Worksheets("ot.2")
    Dim sRow       As Long     'row index on source worksheet
    Dim dRow       As Long     'row index on destination worksheet
    Dim sCount     As Long
    Dim Range_to As Integer
    Dim Cell As String
    Dim oneShape As Shape
    Dim myLeft As Single, myTop As Single

    sCount = 0
    dRow = 16


            'DestSheet.Select
            'Cell = Range("AM12")
            'Range(Cells(15, 1), Cells(Cell, 39)).Select


            Destsheet2.Select
            Cell = "A15:AM" & Range("AM12")
            Range_to = Range("AM12")

            For Each oneShape In Destsheet2.Shapes
         With oneShape
             myLeft = .Left
             myTop = .Top
             .Copy
         End With
         With DestSheet
             .Paste
             With .Shapes(.Shapes.Count)
                 .Top = myTop
                 .Left = myLeft
             End With
         End With
     Next oneShape


    Destsheet2.Select
            For sRow = 1 To Range_to
                'use pattern matching to find "X" anywhere in cell
                If Cells(sRow, "AD") Like "*X*" Then
                    sCount = sCount + 1


                    Cells(sRow, "A").Copy Destination:=DestSheet.Cells(dRow, "A")
                    Cells(sRow, "B").Copy Destination:=DestSheet.Cells(dRow, "B")
                    Cells(sRow, "C").Copy Destination:=DestSheet.Cells(dRow, "C")
                    Cells(sRow, "D").Copy Destination:=DestSheet.Cells(dRow, "D")
                    Cells(sRow, "E").Copy Destination:=DestSheet.Cells(dRow, "E")
                    Cells(sRow, "F").Copy Destination:=DestSheet.Cells(dRow, "F")
                    Cells(sRow, "G").Copy Destination:=DestSheet.Cells(dRow, "G")
                    Cells(sRow, "H").Copy Destination:=DestSheet.Cells(dRow, "H")
                    Cells(sRow, "I").Copy Destination:=DestSheet.Cells(dRow, "I")
                    Cells(sRow, "J").Copy Destination:=DestSheet.Cells(dRow, "J")
                    Cells(sRow, "K").Copy Destination:=DestSheet.Cells(dRow, "K")
                    Cells(sRow, "L").Copy Destination:=DestSheet.Cells(dRow, "L")
                    Cells(sRow, "M").Copy Destination:=DestSheet.Cells(dRow, "M")
                    Cells(sRow, "N").Copy Destination:=DestSheet.Cells(dRow, "N")
                    Cells(sRow, "O").Copy Destination:=DestSheet.Cells(dRow, "O")
                    Cells(sRow, "P").Copy Destination:=DestSheet.Cells(dRow, "P")
                    Cells(sRow, "Q").Copy Destination:=DestSheet.Cells(dRow, "Q")
                    Cells(sRow, "R").Copy Destination:=DestSheet.Cells(dRow, "R")
                    Cells(sRow, "S").Copy Destination:=DestSheet.Cells(dRow, "S")
                    Cells(sRow, "T").Copy Destination:=DestSheet.Cells(dRow, "T")
                    Cells(sRow, "U").Copy Destination:=DestSheet.Cells(dRow, "U")
                    Cells(sRow, "V").Copy Destination:=DestSheet.Cells(dRow, "V")
                    Cells(sRow, "W").Copy Destination:=DestSheet.Cells(dRow, "W")
                    Cells(sRow, "X").Copy Destination:=DestSheet.Cells(dRow, "X")
                    Cells(sRow, "Y").Copy Destination:=DestSheet.Cells(dRow, "Y")
                    Cells(sRow, "Z").Copy Destination:=DestSheet.Cells(dRow, "Z")
                    Cells(sRow, "AA").Copy Destination:=DestSheet.Cells(dRow, "AA")
                    Cells(sRow, "AB").Copy Destination:=DestSheet.Cells(dRow, "AB")
                    Cells(sRow, "AC").Copy Destination:=DestSheet.Cells(dRow, "AC")
                    Cells(sRow, "AD").Copy Destination:=DestSheet.Cells(dRow, "AD")
                    Cells(sRow, "AE").Copy Destination:=DestSheet.Cells(dRow, "AE")
                    Cells(sRow, "AF").Copy Destination:=DestSheet.Cells(dRow, "AF")
                    Cells(sRow, "AG").Copy Destination:=DestSheet.Cells(dRow, "AG")
                    Cells(sRow, "AH").Copy Destination:=DestSheet.Cells(dRow, "AH")
                    Cells(sRow, "AI").Copy Destination:=DestSheet.Cells(dRow, "AI")
                    Cells(sRow, "AJ").Copy Destination:=DestSheet.Cells(dRow, "AJ")
                    Cells(sRow, "AK").Copy Destination:=DestSheet.Cells(dRow, "AK")
                    Cells(sRow, "AL").Copy Destination:=DestSheet.Cells(dRow, "AL")
                    Cells(sRow, "AM").Copy Destination:=DestSheet.Cells(dRow, "AM")


                End If

                If Cells(sRow, "AD") Like "*x*" Then

                    sCount = sCount + 1
                    dRow = dRow + 1
                    'copy cols A,F,E & D
                    Cells(sRow, "A").Copy Destination:=DestSheet.Cells(dRow, "A")
                    Cells(sRow, "B").Copy Destination:=DestSheet.Cells(dRow, "B")
                    Cells(sRow, "C").Copy Destination:=DestSheet.Cells(dRow, "C")
                    Cells(sRow, "D").Copy Destination:=DestSheet.Cells(dRow, "D")
                    Cells(sRow, "E").Copy Destination:=DestSheet.Cells(dRow, "E")
                    Cells(sRow, "F").Copy Destination:=DestSheet.Cells(dRow, "F")
                    Cells(sRow, "G").Copy Destination:=DestSheet.Cells(dRow, "G")
                    Cells(sRow, "H").Copy Destination:=DestSheet.Cells(dRow, "H")
                    Cells(sRow, "I").Copy Destination:=DestSheet.Cells(dRow, "I")
                    Cells(sRow, "J").Copy Destination:=DestSheet.Cells(dRow, "J")
                    Cells(sRow, "K").Copy Destination:=DestSheet.Cells(dRow, "K")
                    Cells(sRow, "L").Copy Destination:=DestSheet.Cells(dRow, "L")
                    Cells(sRow, "M").Copy Destination:=DestSheet.Cells(dRow, "M")
                    Cells(sRow, "N").Copy Destination:=DestSheet.Cells(dRow, "N")
                    Cells(sRow, "O").Copy Destination:=DestSheet.Cells(dRow, "O")
                    Cells(sRow, "P").Copy Destination:=DestSheet.Cells(dRow, "P")
                    Cells(sRow, "Q").Copy Destination:=DestSheet.Cells(dRow, "Q")
                    Cells(sRow, "R").Copy Destination:=DestSheet.Cells(dRow, "R")
                    Cells(sRow, "S").Copy Destination:=DestSheet.Cells(dRow, "S")
                    Cells(sRow, "T").Copy Destination:=DestSheet.Cells(dRow, "T")
                    Cells(sRow, "U").Copy Destination:=DestSheet.Cells(dRow, "U")
                    Cells(sRow, "V").Copy Destination:=DestSheet.Cells(dRow, "V")
                    Cells(sRow, "W").Copy Destination:=DestSheet.Cells(dRow, "W")
                    Cells(sRow, "X").Copy Destination:=DestSheet.Cells(dRow, "X")
                    Cells(sRow, "Y").Copy Destination:=DestSheet.Cells(dRow, "Y")
                    Cells(sRow, "Z").Copy Destination:=DestSheet.Cells(dRow, "Z")
                    Cells(sRow, "AA").Copy Destination:=DestSheet.Cells(dRow, "AA")
                    Cells(sRow, "AB").Copy Destination:=DestSheet.Cells(dRow, "AB")
                    Cells(sRow, "AC").Copy Destination:=DestSheet.Cells(dRow, "AC")
                    Cells(sRow, "AD").Copy Destination:=DestSheet.Cells(dRow, "AD")
                    Cells(sRow, "AE").Copy Destination:=DestSheet.Cells(dRow, "AE")
                    Cells(sRow, "AF").Copy Destination:=DestSheet.Cells(dRow, "AF")
                    Cells(sRow, "AG").Copy Destination:=DestSheet.Cells(dRow, "AG")
                    Cells(sRow, "AH").Copy Destination:=DestSheet.Cells(dRow, "AH")
                    Cells(sRow, "AI").Copy Destination:=DestSheet.Cells(dRow, "AI")
                    Cells(sRow, "AJ").Copy Destination:=DestSheet.Cells(dRow, "AJ")
                    Cells(sRow, "AK").Copy Destination:=DestSheet.Cells(dRow, "AK")
                    Cells(sRow, "AL").Copy Destination:=DestSheet.Cells(dRow, "AL")
                    Cells(sRow, "AM").Copy Destination:=DestSheet.Cells(dRow, "AM")



                End If
            Next sRow
    MsgBox sCount & " Rows Copied", vbInformation, "Transfer Done"





End Sub

【问题讨论】:

  • 有没有不使用Cells(sRow, "A").RESIZE(1, 39).Copy Destination:=DestSheet.Cells(dRow, "A")的原因
  • 如果您复制整行,为什么不使用DestSheet2.Rows(sRow).Copy destination:=DestSheet.Rows(dRow)?顺便说一句,您的代码在 X 情况下没有增加 dRow,您可以考虑 x 和 X 情况。
  • 正如我所说的伙计们,我是 vba 新手。感谢您的建议,会尝试并告诉您
  • 同意@VincentG - 我的想法是If LCase(.Cells(sRow, "AD").Value2) Like "*x*" Then
  • a) 是否可以相信形状的.Top 与行具有相同的.Top? b) 每行是否要复制多个形状?

标签: vba excel conditional-statements excel-2003


【解决方案1】:

就我而言,假设形状不高于一行,以下代码工作正常。

Public Sub test()
    Dim sRange As Range
    Dim dst As Worksheet, src As Worksheet
    Dim dRow As Long, sRow As Long, lastRow As Long
    Dim sCount As Long

    Set dst = Worksheets("odch.l.2") 'Destination worksheet
    Set src = Worksheets("ot.2") 'Source worksheet
    sRow = 1 'Starting source row
    dRow = 16 'Starting destination row
    lastRow = 12 'Last row to copy

    Dim shp As Shape
    'Ensure Shapes are moved with cells
    For Each shp In src.Shapes
        shp.Placement = xlMove
    Next shp

    sCount = 0
    For sRow = sRow To lastRow
    If Cells(sRow, 30) Like "*[Xx]*" Then
        src.Rows(sRow).Select 'Select current and all linked rows
         Selection.Copy Destination:=dst.Rows(dRow)
        'lookup to copy shape
        sCount = sCount + 1 'should it count as 1 or more?
        dRow = dRow + Selection.Rows.Count ' Move down by the number of rows in the selection
        sRow = sRow + Selection.Rows.Count - 1 'Skip the linked rows so that we don't duplicate them
    End If
    Next sRow
    MsgBox sCount & " Rows Copied", vbInformation, "Transfer Done"
    Set src = Nothing
    Set dst = Nothing

End Sub

【讨论】:

  • 工作绝对是伟大的人,但是 :-D 一些合并的单元格存在问题 - 有没有办法复制具有形状和单元格格式的单元格?
  • 已经用“Paste:=xlPasteFormats”查找方法“pastespecial”,遗憾的是我是菜鸟,我不确定如何在上面的代码中实现它,当没有“复制/粘贴”时” 但是“复制而不粘贴” :-D 有人请吗?
  • 您的合并单元格是否位于多行?
  • 由于您正在复制整行,合并列应该不是问题,但合并行可能是问题。我看到的唯一解决方法是Select 行,因为它将选择由合并单元格链接的所有行。请参阅我的更新答案。
  • 也许我做错了什么,但它不起作用。数据和形状仍以与以前相同的方式复制。完全不复制行上的合并单元格
【解决方案2】:

没有提供足够的关于性质、位置和与Shape objects 上的行的关系的信息,所以我不得不做出一些假设。

Sub test150929()
    Dim DestSheet        As Worksheet
    Dim Destsheet2       As Worksheet
    Dim sRow       As Long     'row index on source worksheet
    Dim dRow       As Long     'row index on destination worksheet
    Dim sCount     As Long
    Dim Range_to As Integer
    Dim Cell As String
    Dim oneShape As Shape
    Dim myLeft As Single, myTop As Single
    Dim dSHAPEs As Object, vSHAPE As Variant

    Application.ScreenUpdating = False

    sCount = 0
    dRow = 16

    Set DestSheet = Worksheets("odch.l.2")
    Set Destsheet2 = Worksheets("ot.2")
    Set dSHAPEs = CreateObject("Scripting.Dictionary")

    For Each oneShape In Destsheet2.Shapes
        With oneShape
            If Not dSHAPEs.exists(.Top) Then
                dSHAPEs.Add Key:=.Top, Item:=Join(Array(.Name, .Top, .Left), Chr(124))
            End If
        End With
     Next oneShape

    With Destsheet2
        Range_to = .Range("AM12")
        For sRow = 1 To Range_to
            'use pattern matching to find "X" anywhere in cell
            If LCase(.Cells(sRow, "AD").Value2) Like "*x*" Then
                sCount = sCount + 1
                dRow = dRow + 1
                'copy cols A,F,E & D
                .Cells(sRow, "A").Resize(1, 39).Copy Destination:=DestSheet.Cells(dRow, "A")
                If dSHAPEs.exists(.Cells(sRow, "A").Top) Then
                    vSHAPE = Split(dSHAPEs.Item(.Cells(sRow, "A").Top), Chr(124))
                    .Shapes(vSHAPE(0)).Copy
                    With DestSheet
                        .Paste
                        With .Shapes(.Shapes.Count)
                            .Top = .Parent.Cells(dRow, "A").Top
                            .Left = Destsheet2.Shapes(vSHAPE(0)).Left
                        End With
                    End With
                End If
            End If
        Next sRow
    End With
    MsgBox sCount & " Rows Copied", vbInformation, "Transfer Done"

End Sub

我为源工作表上的每个形状创建了一个包含.Top 维度的字典。字典使用唯一索引,因此如果 a) 形状的 .Top 与要复制的行不同,并且 b) 有每行要复制多个形状。

话虽如此,该框架是健全且经过测试的。如果这对您不起作用,也许您可​​以调整方法,因为您可以获得有关形状的更多详细信息。您可能必须以不同的方式收集形状及其属性,然后为每个复制的行循环遍历每个形状,看看它是否应该与行一起复制。这只是猜测,但就形状而言,我是盲目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多