VBA批量提取数据到Excel

Excel在处理大量的数据时,会频繁对单元格进行重复的操作,而VBA正好在处理重复单元格操作时具有显著的优势,因此运用VBA代码完成excel表格间数据的处理就很有用,处理数据的第一步往往是将原始数据初步整理成待分析的数据。

Case:将A,B的原始数据从对应的文件夹中读取出来,并筛选其中符合条件的数据复制到指定单元格,最后将两者的数据导入到待数据分析的单元格中。

具体完成方式可以参考流程图。

复制
复制
筛选/复制
A/B数据复制
筛选/复制
原始数据A
表格Raw
原始数据B
表格Raw
表格Transfer
表格Analysis

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''主程序部分的代码
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Sumb()
	Dim Bookfile as string, FinalFilePath as string
	Dim shRaw as Worksheet

    Bookfile = ThisWorkbook.Name
    Set shRaw = Workbooks(Bookfile).Sheets("raw")
    
	With shRaw
    .Columns("B:G").ClearContents   '批量清除单元格内容
    .Columns("I:N").ClearContents
    .Columns("P:U").ClearContents
    End with
    
    Call A_Input  'Call调用子程序
    Call C_Input
    Call Raw_data_transfer
        
    FinalFilePath = "D:\Data-Transfer\Raw-Data\Lite\"
    
    If Dir(FinalFilePath, vbDirectory) = "" Then   '判断目标文件夹是否存在,若不存在则创建该文件夹
        MkDir FinalFilePath
        Else
    End If
    
    ChDir FinalFilePath
    ActiveWorkbook.SaveAs Filename:=FinalFilePath & "\" & "New Data Check.xlsm"   '处理完成的表格另存在指定路径下
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''将原始数据A复制到指定单元格中的子程序代码
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sub A_Input()
	Dim Bookfile as string, FinalFilePath as string,Openfilename as string
	Dim shRaw as Worksheet
	
    Bookfile = ThisWorkbook.Name
    
    Set shRaw = Workbooks(Bookfile).Sheets("raw")
    FilePath = "D:\FTP\Map\LAX\KKK\"
   
    ChDrive "D"
    ChDir FilePath
        
    Openfilename = Application.GetOpenFilename("raw files (*.csv), *.csv")
         
    If Openfilename = False Then
        Exit Sub
        Else
    End If
    
    Check_name = Split(Openfilename, "\")   'Split方法拆分字符串
    Max_name = UBound(Check_name)           'Ubound获取字符串拆分后的最大下标
    Rawfilename = Check_name(Max_name)      '获取拆分后的最后一个字符串
        
        Workbooks.Open Filename:=Rawfilename   '打开工作表
        Columns("B:G").Copy destination:=shRaw.range("B1")   '复制数据到指定路径
        Application.CutCopyMode = False
        
        shRaw.Cells(1, 2) = Check_name(UBound(Check_name) - 2)  
        Workbooks(Rawfilename).Close 0   '关闭工作表,0表示不保存,也可以写成False

End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''将原始数据B复制到指定单元格中的子程序代码(注释部分同上)
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub B_Input()
	Dim Bookfile as string, FinalFilePath as string,Openfilename as string
	Dim shRaw as Worksheet

    Bookfile = ThisWorkbook.Name
    Set shRaw = Workbooks(Bookfile).Sheets("raw")
    
    FilePath = "F:\FTP\Map\LCX\k7\"
   
    ChDrive "F"
    ChDir FilePath
        
    Openfilename = Application.GetOpenFilename("raw files (*.csv), *.csv")
         
    If Openfilename = False Then
        Exit Sub
        Else
    End If
    
    Check_name = Split(Openfilename, "\")
    Max_name = UBound(Check_name)
    Rawfilename = Check_name(Max_name)
        
        Workbooks.Open Filename:=Rawfilename

        Workbooks.Open Filename:=Rawfilename
        Columns("B:G").Copy destination:=shRaw.range("P1")
        Application.CutCopyMode = False
        shRaw.Cells(1, 16) = Check_name(UBound(Check_name) - 2)
        
        Workbooks(Rawfilename).Close 0
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''对原始数据进行筛选,并将筛选后的数据导入到待分析单元格的子程序代码
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Transfer()
	Dim shRaw as Worksheet
	On Error Resume Next   '忽略代码的错误继续运行下去
	Application.ScreenUpdating = FALSE   '禁止代码运行时屏幕刷新,可缩短代码运行时间
    Set shRaw = Workbooks(Bookfile).Sheets("raw")

    With sheets("Transfer")
    .Columns("B:H").ClearContents
    .Columns("J:P")..ClearContents
    .Columns("R:X")..ClearContents
    End with

    ShRaw.Select
    ShRaw.Cells.AutoFilter Filed:=3,Criterial:="X"  '筛选3列字段是"X"的数据
	ShRaw.Range("B:B,D:D,G:G").Copy Destination:=Sheets("Transfer").range("B:D")   '将表格Raw中的B,D,G三列数据复制到表格Transfer B至D列。
	
    ShRaw.Cells.AutoFilter Filed:=3,Criterial:="Y"   筛选3列字段是"Y"的数据
	ShRaw.Range("D:D,G:G").Copy destination:=Sheets("Transfer").range("E1")   '将表格Raw中的D,G两列数据复制到表格Transfer以E1为起始单元格的位置。
	
    ShRaw.Cells.AutoFilter Filed:=3,Criterial:="Circle"   '筛选3列字段是"X"的数据
	ShRaw.Range("D:D,G:G").Copy Destination:=Sheets("Transfer").range("G1")   '将表格Raw中的D,G两列数据复制到表格Transfer以G1为起始单元格的位置。
    Selection.AutoFilter   '取消筛选

    Application.Wait(10)   '等待10ms再运行,防止单元格操作太快产生卡顿
    ShRaw.Cells.AutoFilter Filed:=3,Criterial:="X"
	ShRaw.Range("I:I,K:K,N:N").Copy Destination:=Sheets("Transfer").Columns("J:J").Range("A1")
	
    ShRaw.Cells.AutoFilter Filed:=3,Criterial:="Y"
	ShRaw.Range("K:K,N:N").Copy destination:=Sheets("Transfer").Columns("M:M").Range("A1")
	
    ShRaw.Cells.AutoFilter Filed:=3,Criterial:="Circle"
	ShRaw.Range("K:K,N:N").Copy Destination:=Sheets("Transfer").Columns("O:O").Range("A1")
    Selection.AutoFilter
    
    Sheets("Analysis").Range("A:X").ClearContents
    Sheets("Transfer").Range("A:X").Copy Destination:=Sheets("Analysis").Columns("A:A").Range("A1")
    
    Application.ScreenUpdating = True  '允许代码运行时屏幕刷新,与前面禁止成对存在
End Sub

上述代码采用主程序+子程序的方法实现目的,实际上在设计较为复杂的功能通常会是将步骤拆分成多个子模块完成,最后在主程序中去调用子程序模块,这样既可以保持功能模块的独立性,方便代码的调试,也可以实现相同功能的子模块代码被重复调用的目的,具有较好的协调性。

写VBA代码习惯比较好的人可能会发现这部分代码有一个问题:部分变量没有进行声明,当需要直接用到上述模块的代码时,需要再VBE编辑器中去掉强制变量声明的代码(Option Explicit),否则代码会报错,或者也可将变量进行类型定义。

  • 25
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值