VBA宏编程操作指南_第1页
VBA宏编程操作指南_第2页
VBA宏编程操作指南_第3页
VBA宏编程操作指南_第4页
VBA宏编程操作指南_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——VBA宏编程操作指南

VBA宏编程操作指南

修订记录版本V1.0日期2023-3-17jingpengtao说明VBA基础教程,不用自己写代码,不用看懂代码也可以写出适合自己工作的宏。

目录1.11.21.31.41.51.61.7第一部分:关键代码解释3其次部分:如何录制宏9第三部分:实例解释假使编写宏10第四部分:如何确定在哪个位置插入关键代码呢?20第五部分:如何调试宏20第六部分:分块合成VBA代码22第七部分:个人心得25

1/25

VBA宏编程操作指南

序:EXCEL在我们平日的生活工作中有着广泛和重要的应用,特别是对于每天和大量数据打交道的人员更重要,但同时对大量数据的操作又显得是那么的繁琐,一不防备就很简单出错,对于每天都需要用EXCEL做同样事情的人来说,要是能够有一种工具来自动做工作就好了。EXCEL宏就是一个解决此类问题的方法,编写好一个实用的EXCEL宏可以大幅度提高工作效率和质量,因此把握宏编程显得尤为重要。但是并不是每个人都学过编程,都了解VBA语言,那么怎样才能快速学习和把握应用宏呢?下面我就根据我个人的学习经验及理解来教大家如何学习VBA编程。不需要理解代码的含义,不需要知道哪一步操作是什么代码,只要你会复制粘贴,就能够写出EXCEL宏,提高你的工作效率。俗话说:“授之以鱼,不如授之以渔〞,所以替人写宏不如教给他方法,也便利各自修改。学完本教程,写一些简单的宏确定可以。编写本教程的目的就是为了便利经常和数据打交道的同事朋友,能够各自根据需要编写自己的宏。

备注:由于本教程V1、0版本只是针对从未接触过VBA语言及刚入门的人员编写的,并未涉及更详细的代码分析及条件语句,循环语句,数据语句等,将会在后期的版本更新中不断完善。

由于编者水平经验有限,难免会有一些不足之处,还望多多包涵。

2/25

VBA宏编程操作指南

第一部分:1.1第一部分:关键代码解释1、DimstrAsStringstr=ThisWorkbook.Path\***.xlsWorkbooks.Openstr代码解释:自动开启文件名为“***〞,属性为xls的文件。同时xlsx,csv文件也可开启。实际应用:假使你的宏执行需要好多文件,那么就可以再一开始就先执行

开启每个文件,如:DimstrAsStringstr=ThisWorkbook.Path\日常数据模板.xlsWorkbooks.Openstrstr=ThisWorkbook.Path\临时表.xlsWorkbooks.Openstrstr=ThisWorkbook.Path\扰码分布表.xlsWorkbooks.Openstr

2、Windows(***.xls).ActivateWorkbooks(***.xls).CloseSaveChanges:=False代码解释:关闭文件名为“***〞,属性为xls的文件等。其中SaveChanges:=False意为不保存直接关闭该文件,假使SaveChanges:=True,则表示保存之后再关闭该文件。实际应用:在执行完所有的代码之后关闭各个已开启的文件,对于需要保存数据的SaveChanges:=True即可,对于不需要保存数据的SaveChanges:=False。如:Windows(日常数据模板.xls).ActivateWorkbooks(日常数据模板.xls).CloseSaveChanges:=FalseWindows(扰码分布表.xls).ActivateWorkbooks(扰码分布表.xls).CloseSaveChanges:=TrueWindows(临时表.xls).ActivateWorkbooks(临时表.xls).CloseSaveChanges:=False

3/25

VBA宏编程操作指南

3、i=1While(Cells(i,1))i=i+1WendCells(i,1).SelectActiveSheet.Paste代码解释:此段语句主要是对单元格进行判断,是否为空白,假使为空白,则执行粘贴。具体解释请看下图:

