excel - 在日期范围内将数据从一个工作簿导入到另一个工作簿
问题描述
我打开我的工作簿(ThisWorkbook),通过单击按钮可以浏览并选择另一个工作簿(OpenBook)并从工作表中导入数据(报告数据)。
报告数据表中的 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
解决方案
很难用所有不同的文件名复制您的情况,但是我认为这应该可行。代码的关键部分是带有aCell
行的循环,并测试两列是否满足变量begDate
和EndDate
. 如果它们匹配,则只需将值(无需复制粘贴)插入工作表行。有一个计数器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
推荐阅读
- time-complexity - 如何计算嵌套循环的时间复杂度?
- visual-studio-2017 - 如何通过 devenv.exe\com 构建具有平台配置的项目?
- latex - 如何摆脱切片中的刻字?
- php - 为什么我无法选择数据库中存在的表?
- blockchain - 主网在 Remix Solidity 智能合约中部署地址数组作为构造函数参数不起作用
- android - 如何按字母顺序排列自定义对象的 ArrayList,其中包含两个不同的字符串?
- fortran - 使用fortran计算均方位移
- sql - 美元符号、逗号、小数位
- sql - 将 Pivot 与子查询一起使用时,列定义不明确
- angular - 在一个组件中,我将自定义 aggrid 初始化 3 次,但第一个仅初始化剩余 2 次未初始化