Excel 在多个工作簿中搜索多个字符串并复制数据
我借用了一些在多个excel工作簿中搜索字符串的代码,并尝试将其修改为搜索多个字符串。不幸的是,它似乎在搜索数组中的第一项后停止Excel 在多个工作簿中搜索多个字符串并复制数据,excel,vba,excel-formula,Excel,Vba,Excel Formula,我借用了一些在多个excel工作簿中搜索字符串的代码,并尝试将其修改为搜索多个字符串。不幸的是,它似乎在搜索数组中的第一项后停止 子搜索文件夹() “Dim myArray作为变体 “我的眼睛昏昏沉沉的,只要 像物体一样变暗 作为对象的Dim xFld Dim xStrSearch作为变量 作为字符串的Dim xStrPath Dim xStrFile作为字符串 将xOut设置为工作表 Dim xWb作为工作簿 Dim xWk As工作表 长得一样 Dim xFound As范围 作为变型的衣服
子搜索文件夹()
“Dim myArray作为变体
“我的眼睛昏昏沉沉的,只要
像物体一样变暗
作为对象的Dim xFld
Dim xStrSearch作为变量
作为字符串的Dim xStrPath
Dim xStrFile作为字符串
将xOut设置为工作表
Dim xWb作为工作簿
Dim xWk As工作表
长得一样
Dim xFound As范围
作为变型的衣服
将xFileDialog设置为文件对话框
Dim xUpdate为布尔值
暗X等于长
myArray=数组(“项目a”、“项目b”、“项目c”、“项目d”)
关于错误转到错误处理程序
设置xFileDialog=Application.FileDialog(msoFileDialogFolderPicker)
xFileDialog.AllowMultiSelect=False
xFileDialog.Title=“选择一个文件夹”
如果xFileDialog.Show=-1,则
xStrPath=xFileDialog.SelectedItems(1)
如果结束
如果xStrPath=“”,则退出Sub
xUpdate=Application.screen更新
Application.ScreenUpdating=False
Set xOut=工作表。添加
对于myCounter=0到UBound(myArray)
MsgBox myCounter&“是计数编号。”
xStrSearch=myArray(myCounter)
MsgBox xStrSearch&“是字符串”
xRow=1
带xOut
.Cells(xRow,1)=“工作簿”
.单元格(X行,2)=“工作表”
.单元格(X行,3)=“单元格”
.单元格(X行,4)=“填充”
.Cells(xRow,5)=“单元格中的文本”
设置xFso=CreateObject(“Scripting.FileSystemObject”)
设置xFld=xFso.GetFolder(xStrPath)
xStrFile=Dir(xStrPath&“\*.xls*”)
在xStrFile“”时执行此操作
设置xWb=Workbooks.Open(文件名:=xStrPath&“\”&xStrFile_
UpdateLink:=0,只读:=True,AddToMRU:=False)
对于xWb.工作表中的每个xWk
设置xFound=xWk.UsedRange.Find(xStrSearch)
如果不是,那么xFound什么都不是
xStrAddress=xFound.Address
如果结束
做
如果xFound什么都不是,那么
退出Do
其他的
xCount=xCount+1
xRow=xRow+1
.Cells(xRow,1)=xWb.Name
.Cells(xRow,2)=xWk.Name
.Cells(xRow,3)=xFound.Address
.Cells(xRow,5)=xFound.Value
如果结束
设置xFound=xWk.Cells.FindNext(后面:=xFound)
在xStrAddress xFound.Address时循环
myCounter=myCounter+1
下一个
xWb.Close(假)
xStrFile=Dir
环
.Columns(“A:D”).EntireColum.AutoFit
以
下一个我的计数器
MsgBox xCount&“已找到单元格”,“填充”
出口商:
设置xOut=Nothing
设置xWk=Nothing
设置xWb=Nothing
设置xFld=Nothing
设置xFso=Nothing
Application.ScreenUpdate=xUpdate
出口接头
错误处理程序:
MsgBox错误说明,VBE感叹号
复出机
端接头
不知道我做错了什么。
如果可能的话,还可以返回列A
的值或将列A-H
复制到工作表中
也就是说,如果找到。地址是(C,4)
,那么也返回(A,4)
非常感谢 当您的代码执行多种操作时,例如:
- 索取文件夹
- 查找该文件夹中的所有文件
- 查找每个文件中每个工作表中的所有单元格匹配项
您最好将任何可以封装在自己的子任务/函数中的功能推到一个独立的方法中,这样您就可以专注于实际任务及其逻辑,而不是让它被所有子任务及其逻辑/规则所淹没
另外,一旦创建了聚焦子方法,以后就可以重用它们
将该方法应用于您的任务:
子搜索文件夹()
作为变体的搜索
暗rw与长rw相同,s
Dim folderPath作为字符串,f,allFiles作为集合,allCells作为集合
将wb作为工作簿、ws作为工作表、wsOut作为工作表、c
arrSearch=数组(“项目a”、“项目b”、“项目c”、“项目d”)
folderPath=SelectFolder()'从用户处获取文件夹
如果Len(folderPath)=0,则退出子“无选定文件夹”
设置allFiles=MatchingFiles(folderPath,*.xls*)查找所有匹配的文件
如果allFiles.Count=0,则
MsgBox“找不到匹配的文件!”
出口接头
如果结束
Set wsOut=thiswoolk.Worksheets.Add()
wsOut.Range(“A1:E1”).Value=数组(“工作簿”、“工作表”_
“单元格”、“填充”、“单元格文本”)
rw=2
对于allFiles循环文件中的每个f
带工作簿。打开(f,只读:=True)
对于每个ws-In.worksheet的循环工作簿
对于arrSearch'循环搜索项中的每个
设置allCells=FindAll(ws.UsedRange,s)
对于ALLCELL循环中的每个c匹配
单元格(rw,1)。调整大小(1,5)。值=_
数组(.Name,ws.Name,c.Address,”,c.Value)
单元格(rw,6)。调整大小(1,8)。值=_
c、 entirerow.cells(1).调整大小(1,8)'用c从行复制A-H
rw=rw+1
下一个c
下一个s的下一个搜索字符串
下一个ws的下一个工作表
.关闭错误
以
下一个f'下一个工作簿
wsOut.Range(“A:D”).entireclumn.AutoFit