假使你要把N个不同EXCEL的内容粘贴到一个新的EXCEL里,也就是汇总所有的数据。假使第一个EXCEL内容有13行,其次个EXCEL内容有18行,第三个EXCEL内容有20行,等等。可能你会说直接定位到单元格不行吗?当然,对于每天固定行数的EXCEL,是可以的,但是假使每天的数据都在变,今天第一个EXCEL有17行,其次天又变为10行,其次个EXCEL今天有20行,其次天变为25行,这样你就没法使用固定的单元格定位粘贴数据了。因此就需要上面的代码。语句类型为While……Wend……While(Cells(i,1))Cells(i,1)当i=1,表示A1单元格,也就是当A1单元格不为空白的时候,执行i=i+1,也就是接着判断A2是不是空白,依次类推……当执行到Ai为空白时(如上图则表示执行到A14),执行Cells(i,1).SelectActiveSheet.Paste,也就是选中A14单元格,进行粘贴。这样通过判断空白的方法就不会由于行数的变动而产生影响了。注意:上面我们说的只是根据Cells(i,1)判断,同样,也可以根据Cells(i,2)其次列判断,Cells(i,3)第三列判断等,这样就可以避免由于前面几列的空白列而导致后面列的判断出现问题。

4/25

VBA宏编程操作指南

4、i=1While(Cells(i,1))i=i+1WendCells(i,1).SelectRange(Selection,Selection.End(xlDown)).SelectSelection.EntireRow.Delete代码解释:此段语句主要是对单元格进行判断,是否为空白,假使为空白,则执行该单元格以下所有数据的清除。具体解释请看下图:

此代码的和3部分的代码有相像之处,不同的

地方时当判断Cells(i,1)为空时,下一步的执行不一样。Range(Selection,Selection.End(xlDown)).SelectSelection.EntireRow.Delete此语句执行之后如下:

也就是当Cells(i,1)为空时(本图表示A13为空时),从A13开始清除A13往右以及5/25

VBA宏编程操作指南

往下所有的数据。此语句主要用途:修正自动填充导致的数据超出计划。Range(A2).SelectSelection.AutoFillDestination:=Range(A2:A10)

假使你有A1-A12小区CI需要关联小区扰码,当你在B2单元格通过VLOOKUP关联数据时,你确定需要让B2自动填充到B12。但是假使你每天都需要关联数据,而每次数据都会变化,即今天要关联A1-A12,明天是A1-A20,这样就需要自动填充到A20,但是EXCEL不是智能的,你第一次设定的自动填充到A12,当然不会变了,这样就有可能导致数据不全。为了解决这个问题,你可以让EXCEL自动填充到第1000行,然后把多余的删掉就可以了(也就是把20行以后自动填充的数据自动删除)。如下图:从B21开始出现#N/A,这些数据没用的,使用i=1While(Cells(i,1))i=i+1WendCells(i,1).SelectRange(Selection,Selection.End(xlDown)).SelectSelection.EntireRow.Delete执行之后,B21往下的#N/A都会清空的。

6/25

VBA宏编程操作指南

5、Application.DisplayAlerts=False代码解释:在宏的执行过程中出现的告警框不显示。一般状况下,假使你执行宏,执行最终会出现如下截图,假使在代码的最前端加上一句Application.DisplayAlerts=False,那么就不会显示这些提醒信息了。

例如上图表示你再录制的过程中需要进行分列,我们知道在执行分列之后,会弹出上面的对话框要求选择,假使在代码的开始不增加Application.DisplayAlerts=False,则在执行的过程中会弹出对话框让我们选择,点击确定之后才会继续执行。

6、

MsgBox清除成功!ExitSubErr1:MsgBox清除失败!7/25

VBA宏编程操作指南

主要是MsgBox代码的应用,大家可以参考网上的一些资料,一般改代码都放在最后,会出现如下的运行界面,主要用于提醒信息。

