【问题标题】:Copy some rows from one workbook to another if some condition is met using macros如果使用宏满足某些条件,则将一些行从一个工作簿复制到另一个工作簿
【发布时间】:2018-02-26 23:51:15
【问题描述】:

我有一本工作簿。如果满足某些条件,我需要从一个工作簿中提取一些行并保存到另一个工作簿中。我在 workbook1 的 sheet2 中有一个列,它要么是“真”,要么是“假”。如果在 sheet2 中获得“true”并且需要将其复制到另一个工作簿(workbook2),我需要从 sheet1 复制所有行。对 sheet1 中的列执行 EXACT 函数后获得 True 或 False。

请注意,我的 sheet1 不会有固定的列长。

我的代码:

Sub mySales()

Dim LastRow As Integer, i As Integer, erow As Integer

LastRow = ActiveSheet.Range(“A” & Rows.Count).End(xlUp).Row

For i = 2 To LastRow

If Cells(i, 1) = Date And Cells(i, 2) = “Sales” Then
Range(Cells(i, 1), Cells(i, 7)).Select
Selection.Copy

Workbooks.Open Filename:=”C:\Users\takyar\Documents\salesmaster-new.xlsx”
Worksheets(“Sheet1”).Select
erow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

ActiveSheet.Cells(erow, 1).Select
ActiveSheet.Paste
ActiveWorkbook.Save
ActiveWorkbook.Close
Application.CutCopyMode = False
End If

Next i
End Sub

【问题讨论】:

  • 您的代码有什么问题?顺便说一句,您的报价是“智能报价”而不是常规报价:不知道在您的实际 VBA 项目中是否相同。
  • 注意:始终使用Long 而不是Integer,尤其是在处理行数时。 Excel 的行数超过了Integercan 处理的数量。使用Integer 也没有任何好处。

标签: vba excel


【解决方案1】:

您可以使用AutoFilter() 方法一次性完成,按照以下代码(cmets 中的解释):

Option Explicit

Sub mySales()
    With ActiveSheet ' reference "source" sheet
        With .Range("G1", .Cells(.Rows.Count, "A").End(xlUp))  'reference its column A:G cells from row 1 (header) down to last not empty one in column "A"
            .AutoFilter field:=1, Criteria1:="TRUE" ' filter referenced cells on 1st column with "TRU"E content
            If Application.WorksheetFunction.Subtotal(103, .Columns(1)) > 1 Then
                .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy ' copy filtered cells skipping headers
                With Workbooks.Open(Filename:="C:\Users\takyar\Documents\salesmaster-new.xlsx").Sheets("Sheet1") 'open wanted workbook and reference its wanted sheet
                    .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial 'paste filtered cells in referenced sheet from ist column A first empty cell after last not empty one
                    .Parent.Close True ' save and close referenced workbook
                End With
                Application.CutCopyMode = False
            End If
        End With
        .AutoFilterMode = False ' remove filters
    End With
End Sub

【讨论】:

  • .AutoFilter field:=1, Criteria1:=CStr(Date) ' 过滤第一列中当前日期内容的引用单元格 .AutoFilter field:=2, Criteria1:="Sales" 如何替换它检查 A 列中的每个单元格是否具有 TRUE ?
  • @qwww,你的意思是你不必匹配A列中的Date,而你必须匹配:1)A列中的True和B列中的“销售” ?
  • 不,我不需要匹配日期。相反,A 列将有 true 或 false ......所以如果它是 true,则必须将 sheet1 中的相应行复制到新工作簿。 .. 说在 sheet2 或 wb1 我有列 A 为真或假.. 如果 A5 为真,则必须将 sheet1 中的相应行(sheet1 中的 A5)复制到 wb2
  • @qwww,那么“B”列呢?您不再需要它来匹配“销售”?
  • oops...sorrt..sales 和 date 不是必需的...只需要检查真实情况
【解决方案2】:

您只需要打开一次目标工作簿。

例如:

Sub mySales()
    'use Const for fixed values
    Const WB_PATH As String = "C:\Users\takyar\Documents\salesmaster-new.xlsx"
    Dim srcSht As Worksheet, wb As Workbook, shtDest As Workbook, i As Long

    Set srcSht = ActiveSheet

    For i = 2 To srcSht.Range("A" & srcSht.Rows.Count).End(xlUp).Row
        If srcSht.Cells(i, 1) = Date And Cells(i, 2) = "Sales" Then
            'is the destination workbook already open? If not, open it
            If shtDest Is Nothing Then
                Set wb = Workbooks.Open(Filename:=WB_PATH)
                Set shtDest = wb.Sheets("Sheet1")
            End If
            srcSht.Cells(i, 1).Resize(1, 7).Copy _
                     shtDest.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
        End If
    Next i

    'save and close the destination workbook if it was opened
    If Not wb Is Nothing Then wb.Close True

End Sub

【讨论】:

  • 只是说在shtDest.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) 中,您实际上是在“计算”ActiveSheet 而不是shtDest 的行数。虽然一般来说,应注意明确引用想要的表格。我知道你知道,但可能 qwww 不知道
  • If srcSht.Cells(i, 1) = Date And Cells(i, 2) = "Sales" 那么如何替换它以检查 A 列中的每个单元格是否具有 TRUE ?跨度>
  • And Cells(i, 2) = True
  • @TimWilliams,甚至只有And Cells(i, 2),因为我们依赖A列的值为Boolean
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多