Vba 如何将基于特定单元格值的数据从多个工作簿复制到主工作簿中

Vba 如何将基于特定单元格值的数据从多个工作簿复制到主工作簿中,vba,excel,Vba,Excel,我遇到了一个问题,需要根据第3列中的一组特定值(几个名称)将两个工作簿中的数据复制到主工作簿中。我是VBA新手,可能我不能准确地问这个问题来找到答案,对此表示歉意。请帮助我,如果第3列包含我要查找的名称,我只需要从每个工作簿中提取数据行。我有下面的代码,可以从特定文件夹中的每个工作簿中提取数据,但是它绝对可以获取所有内容 Sub copyDataFromManyFiles() With Application .DisplayAlerts = False .EnableEven

我遇到了一个问题,需要根据第3列中的一组特定值(几个名称)将两个工作簿中的数据复制到主工作簿中。我是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
Sub-copyDataFromManyFiles()
应用
.DisplayAlerts=False
.EnableEvents=False
.ScreenUpdate=False
以
Dim FolderPath为字符串,FilePath为字符串,FileName为字符串
FolderPath=“C:\Users\Jasiek\Desktop\Yuuuge MacroTest\”
FilePath=FolderPath&“*ennik*.xl*”
FileName=Dir(文件路径)
将lastrow变长,lastcolumn变长
文件名“”时执行此操作
工作簿.打开(文件夹路径和文件名)
lastrow=ActiveSheet.Cells(Rows.Count,1).End(xlUp).Row
lastcolumn=ActiveSheet.Cells(1,Columns.Count).End(xlToLeft).Column
范围(单元格(2,1),单元格(lastrow,lastcolumn))。复制
Application.DisplayAlerts=False
活动工作簿。关闭
erow=Sheet1.单元格(Rows.Count,1).结束(xlUp).偏移量(1,0).行
ActiveSheet.Paste目标:=工作表(1).范围(单元格(erow,1),单元格(erow,30))
FileName=Dir
环
应用
.DisplayAlerts=True
.EnableEvents=True
.ScreenUpdate=True
以
'调用已删除的副本
端接头

在复制行之前,我应该如何修改代码以过滤数据?我非常关心性能,因为有超过10万条记录。我非常感谢你的帮助。谢谢。

假设您正在处理一组固定的名称(即:2-3),最简单的方法可能是使用instr()方法来确定单元格值是否有您要查找的名称

如果您处理的是一个较大的名称列表,那么您也可以为每一行检查遍历一个名称集合(或数组)。下面的instr()方法从正在检查的字符串返回搜索字符串的整数位置。如果找到某个位置,它将返回该位置大于0的值(即:位置1是它找到匹配项的最小值)。vbTextCompare选项只确保在进行比较时不区分大小写(即:大写或小写不匹配)

我喜欢在调用时明确地引用工作表和工作簿,以确保内容干净、具体,但如果您对ActiveWorkbook或ActiveWorkbench有强烈的偏好,则可以使用它

在效率方面,如果您将每个单元格的值存储在临时字符串变量中,并仅对tempStr字符串运行比较,则与每次引用单元格值相比,您将节省检索时间(对于x名称的每行,执行x比较检查需要更长的时间)

选项比较文本
选项显式
公共子启动()
布尔型
Dim-oxl作为Excel.Application
将wb1设置为Excel.工作簿
Dim tempName1作为字符串
Dim tempName2作为字符串
作为字符串的Dim tempStr1
暗tempStr2作为字符串
Dim tempInt1为整数
Dim tempInt2为整数
Set oxl=New Excel.Application
设置wb1=oxl.Workbooks().Open(“[path here]\Book1.xlsm”)
wb1.激活
也可以使用“ActiveWorkbook.Worksheets”(“”)
'如果需要代替oxl和wb1声明,或者
“甚至是活页。
'cells().value提供考虑格式的单元格的外观值。适用于日期之类的事情
或基础价值可能与所示不同的货币。
tempStr1=CStr(wb1.工作表(“表1”).单元格(1,1).值)
tempName1=“约翰”
'cells().value2提供单元格的基本实际值(即:不带任何格式或解释)。
“如果你经常处理日期/货币问题,不想让excel格式在你和来源之间产生隔阂
“数据使用这个。此处仅用于显示两个不同的选项
tempStr2=CStr(wb1.工作表(“表1”).单元格(2,1).值2)'
Option Compare Text

Option Explicit

Public Sub start()
    Dim foundBool As Boolean
    Dim oxl As Excel.Application
    Dim wb1 As Excel.Workbook

    Dim tempName1 As String
    Dim tempName2 As String

    Dim tempStr1 As String
    Dim tempStr2 As String
    Dim tempInt1 As Integer
    Dim tempInt2 As Integer

    Set oxl = New Excel.Application

    Set wb1 = oxl.Workbooks().Open("[path here]\Book1.xlsm")

    wb1.Activate

    'ActiveWorkbook.Worksheets ("") can also possibly be used
    'if needed in lieu of a oxl and wb1 declaration, or perhaps
    'even ActiveSheet.

    'cells().value provides the apparent value of the cell taking formatting into account. Applies to things like dates
    'or currencies where the underlying value might be different than what's shown.
    tempStr1 = CStr(wb1.Worksheets("Sheet1").Cells(1, 1).Value)
    tempName1 = "John"

    'cells().value2 provides the underlying actual value of the cell (i.e.: without any formatting or interperetation).
    'if you deal a lot with dates/currencies and don't want excel formatting to get between you and the source
    'data use this one. Used here only to show the two different options
    tempStr2 = CStr(wb1.Worksheets("Sheet1").Cells(2, 1).Value2) '<---next row's value
    tempName2 = "Peter"


    tempInt1 = InStr(1, tempStr1, tempName1, vbTextCompare)
    tempInt2 = InStr(1, tempStr1, tempName2, vbTextCompare)

    If tempInt1 > 0 Or _
        tempInt2 > 0 Then

        foundBool = True

    End If

    wb1.Close
    oxl.Quit
    Set wb1 = Nothing
    Set oxl = Nothing

End Sub