7、ActiveSheet.Range($A$1:$AN$295).AutoFilterField:=12,Criteria1:=10104ActiveWindow.ScrollColumn=8ActiveWindow.ScrollColumn=7ActiveWindow.ScrollColumn=6ActiveWindow.ScrollColumn=5ActiveWindow.ScrollColumn=4ActiveWindow.ScrollColumn=3ActiveWindow.ScrollColumn=2ActiveWindow.ScrollColumn=1ActiveWindow.ScrollColumn=2ActiveWindow.ScrollColumn=3ActiveWindow.ScrollColumn=4Columns(N:N).SelectSelection.CopySelection.PasteSpecialPaste:=xlPasteValues,Operation:=xlNone,SkipBlanks_:=False,Transpose:=FalseActiveWindow.ScrollRow=126ActiveWindow.ScrollRow=501ActiveWindow.ScrollRow=1125ActiveWindow.ScrollRow=1625ActiveWindow.ScrollRow=2250ActiveWindow.ScrollRow=2375ActiveWindow.ScrollRow=2625A

ctiveWindow.ScrollRow=2750ActiveWindow.ScrollRow=2875ActiveWindow.ScrollRow=3000ActiveWindow.ScrollRow=31258/25

VBA宏编程操作指南

ActiveWindow.ScrollRow=3249ActiveWindow.ScrollRow=3374ActiveWindow.ScrollRow=3499ActiveWindow.ScrollRow=3624ActiveWindow.ScrollRow=3749ActiveWindow.ScrollRow=3999类似于ActiveWindow.ScrollColumn,ActiveWindow.ScrollRow,等等都是一些无用的代码,产生这些代码的原因就是由于我们拖拽鼠标,滑动鼠标的滑轮造成的,这些代码就是需要我们删除的,删除之后并不影响代码的运行,也同时使我们的代码变的精简美观。

其次部分:1.2其次部分:如何录制宏1、如何录制宏。首先开启EXCEL2023,点到“开发工具〞那一栏,(注意:有的人开启之后发现没有开发工具那一栏,原因可能是由于从没用过宏,没有开启其功能,需要在“信任中心〞下的宏设置里面设置为“启用所有宏〞即可)

2、开始录制宏9/25

VBA宏编程操作指南

点击录制宏,如下图所示,出现一个对话框,输入宏的名字,点击确定即可。

之后“录制宏〞会变成“中止录用〞,表示已经在录制过程中,在这个过程中你所进行有关EXCEL的操作都会被以代码的形式记录下来。

第三部分:1.3第三部分:实例解释假使编写宏在你创立一个宏命令之前,花几分钟来考虑你毕竟想做什么。由于宏命令是一大堆键盘输入的集合,事先计划你的行动十分重要。最早的计划宏命令的方法是手动地将宏命令需要做的事情做一遍。在你做键盘输入的同时,在一张纸上记录下他们实际发生的状况,不要漏掉任何东西。象录音机一样,Excel可以将你的所有动作录制下来(事实上并非如此,有些操作是无法录制的)。假使在录制宏之前,你没有很好地计划,你会录制好多不必要的步骤,而这些都会影响运行速度。尽管修改宏代码比去除录制宏里面不必要的步骤简单,但是,仅仅录制必要的步骤会节省你修改代码的时间和以后的麻烦。编写宏最简单的方法:复制粘贴删多余,补头补尾补关键。

实例一:实例一:10/25

VBA宏编程操作指南

TD扰码规划工具的编写,看起来不繁杂。最主要的就是要经纬度转换距离这个工具,当然这也是一个宏,我们不需要了解它,只要知道它的功能是转换距离就行了。

