【问题标题】:Import data from one workbook to another within a date range在日期范围内将数据从一个工作簿导入到另一个工作簿
【发布时间】:2025-12-03 06:15:01
【问题描述】:

我打开我的工作簿 (ThisWorkbook),通过单击按钮可以浏览并选择另一个工作簿 (OpenBook) 并从工作表中导入数据 (Report Data)。

报告数据表中的 I 列包含开始日期,J 列包含每个时期(通常是一个月)的结束日期。

在 ThisWorkbook 中,我有一个名为“说明”的选项卡,我希望允许用户在此选项卡中输入请求。日期(单元格 C8)和结束日期 (E8),然后代码将引用这些日期并仅导入该范围内的数据。

从我的研究看来,您需要使用自动过滤器,然后复制可见行。但我无法让它工作。

Sub Get_Data_From_File()
  Dim FileToOpen As Variant
  Dim OpenBook As Workbook
  Application.ScreenUpdating = False
  FileToOpen = Application.GetOpenFilename(Title:="Browse for your ADR file & import range", FileFilter:="Excel Files (*.xls*),*xls*")
  If FileToOpen <> False Then
     Set OpenBook = Application.Workbooks.Open(FileToOpen)
     OpenBook.Worksheets("Report Data").Range("A9:MJ128").Copy
     ThisWorkbook.Worksheets("Report Data").Range("A9").PasteSpecial xlPasteValues
     ThisWorkbook.Worksheets("Report Data").Range("A9").PasteSpecial xlFormats
      OpenBook.Close False

End If
Application.ScreenUpdating = False

End Sub

【问题讨论】:

  • 确保在末尾设置Application.ScreenUpdating=True(相对于 False)。另外,您是否尝试将所有列(A:M)复制到哪里?报告数据的第一个可用行?
  • A9:MJ128 从 OpenBook 复制并从 A9 开始粘贴到 ThisWorkbook。我的导入数据工作正常我只想复制和粘贴自定义日期范围内的数据。现在它只是复制并粘贴 A9:MJ128 中的所有内容。
  • 所以在复制所有内容后,您想测试复制的值是否与用户输入匹配,或者您想在之后测试吗?如果你遍历列并测试值是否在范围内,然后复制,你应该很好。
  • 例如,在 ThisWorkbook A9 中:MJ128 是一组数据,日期在 Col I & J 中。现在它的工作方式是简单地复制和粘贴。我希望用户提出请求。日期 01/01/2016 和结束日期 01/30/2016,只有该日期内的数据会被复制和粘贴。

标签: excel vba


【解决方案1】:

很难用所有不同的文件名复制您的情况,但是我认为这应该可行。代码的关键部分是带有aCell 行的循环,并测试两列是否满足变量begDateEndDate 中的预定义条件。如果它们匹配,则只需将值(无需复制粘贴)插入工作表行。有一个计数器 k 将确保宏不会覆盖它自己的成员(仅适用于该过程)。

虽然我没有对此进行测试,但最终它是一个非常简单的项目测试,所以如果您遇到错误,请通过逐步检查您的代码来仔细检查您的变量是否正确。

Sub Get_Data_From_File()
  Dim FileToOpen As Variant
  Dim OpenBook As Workbook, openSheet As Worksheet, iSheet As Worksheet, pSheet As Worksheet
  
  'worksheets
  Set iSheet = ThisWorkbook.Worksheets("Instructions")
  Set pSheet = ThisWorkbook.Worksheets("Report Data")
  'Application.ScreenUpdating = False
  
FileToOpen = Application.GetOpenFilename(Title:="Browse for your ADR file & import range", FileFilter:="Excel Files (*.xls*),*xls*")

    Dim begDate As Date, endDate As Date
  
    begDate = iSheet.Range("C8").Value
    endDate = iSheet.Range("E8").Value
    
  
  
If FileToOpen <> False Then
    Set OpenBook = Application.Workbooks.Open(FileToOpen)
    Set openSheet = OpenBook.Worksheets("Report Data")
    
    Dim aCell As Range, k As Long
    For Each aCell In Intersect(openSheet.UsedRange, openSheet.Range("I:I")).Cells
        'loops through rows testing if column i is >= than begdate and column j is <= endDate
        If aCell >= begDate And aCell.Offset(0, 1).Value <= endDate Then
             'when match is found, value is inserted directly to sheet
             pSheet.Range("A9").Offset(k, 0).Value = Intersect(aCell.EntireRow, aCell.Worksheet.Range("A:M")).Value
            'offset will ensure data is no overwritten.
             k = k + 1
        End If
    Next aCell
    OpenBook.Close False

End If
'Application.ScreenUpdating = True

End Sub

【讨论】:

  • 感谢您的回复!一切都很好,但是,它只复制第一列 (A) 日期内的数据。如果我将 A9 更改为 B9,那么它将粘贴来自 B 的值等等。我需要为 A 到 MJ 一遍又一遍地添加此代码吗?
  • 好的,我去。它应该是 pSheet.Range("A9:MJ9")。这会导入所有内容。
最近更新 更多