打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用Excel必学VBA,不学绝对后悔
userphoto

2023.02.23 重庆

关注

原创2022-07-01 18:20·WarAndPeace

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数据处理的快乐。


活到老学到老之VBA 入门一定要懂

原创2022-06-29 14:27·WarAndPeace

在职场上经常要求能够熟练使用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的风采。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Access,word,excel之间的数据传递
如何利用VBA自动生成PPT报告
Excel 如何使用VBA实现
Excel找出两列相同值的VBA宏代码
自学资料(Excel VBA)[收集整理15]
搜集各种Excel VBA的命令供参考!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服