我们需要把宏所有需要的EXCEL文件放在同一个文件夹里。下面是我依照我的规划思路通过EXCEL宏录制出来最原始的代码:第一步:第一步:进行扰码分组Sub进行扰码分组()''Macro1MacroColumns(N:N).SelectSelection.InsertShift:=xlToRight,CopyOrigin:=xlFormatFromLeftOrAboveRange(N2).SelectActiveCell.FormulaR1C1==INT(RC[-1]/4+1)Range(N2).SelectSelection.AutoFillDestination:=Range(N2:N79)Range(N

2:N79).SelectColumns(N:N).SelectSelection.CopySelection.PasteSpecialPaste:=xlPasteValues,Operation:=xlNone,SkipBlanks_:=False,Transpose:=FalseRows(1:1).SelectApplication.CutCopyMode=FalseSelection.AutoFilterActiveWorkbook.Worksheets(原始表).AutoFilter.Sort.SortFields.ClearActiveWorkbook.Worksheets(原始表).AutoFilter.Sort.SortFields.AddKey:=Range_(N1),SortOn:=xlSortOnValues,Order:=xlAscending,DataOption:=_xlSortNormalWithActiveWorkbook.Worksheets(Sheet1).AutoFilter.Sort.Header=xlYes.MatchCase=False11/25

VBA宏编程操作指南

.Orientation=xlTopToBottom.SortMethod=xlPinYin.ApplyEndWithSelection.AutoFilterEndSub以上代码是我最开始录制的代码,我们需要对其进行修改。其实修改代码很简单,只要找对位置复制粘贴就可以了。Application.DisplayAlerts如=False代码,不管什么宏,只要把这句话加在代码的最前面就可以了。红色标注的Range(N2:N1000),注意看是从Range(N2:N79)改为Range(N2:N1000),为什么要改为1000呢?这是由于我们在录制宏的时候,采用的数据只有79行,而我们知道每次规划的原始数据行数确定会变化,有可能两百多行,为了防止数据不完全,我们就需要设置一个范围,根据自己的理解去设置。由上可知,我们设置为最大1000行,但是实际上的数据确定是小于1000行的,这样我们就需要把多余的行数删掉,就需要在代码后面加上下面这段代码,这样就能够达到我们想要的效果了。i=1While(Cells(i,1))i=i+1WendCells(i,1).SelectRange(Selection,Selection.End(xlDown)).SelectSelection.EntireRow.Delete

下面是修改之后的代码。Sub进行扰码分组()''Macro1MacroApplication.DisplayAlerts=FalseColumns(N:N).SelectSelection.InsertShift:=xlToRight,CopyOrigin:=xlFormatFromLeftOrAboveRange(N2).SelectActiveCell.FormulaR1C1==INT(RC[-1]/4+1)Range(N2).SelectSelection.AutoFillDestination:=Range(N2:N1000)i=112/25

VBA宏编程操作指南

While(Cells(i,1))i=i+1WendCells(i,1).SelectRange(Selection,Selection.End(xlDown)).SelectSelection.EntireRow.DeleteRange(N2:N1000).SelectColumns(N:N).SelectSelection.CopySelection.PasteSpecialPaste:=xlPasteValues,Operation:=xlNone,SkipBlanks_:=False,Transpose:=FalseRows(1:1).SelectApplication.CutCopyMode=FalseSelection.AutoFilterActiveWorkbook.Worksheets(原始表).AutoFilter.Sort.SortFields.ClearActiveWorkbook.Worksheets(原始表).AutoFilter.Sort.SortFields.AddKey:=Range_(N1),SortOn:=xlSortOnValues,Order:=xlAscending,DataOption:=_xlSortNormalWithActiveWorkbook.Worksheets(原始表).AutoFilter.Sort.Header=xlYes.MatchCase=False.Orientation=xlTopToBottom.SortMethod=xlPinYin.ApplyEndWithSelection.AutoFilter

EndSub经过我们的稍微修改,复制粘贴几个关键代码,一个完整的宏代码就产生了,是不是觉得很简单

呢?本来也不难的。

其次步:其次步:经纬度转换距离Sub经纬度换算距离()''Macro3Macro'Range(F2:G2).Select13/25

VBA宏编程操作指南

