Excel 2013 - 如何根据格式将数据从一个工作表复制到另一个工作表

时间:2014-02-17 11:44:53

标签: excel vba excel-vba

我有一张带有值的Excel工作表,我想自动仅将突出显示的值(使用背景颜色格式化)复制到另一个工作表。 我不介意使用宏,或者如果可能的话,在第二个单元格中使用函数。

我试图将一些建议放在一起并创建一个函数来返回单元格颜色,然后按照颜色值过滤下面的宏:

Sub Sample()
    Dim ws As Worksheet
    Dim strSearch As String
    Dim lRow As Long

    Set ws = Sheets("Sheet1")

    With ws
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Remove any filters
        .AutoFilterMode = False

        '~~> Filter, offset(to exclude headers) and set the source location
        With .Range("J2:J" & lRow)
             .AutoFilter Field:=1, Criteria1:="6"
             Set copyFrom = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
        End With

        '~~> Remove any filters
        .AutoFilterMode = False
    End With

    '~~> Destination Sheet
    Set ws2 = Sheets("Sheet2")
    With ws2
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            lRow = .Cells.Find(What:="*", _
                      After:=.Range("A1"), _
                      Lookat:=xlPart, _
                      LookIn:=xlFormulas, _
                      SearchOrder:=xlByRows, _
                      SearchDirection:=xlPrevious, _
                      MatchCase:=False).Row
        Else
            lRow = 1
        End If

        copyFrom.Copy .Rows(lRow)
    End With
End Sub

Function InteriorColor(CellColor As Range)
    InteriorColor = CellColor.Interior.ColorIndex
End Function

但是,我需要从多张工作表复制到单张工作表,并且宏指出源工作表是常量...我不想为每张单独的工作表创建一个宏。

此外,每次我将运行宏时,它将复制已经复制的高亮显示的行,从而在目标表中创建重复项。

我已经查看了很多有关此问题的SO帖子,但找不到任何符合我需求的帖子。

有人可以建议如何更改此代码或使用新的优化代码吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

首先,我认为这应该分为两个问题:

从不同的工作表导入

如果要从不同工作表导入,则应编写函数以接受工作表作为参数。

Sub Sample(ws As Excel.Worksheet)

然后您需要删除行Dim ws As WorksheetSet ws = Sheets("Sheet1"),否则您将收到错误或意外行为。

然后你需要另一个循环遍历所有工作表并调用 Sample(Worksheet)过程的函数。

Sub SampleCaller()
  dim e, ws as Excel.Worksheet
  For Each e in ThisWorkbook.Sheets
    Set ws = e
    Call Sample(ws)
  Next e
  Set ws = Nothing
End Sub

在目标工作表中查找已存在的行

您已使用Range.Find method (Link) 您可以使用它来查找目标工作表中已有的元素 在调用copyFrom.Copy .Rows(lRow)之前,您应该使用Range.Find来确定是否需要复制此值。

也许您应该为第二个问题创建另一个主题,或者使用搜索功能。