一、通过关键字查找工作表的行方法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) '以上一次查找到的位置继续往上查找,注意这个是往上查找,因为当前位置已经是最开始第一次找到的位置,往上找一次就是最后一个找到的位置。