VBA通过关键字查找工作簿、工作表的行

一、通过关键字查找工作表的行方法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
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值