VBA知识点大全-日常分享
VBA 实战:从数据处理到自动化办公的高效解决方案
在日常办公中,Excel 的 VBA(Visual Basic for Applications)功能如同隐藏的 “效率加速器”,能将重复繁琐的操作转化为一键执行的自动化流程。下面通过两个典型案例,带大家领略 VBA 的实战魅力
案例一:批量数据清洗与格式标准化
某电商运营人员需要处理上万条订单数据,要求将分散在不同工作表的客户信息整合,并对手机号、邮箱等字段进行格式校验。传统手动操作不仅耗时,还容易出错。利用 VBA 编写数据整合程序,能大幅提升效率。
Sub 数据整合与清洗() '定义变量 Dim ws As Worksheet, newWs As Worksheet Dim lastRow As Long, i As Long Dim phoneRegex As Object, emailRegex As Object '创建正则表达式对象 Set phoneRegex = CreateObject("VBScript.RegExp") Set emailRegex = CreateObject("VBScript.RegExp") '设置手机号正则规则(以1开头的11位数字) With phoneRegex .Pattern = "^1\d{10}$" .Global = False End With '设置邮箱正则规则 With emailRegex .Pattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" .Global = False End With '检查是否存在"清洗后数据"工作表,不存在则创建 On Error Resume Next Set newWs = ThisWorkbook.Worksheets("清洗后数据") If newWs Is Nothing Then Set newWs = ThisWorkbook.Worksheets.Add newWs.Name = "清洗后数据" End If On Error GoTo 0 '表头设置 newWs.Range("A1").Value = "姓名" newWs.Range("B1").Value = "手机号" newWs.Range("C1").Value = "邮箱" newWs.Range("D1").Value = "订单金额" '遍历所有工作表(除了目标工作表) For Each ws In ThisWorkbook.Worksheets If ws.Name <> "清洗后数据" Then lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row '从第2行开始处理数据(假设第1行是表头) For i = 2 To lastRow '跳过空行 If ws.Range("A" & i).Value <> "" Then newWs.Cells(newWs.Rows.Count, "A").End(xlUp).Offset(1, 0).Value = ws.Range("A" & i).Value '校验手机号格式 If phoneRegex.Test(ws.Range("B" & i).Value) Then newWs.Cells(newWs.Rows.Count, "B").End(xlUp).Value = ws.Range("B" & i).Value Else newWs.Cells(newWs.Rows.Count, "B").End(xlUp).Value = "格式错误" End If '校验邮箱格式 If emailRegex.Test(ws.Range("C" & i).Value) Then newWs.Cells(newWs.Rows.Count, "C").End(xlUp).Value = ws.Range("C" & i).Value Else newWs.Cells(newWs.Rows.Count, "C").End(xlUp).Value = "格式错误" End If '处理订单金额,保留两位小数 newWs.Cells(newWs.Rows.Count, "D").End(xlUp).Value = Round(ws.Range("D" & i).Value, 2) End If Next i End If Next ws '美化表格格式 With newWs.Range("A1:D" & newWs.Cells(newWs.Rows.Count, "A").End(xlUp).Row) .Borders.LineStyle = xlContinuous .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .Font.Bold = True End With MsgBox "数据整合与清洗完成!", vbInformationEnd Sub
案例二:自动化生成月度报告
财务人员每月需根据 Excel 数据生成 PDF 格式的财务报告,包含数据汇总表、趋势图表和文字分析。通过 VBA 编程,可实现数据更新后一键生成完整报告。
Sub 生成月度财务报告() '定义变量 Dim wsData As Worksheet, wsReport As Worksheet Dim chartObj As ChartObject Dim pdfPath As String '设置数据工作表和报告工作表 Set wsData = ThisWorkbook.Worksheets("财务数据") Set wsReport = ThisWorkbook.Worksheets("月度报告") '更新数据汇总表 UpdateSummaryTable wsData, wsReport '更新趋势图表 UpdateTrendCharts wsData, wsReport '添加文字分析(可根据实际数据动态生成) AddAnalysisText wsReport '设置PDF保存路径 pdfPath = ThisWorkbook.Path & "\" & "月度财务报告_" & Format(Now, "yyyyMM") & ".pdf" '导出为PDF wsReport.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath, _ Quality:=xlQualityStandard, IncludeDocProperties:=True, _ IgnorePrintAreas:=False, OpenAfterPublish:=False MsgBox "月度财务报告已生成至:" & vbCrLf & pdfPath, vbInformationEnd Sub'更新数据汇总表Sub UpdateSummaryTable(wsData As Worksheet, wsReport As Worksheet) '这里编写数据汇总逻辑,例如求和、平均值等计算 '假设数据在wsData的A列到D列,从第2行开始 Dim lastRow As Long lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row '计算总收入 wsReport.Range("B3").Value = WorksheetFunction.Sum(wsData.Range("D2:D" & lastRow)) '计算支出合计 wsReport.Range("B4").Value = WorksheetFunction.Sum(wsData.Range("C2:C" & lastRow)) '计算利润 wsReport.Range("B5").Value = wsReport.Range("B3").Value - wsReport.Range("B4").ValueEnd Sub'更新趋势图表Sub UpdateTrendCharts(wsData As Worksheet, wsReport As Worksheet) '假设图表已存在,更新数据源 Dim chartObj As ChartObject Set chartObj = wsReport.ChartObjects("收入趋势图") '设置图表数据源(假设日期在A列,收入在D列) Dim lastRow As Long lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row chartObj.Chart.SetSourceData Source:=wsData.Range("A1:A" & lastRow & ",D1:D" & lastRow)End Sub'添加文字分析Sub AddAnalysisText(wsReport As Worksheet) '根据数据动态生成分析文字 Dim profit As Double profit = wsReport.Range("B5").Value wsReport.Range("B8").Value = "本月财务分析:" wsReport.Range("B9").Value = "本月总收入为" & Format(wsReport.Range("B3").Value, "¥0.00") & ",总支出为" & Format(wsReport.Range("B4").Value, "¥0.00") & "。" If profit > 0 Then wsReport.Range("B10").Value = "本月实现盈利" & Format(profit, "¥0.00") & ",经营状况良好。" Else wsReport.Range("B10").Value = "本月亏损" & Format(Abs(profit), "¥0.00") & ",需关注成本控制。" End If
End Sub
投票知识是否有用?(2选1)
- 非常有用 2
- 没用 2
4人参与
投票已截止
创作者俱乐部成员