Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在多个工作簿中搜索多个字符串并复制数据_Excel_Vba_Excel Formula - Fatal编程技术网

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范围 作为变型的衣服

我借用了一些在多个excel工作簿中搜索字符串的代码,并尝试将其修改为搜索多个字符串。不幸的是,它似乎在搜索数组中的第一项后停止

子搜索文件夹()
“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