VBA有其自身的优势,什么python取代VBA,根本不是那回事,只能说各有特点,各有各的长处,在工作中完全可以互相取长补短,各取所需,学会了VBA,绝对让你有一种相见恨晚的感觉,经常使用Excel,却不学VBA,绝对后悔。
VBA有其自身的优势,什么python取代VBA,根本不是那回事,只能说各有特点,各有各的长处,在工作中完全可以互相取长补短,各取所需,学会了VBA,绝对让你有一种相见恨晚的感觉,经常使用Excel,却不学VBA,绝对后悔。
一、VBA在我的Excel工作中的应用
下图是我的Excel工作簿,里面的成品出库工作表已录入一些数据明细。右边的发货单是由VBA一键生成的。
图1成品出库
图2发货单
图3
二、实现方法
1、先看简单的打印预览模块的实现方法
全部代码
Option Explicit
Sub 打印预览()
Dim n As Integer
Dim sh As Worksheet
Set sh = Sheets("发货单")
n = sh.Range("C65536").End(xlUp).Row
sh.PageSetup.PrintArea = "$C$1:$K$12"
sh.PrintPreview
End Sub
强制声明变更
Option Explicit
作用:在模块级别中使用,强制显示声明模块中的所有变量,所有变量只有声明后才能使用。这样可以避免变量因名称拼写等错误带来的结果错误,并且“Option Explicit”可以加快程序的运行速度,它节省了在程序运行时动态分配变量存储空间的时间。
模块结构
sub sub_name()
End Sub
sub_name 可以自己命名,中英均可,简单明了最好,但个人认为英文比较方便,推荐用驼峰命名法命名,但名字不能与其他模块重复。
定义变量及赋值
Dim n As Integer
Dim sh As Worksheet
Set sh = Sheets("发货单")
n = sh.Range("C65536").End(xlUp).Row
这里需要说明一下的是对于对象的赋值前面要写上Set,例如,Set sh = Sheets("发货单")。
n = sh.Range("C65536").End(xlUp).Row
这句话表示C列最后一行的行号
sh.PageSetup.PrintArea = "$C$1:$K$12"
sh.PrintPreview
这句话就是设置要打印的区域,上面代码表示C1:K12的区域。
效果如下图:
图4打印区域
图5预览图
2、另存为PDF模块实现方法
先看代码:
Option Explicit
Sub SaveasPDF()
'发货单
Dim name1 As String
Dim name2 As String
Dim paths As String
Dim date1 As Date
Dim sh As Worksheet
Set sh = Sheets("发货单")
name1 = Range("G2").Value
name2 = Range("J2").Value
paths = "D:\Documents\"
date1 = Date
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
sh.PageSetup.PrintArea = "$C$1:$K$12"
sh.ExportAsFixedFormat Type:=xlTypePDF, Filename:=paths & name1 & "-" & name2 & Format(date1, "mm-dd-yyyy"), openafterpublish:=True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
set sh=Nothing
End Sub
上面的代码大致分为五部分:
定义变量
Dim name1 As String
Dim name2 As String
Dim paths As String
Dim date1 As Date
Dim sh As Worksheet
变量赋值
Set sh = Sheets("发货单")
name1 = Range("G2").Value
name2 = Range("J2").Value
paths = "D:\Documents\"
date1 = Date
关闭屏幕刷新和自动计算
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'模块代码放在其中以提高运行速度
关键代码
sh.PageSetup.PrintArea = "$C$1:$K$12"
sh.ExportAsFixedFormat Type:=xlTypePDF, Filename:=paths & name1 & "-" & name2 & Format(date1, "mm-dd-yyyy"), openafterpublish:=True
其中,Type:=xlTypePDF 表示输出文档的类型,这里是PDF格式。
Filename:=paths & name1 & "-" & name2 & Format(date1, "mm-dd-yyyy") 表示设置文档另存为的路径。变量与字符串之间用&号连接。
openafterpublish:=True表示是否打开文档,True表示打开,False表示不打开。
代码结尾
set sh=Nothing
设置的对象最后记得这样设置一下,以释放内存。
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
前面关闭了屏幕刷新和自动计算,最后记得打开哟!
3、一键生成发货单——发货单模块
Option Explicit
Sub 发货单()
Dim i As Integer
Dim k As Integer
Dim irow As Integer
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set sh1 = Sheets("成品出库")
Set sh2 = Sheets("发货单")
If sh2.Range("B13").Value = "" Then
MsgBox "Please input customer Order NO."
sh2.Range("A2:K12").ClearContents
Exit Sub
End If
irow = sh1.Range("B65536").End(xlUp).Row
sh2.Range("A2:K12").ClearContents
sh2.Cells(2, "C").Value = "ORDER NO."
sh2.Cells(2, "E").Value = "CUSTOMER"
sh2.Range("A3:k3").Value = Array("description", "NO.", "product", "description", "规格", "件数", "QTY", "UNIT", "U/P", "货款", "remark")
k = 4
For i = 2 To irow
If sh1.Range("B" & i).Value = sh2.Range("B13").Value Then
sh2.Cells(k, "B") = k - 3
sh2.Cells(2, "D").Value = Format(Date, "yymmdd") & Format(sh2.Range("B13"), "000")
sh2.Cells(2, "F").Value = sh1.Range("B" & i).Offset(0, 5)
sh2.Cells(2, "G").Value = sh1.Range("B" & i).Offset(0, 1)
sh2.Cells(2, "K").Value = Date
sh2.Cells(2, "H").Value = sh1.Range("B" & i).Offset(0, 2)
sh2.Range("A" & k).Value = sh1.Range("B" & i).Offset(0, 8).Value
sh2.Range("C" & k).Value = sh1.Range("I" & i).Value
sh2.Range("D" & k).Value = sh1.Range("B" & i).Offset(0, 9).Value
sh2.Range("E" & k).Value = sh1.Range("B" & i).Offset(0, 10).Value
sh2.Range("F" & k).Value = sh1.Range("N" & i).Value
sh2.Range("G" & k).Value = sh1.Range("B" & i).Offset(0, 13).Value
sh2.Range("H" & k).Value = sh1.Range("T" & i)
sh2.Range("I" & k).Value = sh1.Range("U" & i)
sh2.Range("J" & k).Value = sh2.Range("G" & k) * sh2.Range("I" & k)
sh2.Range("K" & k).Value = sh1.Range("Y" & i)
sh2.Cells(10, "B") = "TOTAL"
sh2.Cells(10, "C") = "合计"
sh2.Cells(10, "F") = Application.WorksheetFunction.Sum(Range("F4:F9"))
sh2.Cells(10, "G") = Application.WorksheetFunction.Sum(Range("G4:G9"))
sh2.Cells(10, "J") = Application.WorksheetFunction.Sum(Range("J4:J9"))
sh2.Cells(11, "C") = "PREPARED BY"
sh2.Cells(11, "D") = "WangYongjie"
sh2.Cells(12, "C") = "运输费"
sh2.Cells(12, "D") = sh1.Range("W" & i)
sh2.Cells(12, "I") = "司机签字DRIVER SIGNATURE"
sh2.Cells(11, "F") = "CHECKED BY"
sh2.Cells(11, "I") = "APROVED BY"
sh2.Cells(11, "J") = sh1.Range("B" & i).Offset(0, 6).Value
k = k + 1
End If
Next i
If sh2.Range("D2").Value = "" Then
sh2.Range("F7").Value = "Nothing was found"
End If
Set sh1 = Nothing
Set sh2 = Nothing
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
上面代码主要使用了if判断语句和for循环语句,学过C语言入门的都能明白,这里不在详细解释,其他语句前面的模块中已经进行了说明,也不用再说明。
代码已经写好,剩下的就是插入按钮,并设置运行的模块,点击即可执行。这里想说明一点的是我的工作表中并没有一键生成发货单的按钮,那么我是如何一键生成发货单的呢?
请看下图的设置:
图6 change事件
这里使用了worksheet的change事件,这个事件的意思是当worksheet发生变化的时候,执行其中的代码。这里的代码表示shee9(发货单)的B13单元格发生变化时,调用发货单模块。
好了,本期就讲到这里,如有不妥或不明白之处,欢迎留言、评论,当然也欢迎大家点赞、收藏、转发,让更多的人领略Excel VBA数据处理的快乐。
在职场上经常要求能够熟练使用Excel处理数据,对于经常处理数据的人来说,这三种语言一定要学,而且入门很简单,根本没有你想象的那么难,关键是要认真地迈步第一步。
本教程所使用的系统环境:
win7
Excel2007
1、启用开发工具 打开一个Excel文件,点击下图红框所示按钮。
2、勾选如下图红框所示的选项,确定
3、点击确定后,工具栏中会出现如下图所示的开发工具选项。
4、按下图所示点击打开 Visual Basic 编辑器
5、再依次点击插入-模块,如下图所示
6、第一个代码-Hello world!
在A1单元格输出:Hello world!
代码如下图:
写好后按F5运行,或点击如图所示按钮
运行后效果:
上面的效果也可以这样写:
Cells(1, 1).Value = "Hello world !"
这是两种单元格赋值的方法。
7、代码注释
用英文单引号或rem开头。
到此,你已经进入了VBA高效处理Excel的大门,祝你入门顺利,欢迎点赞、关注、收藏、转发和评论,让我们一起领略VBA的风采。
联系客服