zoukankan      html  css  js  c++  java
  • VBA-使用DIR函数多文件合并

    如何将对象赋值给变量

    Sub test()
    Dim sht As Worksheet
    sht = Sheets.Add  '这里会报错的
    Set sht = Sheets.Add ‘将对象赋值给变量 需要加上set
    sht.Name = "4月"
    End Sub

    例子:创建表 以sheet1的单元格内容为名字

    Sub test()
    Dim sht As Worksheet
    Dim i As Integer
    For i = 2 To 5
        Set sht = Sheets.Add
        sht.Name = Sheet1.Range("a" & i)
    Next
    End Sub

    dir函数

      1)判断有无此文件    dir里支持通配符

    Sub test()
    Dim i As Integer
    For i = 1 To 5
        If Dir("a:data" & Sheet1.Range("a" & i) & ".xls*") = "" Then     #支持通配符
            Sheet1.Range("b" & i) = "无此文件"
        Else
            Sheet1.Range("b" & i) = "有文件"
        End If
    
    Next
    End Sub

      2)dir的使用说明,在文件data里有多个苏州文档 如 苏州.xlsx 、苏州.xls  

    Sub ss()
    Range("a1") = Dir("d:data苏州.xls*") #返回苏州     Dir("d:data*.*")遍历所有文件
    Range("a1") = Dir  #返回苏州
    Range("a1") = Dir  #返回空
    Range("a1") = Dir  #报错
    End Sub

      3)遍历所有文件名

    Sub test1()
    Dim str As String
    str = Dir("d:data*.xls*")
    For i = 1 To 100
        Range("a" & i) = str
        str = Dir
        If str = "" Then
            Exit For
        End If
    Next
    End Sub

      4)壳子,对固定的文件夹内的数据打开  再关闭

    Sub test1()
    Dim str As String
    Dim wb As Workbook
    str = Dir("d:data*.xls*")
    For i = 1 To 100
        Set wb = Workbooks.Open("d:data" & str)
        
        
        
        
        wb.Close
        str = Dir
        If str = "" Then
            Exit For
        End If
    Next
    End Sub

       5)合并多文件

    Sub wjhb()
    Dim str As String
    Dim wb As Workbook
    str = Dir("d:data*.xls*")
    For i = 1 To 100
        Set wb = Workbooks.Open("d:data" & str)
        wb.Sheets(1).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
        ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = Split(wb.Name, ".")(0)
        wb.Close
        str = Dir
        If str = "" Then
            Exit For
        End If
        
    Next
    End Sub

      6)最终版 -无敌了

    Sub wjhb()
    Dim str As String
    Dim wb As Workbook
    Dim sht As Worksheet
    str = Dir("d:data*.xls*")
    For i = 1 To 100
        Set wb = Workbooks.Open("d:data" & str)
        For Each sht In wb.Sheets
            sht.Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
            ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = Split(wb.Name, ".")(0) & sht.Name
        Next
        wb.Close
        str = Dir
        If str = "" Then
            Exit For
        End If
        
    Next
    End Sub

     find函数的用法,通过find可以快速查找到要找的数据(通过下面的方法可以避免find找不到报错的问题

    Sub test()
    Dim rng As Range
    Set rng = Range("d:d").Find(Range("l3")) '这里如果找不到就不会再报错,没找到那么rng就是空的
        If rng Is Nothing Then  '单元格不能为空,它是个对象 只能为nothing
            MsgBox "找不到"
        Else
            Range("m3") = rng.Offset(0, 3)
        End If
        
    End Sub

      优化

    Sub test()
    Dim rng As Range
    Set rng = Range("d:d").Find(Range("l3"))
        If Not rng Is Nothing Then
            Range("m3") = rng.Offset(0, 3)
        End If
    End Sub

      拆分多表 具有通用性

    Sub chaifenshuju()
    
    
    Dim sht As Worksheet
    Dim k, i, j As Integer
    Dim irow As Integer '这个说的是一共多少行
    Dim l As Integer
    Dim sht0 As Worksheet
    
    
    
    Set sht0 = ActiveSheet
    
    l = InputBox("请输入你要按哪列分")
    
    
    '删除无意义的表
    Application.DisplayAlerts = False
    If Sheets.Count > 1 Then
        For Each sht1 In Sheets
            If sht1.Name <> sht0.Name Then
                sht1.Delete
            End If
        Next
    End If
    Application.DisplayAlerts = True '这个地方上课的时候我没改成true,请大家注意一下
    
    
    
    
    
    irow = sht0.Range("a65536").End(xlUp).Row
    '拆分表
    For i = 2 To irow
        k = 0
        For Each sht In Sheets
            If sht.Name = sht0.Cells(i, l) Then
                k = 1
            End If
        Next
        
        
        If k = 0 Then
            Sheets.Add after:=Sheets(Sheets.Count)
            Sheets(Sheets.Count).Name = sht0.Cells(i, l)
        End If
    
    Next
    '拷贝数据
    
    For j = 2 To Sheets.Count
        sht0.Range("a1:z" & irow).AutoFilter Field:=l, Criteria1:=Sheets(j).Name
        sht0.Range("a1:z" & irow).Copy Sheets(j).Range("a1")
    Next
    
    sht0.Range("a1:z" & irow).AutoFilter
    
    sht0.Select
    
    MsgBox "已处理完毕,牛逼不"
    
    End Sub
  • 相关阅读:
    python3 与dict相关的魔法方法。使用于二叉搜索树的类中
    笔记:nestjs学习基础(1)
    ES6 --(10)class使用、class继承
    redux --(1)核心概念(stateaction educer)、三大原则、todolist with redux
    antV--G2 学习
    react源代码重点难点分析
    jQuery-ui源代码重点难点分析
    webuploader上传插件源代码重点难点分析
    破解jQuery Deferred()异步执行的神秘世界
    ueditor源代码重点难点分析
  • 原文地址:https://www.cnblogs.com/xiao-xuan-feng/p/12662631.html
Copyright © 2011-2022 走看看