一、通过关键字查找工作表的行方法1:
Option Explicit
Option Compare Text
Sub 关键字查找工作表行()
'vba关于查找方法(Find方法)的应用(一)
Dim findValue As Range
Dim eachSheet As Worksheet
Dim inpu As String
Dim a, b
b = 0
MsgBox "全称为关键字查找工作表的行,如查找关键字:合计、汇总、总计……。查找同一个工作簿中的工作表。汇总到工作表《汇总各表行》,保留数值、格式,不保留公式。"
inpu = Application.InputBox("请输入需要查找的关键字(如合计、汇总等),是按照部分匹配查找,输入字符串必须准确,否则查找结果太多容易导致死锁:", Type:=2)
Dim sht As Worksheet '定义对象变量sht,用于表示工作表
On Error Resume Next '容错语句
Set sht = Sheets("汇总各表行") '将“成绩统计表”赋值给对象变量sht
If Err <> 0 Then '如果表格不存在,上面的赋值操作会出错,Err<>0表示有错误
Sheets.Add(, Sheets(Sheets.Count)).Name = "汇总各表行" '新建在最后面
Else
Debug.Print "该表已经存在" '如果没出错,说明表格存在,给出提示
End If
For Each eachSheet In Worksheets
If Not eachSheet.Name = "汇总各表行" Then
Set findValue = eachSheet.UsedRange.Find(what:=inpu)
'查找内容为“黄”字,如果加上参数lookat:=xlWhole,就是完全匹配,单元格只有一个“黄”字才算找到,这里演示的是不指定,默认就是单元格内容“包含”这个字就可以了,注意的事,如果手动在查找替换窗口里把“单元格匹配”勾打上的话,这里不进行设置会直接按手动在“查找替换”窗口中设置的值进行查找。找到就把当前位置绝对位置赋值给变量,如果要取找到的单元格的值后面加.value,这样可以获取到所有包含指定字符的所有单元格内容。
Debug.Print eachSheet.Name
If Not findValue Is Nothing Then
'is nothing 就是没事情发生,没有找到, 前面加一个not,那意思就相反了,就是找到有,也可以前面不加not,只需要把下面ELSE前后位置调一下就可以了。
'MsgBox "第一个数据数据在单元格:" & findValue.Address '以上一次查找到的位置往下查找
b = b + 1 '设置一个计数变量,统计一共找到多少个符合条件的
a = findValue.Address '把第一个找到的地址赋值给变量a,以此对比是否已经全部查找完毕。
eachSheet.Range(Cells(findValue.Row, 1), Cells(findValue.Row, 10)).Copy
Worksheets("汇总各表行").Cells(b + 1, 2).PasteSpecial Paste:=xlPasteFormats
Worksheets("汇总各表行").Cells(b + 1, 2).PasteSpecial Paste:=xlPasteValues
Worksheets("汇总各表行").Cells(b + 1, 1).Value = eachSheet.Name
Do
'开始循环查找,一般使用Do循环命令会在前面设置一个循环条件或在后面设置一个终止条件,我这里前后都没有设置,而是在中间对条件进行判断,当查找结束就使用exit do命令退出do循环
'after前面要有findvalue,否则报错,do loop要在else之前
Set findValue = eachSheet.UsedRange.FindNext(After:=findValue)
'使用findnext继续往下查找,After参数是指定从哪个单元格的下一个开始查找,其中“:=”后面的findvalue是上一次查找到的位置对象变量,意思就是从这一个单元格的下一个单元格
If findValue.Address = a Then '如果当前的位置和最开始找到的位置一样,则
Set findValue = Rows.FindPrevious(After:=findValue) '以上一次查找到的位置继续往上查找,注意这个是往上查找,因为当前位置已经是最开始第一次找到的位置,往上找一次就是最后一个找到的位置。
'MsgBox ("一共找到" & b & "个")
'MsgBox "最后一个数据在单元格:" & findValue.Address
Exit Do
Else '否则,如果当前找到的位置不是第一次找到的位置
b = b + 1 '计数变量加1,并提示当时找到的是第几个符合条件的
'addr_find = findValue.Address
'MsgBox "第" & b & "个找到的数据发现在单元格:" & findValue.Address
'row_find = addr_find.Row
'Debug.Print Rows(findValue.Row).Select
'Worksheets("查找行").Range(Cells(findValue.Row, 1), Cells(findValue.Row, 10)).Select
eachSheet.Range(Cells(findValue.Row, 1), Cells(findValue.Row, 10)).Copy
Worksheets("汇总各表行").Cells(b + 1, 2).PasteSpecial Paste:=xlPasteFormats
Worksheets("汇总各表行").Cells(b + 1, 2).PasteSpecial Paste:=xlPasteValues
Worksheets("汇总各表行").Cells(b + 1, 1).Value = eachSheet.Name
End If
Loop
Else
'MsgBox "没有找到!"
Debug.Print "在表" & eachSheet.Name & "中" & "没有找到!"
'如果一个也没找到,直接提示没有找到,并退出sub程序块。
'Exit Sub
End If
End If
Next eachSheet
End Sub
二、通过关键字查找工作表的行方法2:
Option Explicit
Option Compare Text
Sub 关键字查找工作表行2()
Dim i1, i2, i3, i4, i5, i6, b, j
Dim eachSheet, mysheet1 As Worksheet
Dim inpu As String
b = 2
On Error Resume Next '忽略运行过程中可能出现的错误
MsgBox "关键字查找工作表的行,如查找关键字:合计、汇总、总计……。不是全匹配也可以查找。查找同一个工作簿中的工作表。汇总到工作表《汇总各表行》,保留数值、格式,不保留公式。"
inpu = Application.InputBox("请输入需要查找的关键字(如合计、汇总等),是按照部分匹配查找,输入字符串必须准确,否则查找结果太多容易导致死锁:", Type:=2)
Dim sht As Worksheet '定义对象变量sht,用于表示工作表
On Error Resume Next '容错语句
Set sht = Sheets("汇总各表行") '将“成绩统计表”赋值给对象变量sht
If Err <> 0 Then '如果表格不存在,上面的赋值操作会出错,Err<>0表示有错误
Sheets.Add(, Sheets(Sheets.Count)).Name = "汇总各表行" '新建在最后面
Else
Debug.Print "该表已经存在" '如果没出错,说明表格存在,给出提示
End If
For Each eachSheet In Worksheets
If Not eachSheet.Name = "汇总各表行" Then
'Debug.Print eachSheet.UsedRange.Rows.Count, eachSheet.UsedRange.Columns.Count
' For i1 = 2 To 100 '从第2行到100行
'
' For i2 = 1 To 30 '从第二列到30列
j = eachSheet.UsedRange.Columns.Count
For i1 = 1 To eachSheet.UsedRange.Rows.Count '从第1行到最大行
For i2 = 1 To j '从第1列到最大列
If eachSheet.Cells(i1, i2) <> "" Then '如果单元格不是空白,则
i3 = InStr(1, eachSheet.Cells(i1, i2), inpu) '获取关键词所在位置
'i6 = InStr(1, eachSheet.Cells(i1, i2), "洁") '获取关键词所在位置
If i3 > 0 Then '如果存在关键词,则
'eachSheet.Range(Cells(i1, 1), Cells(i1, 10)).Copy '10列
'columnmax =cells(i,columns.count).end(xltoleft).column 'i行的最大列数
eachSheet.Range(Cells(i1, 1), Cells(i1, j)).Copy
'j = Cells(i1, Columns.Count).End(xlToLeft).Column
Worksheets("汇总各表行").Cells(b, 2).PasteSpecial Paste:=xlPasteFormats
Worksheets("汇总各表行").Cells(b, 2).PasteSpecial Paste:=xlPasteValues
Worksheets("汇总各表行").Cells(b, 1).Value = eachSheet.Name
b = b + 1
Debug.Print eachSheet.Name, j
Exit For '退出For循环
End If
End If
Next
Next
End If
Next
End Sub
二、通过关键字查找工作簿的行:
通过关键字查找工作簿的行,如查找关键字:合计、汇总、总计……。查找时部分匹配,不是全匹配。查找不同工作簿中的多个工作表。汇总到工作表《汇总各表行》中,保留数值、格式,不保留公式。
1、只查找包含一个关键字。
Option Explicit
Option Compare Text
Sub 关键字查找工作簿行()
'Application.DisplayAlerts = False
Dim i1, i2, i3, i4, i5, b, j
Dim wb2 As Workbook
Dim eachSheet As Worksheet
Dim inpu As String
'选择多个文件
Dim l As Long
Dim full_file
b = 2
On Error Resume Next '忽略运行过程中可能出现的错误
Set wb2 = ThisWorkbook
MsgBox "关键字查找工作簿的行,如查找关键字:合计、汇总、总计……。不是全匹配也可以查找。查找同一个工作簿中的工作表。汇总到工作表《汇总各表行》,保留数值、格式,不保留公式。"
inpu = Application.InputBox("请输入需要查找的关键字(如合计、汇总等),是按照部分匹配查找,输入字符串必须准确,否则查找结果太多容易导致死锁:", Type:=2)
Dim sht As Worksheet '定义对象变量sht,用于表示工作表
On Error Resume Next '容错语句
Set sht = Sheets("汇总各表行") '将“成绩统计表”赋值给对象变量sht
If Err <> 0 Then '如果表格不存在,上面的赋值操作会出错,Err<>0表示有错误
Sheets.Add(, Sheets(Sheets.Count)).Name = "汇总各表行" '新建在最后面
Else
Debug.Print "该表已经存在" '如果没出错,说明表格存在,给出提示
End If
With Application.FileDialog(msoFileDialogFilePicker) '要全选ctrl + A
.AllowMultiSelect = True
'单选择
.Filters.Clear
'清除文件过滤器
.Filters.Add "Excel Files", "*.xls;*.xlsx;*.xlw"
.Filters.Add "All Files", "*.*"
'设置两个文件过滤器
.Show
For l = 1 To .SelectedItems.Count
full_file = .SelectedItems(l)
'Debug.Print full_file
Dim wkbk As Workbook '定义一个工作薄
Set wkbk = Workbooks.Open(full_file) '打开文件
For Each eachSheet In wkbk.Worksheets
If Not eachSheet.Name = "汇总各表行" Then
'Debug.Print eachSheet.UsedRange.Rows.Count, eachSheet.UsedRange.Columns.Count
j = eachSheet.UsedRange.Columns.Count
For i1 = 1 To eachSheet.UsedRange.Rows.Count '从第1行到最大行
For i2 = 1 To j '从第1列到最大列
If eachSheet.Cells(i1, i2) <> "" Then '如果单元格不是空白,则
i3 = InStr(1, eachSheet.Cells(i1, i2), inpu) '获取关键词所在位置
If i3 > 0 Then '如果存在关键词,则
eachSheet.Range(Cells(i1, 1), Cells(i1, j)).Copy
wb2.Worksheets("汇总各表行").Cells(b, 3).PasteSpecial Paste:=xlPasteFormats
wb2.Worksheets("汇总各表行").Cells(b, 3).PasteSpecial Paste:=xlPasteValues
wb2.Worksheets("汇总各表行").Cells(b, 2).Value = eachSheet.Name
wb2.Worksheets("汇总各表行").Cells(b, 1).Value = wkbk.Name
b = b + 1
Debug.Print wkbk.Name & "中的" & eachSheet.Name & "第" & i2 & "行" & "存在查找内容。"
Exit For '退出For循环
End If
End If
Next
Next
End If
Next
wkbk.Save: wkbk.Close True
Next
End With
Application.DisplayAlerts = True
End Sub
2、包含一个关键字及不包含一个关键字双重条件查找。
Option Explicit
Option Compare Text
Sub 关键字查找工作簿行()
'Application.DisplayAlerts = False
Dim i1, i2, i3, i4, i5, i6, i7, b, j
Dim wb2 As Workbook
Dim eachSheet As Worksheet
Dim inpu As String
'选择多个文件
Dim l As Long
Dim full_file
b = 2
On Error Resume Next '忽略运行过程中可能出现的错误
Set wb2 = ThisWorkbook
MsgBox "通过关键字查找工作簿的行,如查找关键字:合计、汇总、总计……。查找时部分匹配,不是全匹配。查找不同工作簿中的多个工作表。汇总到工作表《汇总各表行》中,保留数值、格式,不保留公式。"
inpu = Application.InputBox("请输入需要查找的关键字(如合计、汇总等),是按照部分匹配查找,输入字符串必须准确,否则查找结果太多容易导致死锁:", Type:=2)
Dim sht As Worksheet '定义对象变量sht,用于表示工作表
On Error Resume Next '容错语句
Set sht = Sheets("汇总各表行") '将“成绩统计表”赋值给对象变量sht
If Err <> 0 Then '如果表格不存在,上面的赋值操作会出错,Err<>0表示有错误
Sheets.Add(, Sheets(Sheets.Count)).Name = "汇总各表行" '新建在最后面
Else
Debug.Print "该表已经存在" '如果没出错,说明表格存在,给出提示
End If
With Application.FileDialog(msoFileDialogFilePicker) '要全选ctrl + A
.AllowMultiSelect = True
'单选择
.Filters.Clear
'清除文件过滤器
.Filters.Add "Excel Files", "*.xls;*.xlsx;*.xlw"
.Filters.Add "All Files", "*.*"
'设置两个文件过滤器
.Show
For l = 1 To .SelectedItems.Count
full_file = .SelectedItems(l)
'Debug.Print full_file
Dim wkbk As Workbook '定义一个工作薄
Set wkbk = Workbooks.Open(full_file) '打开文件
For Each eachSheet In wkbk.Worksheets
If Not eachSheet.Name = "汇总各表行" Then
'Debug.Print eachSheet.UsedRange.Rows.Count, eachSheet.UsedRange.Columns.Count
j = eachSheet.UsedRange.Columns.Count
For i1 = 1 To eachSheet.UsedRange.Rows.Count '从第1行到最大行
For i2 = 1 To j '从第1列到最大列
If eachSheet.Cells(i1, i2) <> "" Then '如果单元格不是空白,则
i3 = InStr(1, eachSheet.Cells(i1, i2), inpu) '获取关键词所在位置
i6 = InStr(1, eachSheet.Cells(i1, i2), "洁")
If i6 > 0 Then '如果不存在关键词,则退出。因为复制一整行,不能保证同一行的其他单元格不含有i6所包含的字符串。
Exit For
Else:
If i3 > 0 Then '如果存在关键词,则
eachSheet.Range(Cells(i1, 1), Cells(i1, j)).Copy
wb2.Worksheets("汇总各表行").Cells(b, 3).PasteSpecial Paste:=xlPasteFormats
wb2.Worksheets("汇总各表行").Cells(b, 3).PasteSpecial Paste:=xlPasteValues
wb2.Worksheets("汇总各表行").Cells(b, 2).Value = eachSheet.Name
wb2.Worksheets("汇总各表行").Cells(b, 1).Value = wkbk.Name
b = b + 1
'Debug.Print wkbk.Name, eachSheet.Name, j
Exit For '退出For循环
End If
End If
End If
Next
Next
End If
Next
wkbk.Save: wkbk.Close True
Next
End With
Application.DisplayAlerts = True
End Sub