Range(Selection,Selection.End(xlDown)).SelectSelection.CopyWindows(经纬度算距离.xls).ActivateRange(A2).SelectActiveSheet.PasteWindows(TD扰码规划宏.xls).ActivateRange(F1:G1).SelectApplication.CutCopyMode=FalseSelection.CopyWindows(经纬度算距离.xls).ActivateRange(C2).SelectActiveSheet.PasteRange(C2).SelectApplication.CutCopyMode=FalseSelection.AutoFillDestination:=Range(C2:C79)Range(D2).SelectSelection.AutoFillDestination:=Range(D2:D79)Range(E2).SelectSelection.AutoFillDestination:=Range(E2:E79)

Columns(E:E).SelectSelection.CopyColumns(G:G).SelectSelection.PasteSpecialPaste:=xlPasteValues,Operation:=xlNone,SkipBlanks_:=False,Transpose:=FalseRange(G2).SelectRange(Selection,Selection.End(xlDown)).SelectWindows(TD扰码规划宏.xls).ActivateColumns(O:O).SelectApplication.CutCopyMode=FalseSelection.InsertShift:=xlToRight,CopyOrigin:=xlFormatFromLeftOrAboveWindows(经纬度算距离.xls).ActivateColumns(G:G).SelectSelection.CopyWindows(TD扰码规划宏.xls).ActivateActiveSheet.PasteRange(A1).SelectApplication.CutCopyMode=FalseActiveWorkbook.SaveEndSub以上是刚开始录制的宏代码,同样需要修改。14/25

VBA宏编程操作指南

依照一开始介绍的方法修改代码:补头,补尾,补关键。Sub经纬度换算距离()''Macro3Macro'Application.DisplayAlerts=FalseDimstrAsStringstr=ThisWorkbook.Path\经纬度算距离.xlsWorkbooks.Openstr(上面黄色的部分就是“补头〞)Windows(TD扰码规划宏.xls).ActivateRange(F2:G2).SelectRange(Selection,Selection.End(xlDown)).SelectSelection.CopyWindows(经纬度算距离.xls).ActivateRange(A2).SelectActiveSheet.PasteWindows(TD扰码规划宏.xls).ActivateRange(F1:G1).SelectApplication.CutCopyMode=FalseSelection.CopyWindows(经纬度算距离.xls).ActivateRange(C2).SelectActiveSheet.PasteRange(C2).SelectApplication.CutCopyMode=FalseSelection.AutoFillDestination:=Range(C2:C1000)Range(C2:C142).SelectRange(D2).SelectSelection.AutoFillDestination:=Range(D2:D1000)Range(D2:D142).SelectRange(E2).SelectSelection.AutoFillDestination:=Range(E2:E1000)i=1While(Cells(i,1))i=i+1WendCells(i,1).SelectRange(Selection,Selection.End(xlDown)).Select15/25

VBA宏编程操作指南

Selection.EntireRow.Delete(上面黄色和红色的部分就是“补关键〞)Columns(E:E).SelectSelection.CopyColumns(G:G).SelectSelection.PasteSpecialPaste:=xlPasteValues,Operation:=xlNone,SkipBlanks_:=False,Transpose:=FalseRange(G2).SelectRange(Selection,Selection.End(xlDown)).SelectWindows(TD扰码规划宏.xls).ActivateColumns(O:O).SelectApplication.CutCopyMode=FalseSelection.InsertShift:=xlToRight,CopyOrigin:=xlFormatFromLeftOrAboveWindows(经

纬度算距离.xls).ActivateColumns(G:G).SelectSelection.CopyWindows(TD扰码规划宏.xls).ActivateActiveSheet.PasteRange(A1).SelectApplication.CutCopyMode=FalseActiveWorkbook.SaveWindows(经纬度算距离.xls).ActivateWorkbooks(经纬度算距离.xls).CloseSaveChanges:=False(上面黄色的部分就是“补尾〞)EndSub又是一个只要复制粘贴就可以补全代码的例子,找准位置,写起来很简单的。

下面再贴几个代码来更好的说明下:日常数据制作宏是一个很典型的例子,能够很好的表现出来宏代码的初级应用。就拿日常数据制作宏(我只取其中4个RNC作为例子)来说:我们不需要看所有的代码,只要找到关键部分,然后复制粘贴就可以了。SubMacro2()''Macro2Macro'DimstrAsStringstr=ThisWorkbook.Path\日常数据模板.xls16/25

