我有一个问题,我需要根据第3列中的一组特定值(多个名称)将数据从2个工作簿复制到主工作簿中。我是VBA的新手,可能我可以'准确地问问题找到答案,为此道歉。如果第3列包含我正在寻找的名称,您是否可以帮助我,我需要从每个工作簿 中提取数据行。我有以下代码从特定文件夹中的每个工作簿中提取数据,但它绝对抓住了所有内容。
Sub copyDataFromManyFiles()
With Application
.DisplayAlerts = False
.EnableEvents = False
.ScreenUpdating = False
End With
Dim FolderPath As String, FilePath As String, FileName As String
FolderPath = "C:\Users\Jasiek\Desktop\Yuuuge MacroTest\"
FilePath = FolderPath & "*ennik*.xl*"
FileName = Dir(FilePath)
Dim lastrow As Long, lastcolumn As Long
Do While FileName <> ""
Workbooks.Open (FolderPath & FileName)
lastrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
lastcolumn = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column
Range(Cells(2, 1), Cells(lastrow, lastcolumn)).Copy
Application.DisplayAlerts = False
ActiveWorkbook.Close
erow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
ActiveSheet.Paste Destination:=Worksheets(1).Range(Cells(erow, 1), Cells(erow, 30))
FileName = Dir
Loop
With Application
.DisplayAlerts = True
.EnableEvents = True
.ScreenUpdating = True
End With
'Call removeDuplicates
End Sub
如何在复制行之前修改代码以过滤数据?我关心性能,因为有100k +记录。我真的很感激帮助。感谢。
答案 0 :(得分:0)
假设您正在处理一组固定的名称(即:2-3),最简单的方法可能是使用instr()方法来确定单元格值是否具有您正在查找的名称对
如果您正在处理更大的名称列表,您还可以遍历每行检查的名称集合(或数组)。下面的instr()方法返回您正在检查的字符串中搜索字符串的整数位置。如果它找到某个东西,它将为该位置返回一个大于0的值(即:位置1是找到匹配的最小值)。 vbTextCompare选项只是确保它不区分大小写,因为它进行比较(即:大写或小写不匹配)。
我喜欢在调用时明确地引用工作表和工作簿以确保事情干净且具体,但如果您对它有强烈的偏好,则可以使用ActiveWorkbook或ActiveWorksheet。
就效率而言,如果将每个单元格的值存储在临时字符串变量中并且只是对tempStr字符串运行比较,那么与每次引用单元格值相比,您将节省检索时间(这需要更长的时间才能完成执行x比较检查x行名称的每一行。
public function __construct($choices, $value = null)
{
if (null !== $value && !is_callable($value)) {
throw new UnexpectedTypeException($value, 'null or callable');
}