【问题标题】:Excel VBA For-Next Loop to extract data from one WB to anotherExcel VBA For-Next 循环将数据从一个 WB 提取到另一个
【发布时间】:2016-09-24 23:04:31
【问题描述】:

我正在开发一个 for 循环,该循环根据第 12 列中等于“Airfare”的字符串提取整行数据。

这个想法是复制第 12 列 (EXPENSE_TYPE) 为 Airfare 的数据行并将其粘贴到第二个工作簿中。

下面的我的代码没有正确循环遍历所有 120 行数据。当我运行我的宏时,它只提取满足我的条件的第一行数据。如果你能找到我的问题,请告诉我。谢谢!

Sub exportDataToOtherWorkbook()
Dim lastRow As Long
Dim i As Long
Dim p As Integer
Dim q As Integer
Dim erow As Long

lastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

For i = 2 To lastRow
    If Cells(i, 12) = "Airfare" Then
    Range(Cells(i, 1), Cells(i, 16)).Select
    Selection.Copy


Workbooks.Open Filename:="C:\users\andrew.godish\Desktop\Practice Files\masterPracticeExtractDataWBtoWB.xlsx"

p = Worksheets.Count
    For q = 1 To p
        If ActiveWorkbook.Worksheets(q).Name = "Sheet2" Then
        Worksheets("Sheet2").Select
        End If
    Next q

    erow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

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

【问题讨论】:

  • 你从未初始化过lastRow,所以它是0
  • 抱歉,我没有完整地复制我的代码。现在是正确的,lastRow 变量现在已初始化。谢谢。
  • 啊,限定你的范围/单元格?编辑:当您在书籍/表格之间跳转时,计算机如何知道您的意思是哪个cells?例如,If Cells(i, 12) = "Airfare" Then

标签: vba excel for-loop


【解决方案1】:

我会建议一个替代循环遍历每一行的方法。循环非常低效,应尽可能避免。

假设您的数据存储在您从中复制的工作簿的“Sheet1”(更改以满足您的要求)上,您可以过滤第 12 列并使用更简单的命令复制所有数据,如下所示:

Sub Test()

        'Declare source and destination variables
        Dim sourceWB As Workbook, destWB As Workbook

        Set sourceWB = ThisWorkbook

        'Open the workbook to copy the data TO
        Workbooks.Open Filename:="C:\users\andrew.godish\Desktop\Practice Files\masterPracticeExtractDataWBtoWB.xlsx"
        Set destWB = ActiveWorkbook

        sourceWB.Sheets("Sheet1").Range("A1:P1").AutoFilter Field:=12, Criteria1:="Airfare"

        'The first offset on the copy is to avoid copying the headers each time, the second offset is to find the last row in the
        'list then offset to the next row. Copies data to new workbook
        sourceWB.Sheets("Sheet1").AutoFilter.Range.Offset(1).Copy Destination:=destWB.Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1)

        destWB.Save

        'Clear the filter from the source worksheet
        If sourceWB.Sheets("Sheet1").AutoFilterMode Then sourceWB.Sheets("Sheet1").ShowAllData

End Sub

我知道这并不能直接回答您的问题,但我认为这可能是一种更简单、不易出错的方法。

所以这个方法遵循以下步骤:

  • 打开目标工作簿
  • 在第 12 列过滤 Sheet1 以获取“机票”(如有必要,请务必更改 Sheet1
  • 将过滤后的范围复制并粘贴到目标工作表和工作簿
  • 删除应用于源工作表中第 12 列的过滤器

令人困惑的部分可能是Offset(1) 的使用。我在副本上使用它来避免复制列标题(它将复制区域向下偏移一行)。我在目的地使用它以避免覆盖最后一行(我们必须找到最后使用的行,然后向下递增一行)。

【讨论】:

  • 我喜欢!我可能添加的唯一更改是Set destWB=Workbooks.Open
  • @findwindow 这是我的第一次尝试,但由于某种原因,当我这样做时遇到了运行时错误。我不知道为什么,我可能犯了一个愚蠢的错误。
  • 嗯。奇怪的。没什么大不了的^_^;
  • @Soulfire - 我更喜欢这种方法。感谢您向我展示这个。
  • 没问题,碰巧我正在做一个需要过滤和复制数据的项目,所以这让我记忆犹新!如果您不介意单击绿色复选标记,如果这对我有帮助,我会很感激,它可以帮助其他用户知道我(偶尔)知道我在说什么。编码愉快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多