VBA宏编程操作指南

Workbooks.Openstrstr=ThisWorkbook.Path\RNC1.xlsWorkbooks.Openstrstr=ThisWorkbook.Path\RNC2.xlsWorkbooks.Openstrstr=ThisWorkbook.Path\RNC3.xlsWorkbooks.Openstrstr=ThisWorkbook.Path\RNC4.xlsWorkbooks.Openstr(上面标黄色的代码也就是我们一开始就列举的关键代码,也就是我们宏所需要的EXCEL文件,宏在执行之前需要先开启这些文件,由于在录制宏的时候这些代码是不能被录制的,所以需要我们手动加上去。)'复制RNC1的小区参数信息Windows(RNC1.xls).ActivateSheets(小区归属配置信息表).SelectRange(B1,B2).SelectRange(Selection,Selection.End(xlToRight)).SelectSelection.CopyWindows(日常数据模板.xls).ActivateSheets(小区参数信息).SelectRange(A1).SelectActiveSheet.PasteWindows(RNC1.xls).ActivateSheets(小区归属配置信息表).SelectRange(B5).SelectRange(Selection,Selection.End(xlToRight)).SelectRange(Selection,Selection.End(xlDown)).SelectSelection.CopyWindows(日常数据模板.xls).ActivateSheets(小区参数信息).Selecti=1While(Cells(i,1))i=i+1WendCells(i,1).SelectActiveSheet.Paste(上面的黄色代码就是进行空格判断之后,然后再进行粘贴的,就是针对每天都变化的数据而采用的代码。)'复制RNC2的小区参数信息Windows(RNC2.xls).ActivateSheets(小区归属配置信息表).SelectRange(B1,B2).Select17/25

VBA宏编程操作指南

Range(Selection,Selection.End(xlToRight)).SelectSelection.CopyWindows(日常数据模板.xls).ActivateSheets(小区参数信息).SelectRange(A1).SelectActiveSheet.PasteWindows(RNC2.xls).ActivateSheets(小区归属配置信息表).SelectRange(B5).SelectRange(Selection,Selection.End(xlToRight)).SelectRange(Selection,Selection.End(xlDown)).SelectSelection.CopyWindows(日常数据模板.xls).ActivateSheets(小区参数信息).Selecti=1While(Cells(i,1))i=i+1WendCells(i,1).SelectActiveSheet.Paste

'复制RNC3的小区参数信息Windows(RNC3.xls).

ActivateSheets(小区归属配置信息表).SelectRange(B1,B2).SelectRange(Selection,Selection.End(xlToRight)).SelectSelection.CopyWindows(日常数据模板.xls).ActivateSheets(小区参数信息).SelectRange(A1).SelectActiveSheet.PasteWindows(RNC3.xls).ActivateSheets(小区归属配置信息表).SelectRange(B5).SelectRange(Selection,Selection.End(xlToRight)).SelectRange(Selection,Selection.End(xlDown)).SelectSelection.CopyWindows(日常数据模板.xls).ActivateSheets(小区参数信息).Selecti=1While(Cells(i,1))i=i+118/25

VBA宏编程操作指南

WendCells(i,1).SelectActiveSheet.Paste

'复制RNC4的小区参数信息Windows(RNC4.xls).ActivateSheets(小区归属配置信息表).SelectRange(B1,B2).SelectRange(Selection,Selection.End(xlToRight)).SelectSelection.CopyWindows(日常数据模板.xls).ActivateSheets(小区参数信息).SelectRange(A1).SelectActiveSheet.PasteWindows(RNC4.xls).ActivateSheets(小区归属配置信息表).SelectRange(B5).SelectRange(Selection,Selection.End(xlToRight)).SelectRange(Selection,Selection.End(xlDown)).SelectSelection.CopyWindows(日常数据模板.xls).A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论