vba 订阅
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。它也可说是一种应用程式视觉化的 Basic 脚本。1993年由微软公司开发的应用程序共享一种通用的自动化语言--------即Visual Basic for Application(VBA),实际上VBA是寄生于VB应用程序的版本。1994年发行的Excel 5.0版本中,即具备了VBA的宏功能。 展开全文
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。它也可说是一种应用程式视觉化的 Basic 脚本。1993年由微软公司开发的应用程序共享一种通用的自动化语言--------即Visual Basic for Application(VBA),实际上VBA是寄生于VB应用程序的版本。1994年发行的Excel 5.0版本中,即具备了VBA的宏功能。
信息
启发语言
Visual Basic,QuickBASIC
外文名
Visual Basic for Applications
操作系统
Microsoft Visual,Mac OSX
简    称
VBA
发行时间
1993年
释    义
Visual Basic的一种宏语言
语言属性
应用程序一种通用的自动化语言
中文名
Visual Basic宏语言
功    能
扩展Windows的应用程式功能
具备功能时间
1994
VBA概述
Visual Basic for Applications(简称VBA)是新一代标准宏语言,是基于Visual Basic for Windows 发展而来的。它与传统的宏语言不同,传统的宏语言不具有高级语言的特征,没有面向对象的程序设计概念和方法。而VBA 提供了面向对象的程序设计方法,提供了相当完整的程序设计语言。VBA 易于学习掌握,可以使用宏记录器记录用户的各种操作并将其转换为VBA 程序代码。这样用户可以容易地将日常工作转换为VBA 程序代码,使工作自动化。 [1]  VBA是基于 Visual basic发展而来的,与VB具有相似的语言结构。从语言结构上讲,VBA是VB的一个子集,它们的语法结构是一样的。两者的开发环境也几乎相同。但是,VB是独立的开发工具,它不需要依附于任何其他应用程序,它有自己完全独立的工作环境和编译、链接系统。VBA却没有自己独立的工作环境,它必须依附于某一个主应用程序,VBA专门用于Office的各应用程序中,如Word、 Excel、 Access等。在 Access中,可以通过VBA编写模块来满足特定的需要。 [1]  正是由于VBA与主应用程序的这种关系,使得它与主程序之间的通信变得简单而高效。它与 AutoCAD完全共享内存空间,所以执行速度比用C语言开发的ADS应用程序要快很多。 [2]  VBA提供了面向对象的程序设计方法,提供了相当完整的程序设计语言。它的编写是以子过程和函数为单位,在 Access中以模块形式出现。 [1]  Office取得巨大成功的一个重要原因就是VBA,使用VBA可以完成很多事情,基于Excel、Word的VBA小程序不计其数。Office中的应用程序可以共享VBA语言,如果掌握了在 Excel 2016中使用VBA的方法,那么在Word、Power Point中使用VBA自然会变得易如反掌。掌握对VBA语言的使用,可以让复杂的工作简易化,减少不必要的重复性工作,大大提高我们的工作效率。 [3]  VBA程序员很多是业余程序员,正因为业余,解决的却是工作中需要解决的问题;所以,VBA程序大多都是只是在部门内部或个人使用的小工具。集成了VBA的其他应用程序也很多,但真正能为程序增色的不多。 [1]  大多数人看到了VBA可以自动化一个程序,可以扩展已有程序,但没有看到在Office中,VBA代码可以是录制的,而不是写出来的,带来的好处是,学习曲线变得非常缓。如果没有宏录制功能,要熟悉某个Office组件的对象模型,绝非一日之功。 [1]  以ArcGIS为例,ArcGIS扩展必须使用ArcObject,不管是使用VBA也罢,VB也罢,还是C++也罢。但同时,ArcObject的学习不是一天两天可以搞定,对于业余程序员,要使用VBA来扩展ArcGIS,几乎没有可能;专业程序员又不屑使用VBA;而对于公司,如果要基于ArcObject来扩展ArcGIS,选择VBA意味着源码的保护很困难。所以,ArcGIS的VBA就如同鸡肋。 [1]  VBA 是基于Visual Basic 发展而来的,它们具有相似的语言结构。Visual Basic 是Microsoft 的主要图形界面开发工具,VBA 5.0 (亦即VBA 97)则是Visual Basic 5.0 的子集。Visual Basic 是由Basic 发展而来的第四代语言。Visual Basic 作为一套独立的 Windows 系统开发工具,可用于开发Windows 环境下的各类应用程序,是一种可视化的、面向对象的、采用事件驱动方式的结构化高级程序设计语言。它具有高效率、简单易学及功能强大的特点。VB 的程序语言简单、便捷,利用其事件驱动的编程机制,新颖易用的可视化设计工具,并使用Windows应用程序接口(API)函数,采用动态链接库(DLL)、动态数据交换(DDE)、对象的链接与嵌入(OLE)以及开放式数据库访问(ODBC)等技术,可以高效、快速地编制出 Windows 环境下功能强大、图形界面丰富的应用软件系统。 [1]  Visual Basic 程序很大一部分以可视(Visual)形式实现,这意味着在设计阶段就可以看到程序运行的屏幕画面,用户可以在设计时能够方便地改动画面图像、大小、颜色等,直到满意为止。VB 的用户可以是缺乏Windows 及C 语言开发经验的专业软件人员,也可以是具有一定Windows开发经验的专业人员,VB 的可视化编程方法使得原来繁琐枯燥、令人生畏的Windows 应用程序设计变得轻松自如、妙趣横生。以往的Windows 应用程序开发工具在设计图形用户界面时,都是采用编程的方法,并伴随大量的计算任务,一个大型应用程序约有90%的程序代码用来处理用户界面,而且在程序设计过程中不能看到界面显示的效果,只有在程序执行时才能观察到,如果界面效果不佳,还需要回到程序中去修改。Visual Basic 提供了新颖的可视化设计工具,巧妙地将Windows界面设计的复杂性封装起来,程序开发人员不必再为界面设计而编写大量程序代码,仅需采用现有工具按设计者要求的布局,在屏幕上画出所需界面,并为各图形对象设置属性即可,VB 自动产生界面设计代码,这样便将事先编制好的控件可视地连接到一起,构成一个随时可调整的界面。 [1]  VBA 不但继承了VB 的开发机制,而且VBA 还具有与VB 相似的语言结构,它们的集成开发环境IDE(Intergrated Development Environment)也几乎相同。但是,经过优化,VBA 专门用于Office 的各应用程序。VB 可运行直接来自Windows 95 或NT 桌面上的应用程序,而VBA 的项目(Project)仅由使用VBA 的Excel、Word、 PowerPoint 等称为宿主(Host)的Office 应用程序(Application)来调用。 [1]  1. VB是设计用于创建标准的应用程序,而VBA是使已有的应用程序(EXCEL等)自动化。 [3]  2. VB具有自己的开发环境,而VBA必须寄生于已有的应用程序。 [3]  3. 要运行VB开发的应用程序,用户不必安装VB,因为VB开发出的应用程序是可执行文件(*.EXE),而VBA开发的程序必须依赖于它的父应用程序,例如EXCEL。 [3]  4.VBA是VB的一个子集。 [3]  尽管存在这些不同,VBA和VB在结构上仍然十分相似。事实上,如果你已经了解了VB,会发现学习VBA非常快。相应的,学完VBA会给学习VB打下坚实的基础。而且,当学会在EXCEL中用VBA创建解决方案后,即已具备在WORD ACCESS OUTLOOK FOXPRO POWERPOINT 中用VBA创建解决方案的大部分知识。 [3]  * VBA一个关键特征是你所学的知识在微软的一些产品中可以相互转化。 [3]  * VBA可以称作EXCEL的“遥控器”。 [3] 
收起全文
精华内容
下载资源
问答
  • vba

    2013-04-08 14:26:25
    Erase arr(清空VBA数组)  在循环中,如果需要清空VBA数组,可以用Erase方法来实现. 该示例使用 Erase 语句重新初始化固定大小的数组中的元素,以及释放动态数组存储空间。 Dim NumArray(10) As Integer ' ...

    Erase arr(清空VBA数组)  

    在循环中,如果需要清空VBA数组,可以用Erase方法来实现.

    该示例使用 Erase 语句重新初始化固定大小的数组中的元素,以及释放动态数组存储空间。

    Dim NumArray(10) As Integer ' Integer 数组。

    Dim StrVarArray(10) As String '变长的 String 数组。

    Dim StrFixArray(10) As String * 10 '定长的 String 数组。

    Dim VarArray(10) As Variant 'Variant 数组。

    Dim DynamicArray() As Integer '动态数组。

    ReDim DynamicArray(10) '分配存储空间。

    Erase NumArray '将每个元素设为 0。

    Erase StrVarArray '将每个元素设为 '零长度字符串 ("")。

    Erase StrFixArray '将每个元素设为 0。

    Erase VarArray '将每个元素设为 Empty。

    Erase DynamicArray '释放数组所用内存。

    VBA动态数组 

    VBA动态数组

    偶尔用到VBA,发现在help中就有VB的简单的帮助,第一次用需要安装,程序会自动安装好。

    关于动态数组在网上搜索得出的结论如下:

    1. 用法

    Dim sAry() As Variant
    ReDim sAry(2) '定义成三个
    ReDim Preserve sAry(4) '定义成五个
    ReDim Preserve sAry(3) '定义成四个
    Erase sAry '回收数组
    2. 可能在有效区域内有效,跳出后就释放了,如果不放心,那么同上面使用Erase

    vba,vb,动态数组,帮助,excel



    展开全文
  • 一小时搞定 简单VBA编程 Excel宏编程快速扫盲

    万次阅读 多人点赞 2018-01-19 09:45:19
    1. Excel VBA编辑界面 (进入路径: sheet名称 --> 鼠标右键菜单 --> 查看代码) 2. 输入代码方法: 在VBE编辑器的代码模块中输入VBA代码,通常有以下几种方法: ■手工键盘输入; ■使用...

    Excel宏编程可以快速完成批量表格操作:复制粘贴、数据过滤等,宏代码基于VB语言实现,有基础的编程经验就能快速阅读。下面是我的学习笔记。

     

    1. Excel VBA编辑界面

    (进入路径: sheet名称 --> 鼠标右键菜单 --> 查看代码)

     

    2. 输入代码方法:

    在VBE编辑器的代码模块中输入VBA代码,通常有以下几种方法: 

    ■ 手工键盘输入; 

    ■ 使用宏录制器,即选择菜单“工具——宏——录制新宏”命令,将所进行的操作自动录制成宏代码; 

    ■ 复制/粘贴代码,即将现有的代码复制后,粘贴到相应的代码模块中; 

    ■ 导入代码模块:文件-->导入文件 **不用的模块可以:文件-->移出模块

     

    3. VB代码阅读扫盲

    (1) 模块声明:

    Sub sName() ... End Sub
    Sub xxxxx()
    XXXXXXXXX
    End Sub

    (2) 变量声明:

    Dim sPara As sType
    Dim para1, para2, para3
    Dim para4 As workbook, para5 As String
    Dim G As Long

    (3) 选择结构:

    With ... End With
    If condition Then ... End If
    
    # 举个例子:遍历每个Sheet把表粘贴成一个大表的语句,使用For Next With End With语句
    
    With Workbooks(1).ActiveSheet
    For G = 1 To Sheets.Count
    Wb.Sheets(G).UsedRange.Copy       .Cells(.Range("B65536").End(xlUp).Row + 1, 1)
    Next
    WbN = WbN & Chr(13) & Wb.Name
    Wb.Close False
    End With

    (4) 循环结构

    Do While condition ... Loop
    For i = 0 to 100 ... Next

    (5) 输出Log:

    MsgBox sString

    案例解析:解析拷贝路径下所有Excel到一个工作表下的示例:

    ************************************************************************************************************************************

    Sub 合并当前目录下所有工作簿的全部工作表()  #模块名称
    Dim MyPath, MyName, AWbName	  		#变量声明
    Dim Wb As workbook, WbN As String
    Dim G As Long
    Dim Num As Long
    Dim BOX As String
    Application.ScreenUpdating = False			#停止屏幕刷新
    MyPath = ActiveWorkbook.Path				#获取当前工作文件路径
    MyName = Dir(MyPath & "\" & "*.xls")		#获取当前文件名(截取字符串)
    AWbName = ActiveWorkbook.Name			#获取当前BookName
    Num = 0								#准备进入循环处理
    Do While MyName <> ""					#第一个循环体:遍历所有文件 终止条件是 文件名为空
    If MyName <> AWbName Then				#条件:文件名当前激活文件不同
    Set Wb = Workbooks.Open(MyPath & "\" & MyName)		# 设置工作表的名称(当前Sheet Name)
    Num = Num + 1						#计数用于输出
    With Workbooks(1).ActiveSheet
    .Cells(.Range("B65536").End(xlUp).Row + 2, 1) = Left(MyName, Len(MyName) - 4)
    #赋值语句:激活Sheet的A列最后一个单元格赋值为MyName去掉‘.xls’的部分
    #Left 截取字符串 去掉了'.xls'
    #workbooks(n) 为取工作簿 的写法
    #A65535(一个极大数)单元格向上,最后一个非空的单元格的行号
    For G = 1 To Sheets.Count					#嵌套循环体:遍历文件的所有Sheets
    Wb.Sheets(G).UsedRange.Copy .Cells(.Range("B65536").End(xlUp).Row + 1, 1)	
      	#赋值所有内容到以结束内容空一行开始的表格中
    Next									#且套循环体结束							
    WbN = WbN & Chr(13) & Wb.Name			# & 为合并字符串的符号		
    Wb.Close False							#对于文件操作结束,关闭Excel文件
    End With								#退出第二个判断
    End If								#退出第一个判断
    MyName = Dir		 					#怎么拿到第二个bookName
    Loop									#循环体结束
    Range("B1").Select						#选中B1
    Application.ScreenUpdating = True			#允许Excel屏幕刷新
    MsgBox "共合并了" & Num & "个工作薄下的全部工作表。如下:" & Chr(13) & WbN, vbInformation, "提示"
    End Sub

     

    ************************************************************************************************************************************

    常用模块:

    1. 把一个workBook的一块表格拷贝到另一个WorkBook中的一般化方法:

    上面的代码中是一种简单的实现:拷贝所有内容到空行区域

    需要将拷贝的内容和粘贴的位置控制更加精准控制:

     

    拷贝指定位置到指定位置:

    Workbooks("工作簿1.xls").Sheet1.Range("A1:C50").Copy ThisWorkbook.Sheet2.Range("A1")

    2. 找到粘贴位置:

    b=sheet2.[BI].end(xlToLeft).row+1 获取最后一次编辑的各自的列号!
    
    .Range("B65536").End(xlUp).Row + 2 最后一次编辑的格子的行号

    A1 直接编辑

    .Cells(nRowNo, nColNo)

    ...

     

     

    实战案例分析:一个将多个相同格式表格合并生成横表的例子:

    Sub 合并当前目录下所有工作簿的全部工作表()
    
    Dim MyPath, MyName, AWbName
    Dim Wb As Workbook, WbN As String
    Dim G As Long
    Dim Num As Long
    Dim BOX As String
    Dim HasTitil As Boolean
    Dim LastRange As String
    Dim CurRowNo As Long
    
    Application.ScreenUpdating = False
    MyPath = ActiveWorkbook.Path
    MyName = Dir(MyPath & "\" & "*.xls")
    AWbName = ActiveWorkbook.Name
    Num = 0
    HasTitil = False
    
    With Workbooks(1).ActiveSheet
    .Cells(1, 2) = "Cor.Name"
    Do While MyName <> ""
    If MyName <> AWbName Then
    Set Wb = Workbooks.Open(MyPath & "\" & MyName)
    Num = Num + 1
    .Cells(1, Num + 2) = Left(MyName, Len(MyName) - 4)
    
    If HasTitil <> True Then
    
    Wb.Sheets(1).Range("A4:B43").Copy .Cells(2, 1)
    Wb.Sheets(1).Range("E4:F43").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
    Wb.Sheets(2).Range("A5:B73").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
    Wb.Sheets(2).Range("E5:F73").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
    Wb.Sheets(3).Range("A4:B32").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
    Wb.Sheets(3).Range("E4:F32").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
    Wb.Sheets(4).Range("A5:B100").Copy .Cells(.Range("A65536").End(xlUp).Row + 1, 1)
    
    HasTitil = True
    End If
    
    CurRowNo = 2
    Wb.Sheets(1).Range("D4:D43").Copy .Cells(CurRowNo, Num + 2)
    CurRowNo = CurRowNo + 40
    Wb.Sheets(1).Range("H4:H43").Copy .Cells(CurRowNo, Num + 2)
    CurRowNo = CurRowNo + 40
    Wb.Sheets(2).Range("D5:D73").Copy .Cells(CurRowNo, Num + 2)
    CurRowNo = CurRowNo + 69
    Wb.Sheets(2).Range("H5:H73").Copy .Cells(CurRowNo, Num + 2)
    CurRowNo = CurRowNo + 69
    Wb.Sheets(3).Range("D4:D32").Copy .Cells(CurRowNo, Num + 2)
    CurRowNo = CurRowNo + 29
    Wb.Sheets(3).Range("H4:H32").Copy .Cells(CurRowNo, Num + 2)
    CurRowNo = CurRowNo + 29
    Wb.Sheets(4).Range("D5:D100").Copy .Cells(CurRowNo, Num + 2)
    
    Wb.Close False
    End If
    MyName = Dir
    Loop
    
    End With
    
    Range("B1").Select
    Application.ScreenUpdating = True
    End Sub

     

    展开全文
  • VBA

    千次阅读 2007-08-04 13:20:00
    VBA一,概述 二, 宏 三,使用控件设计用户界面 四,使用VB编辑器 五,VBA语法基础 六,VBA对象模型 七,模块 八,测试与错误处理 九,VBA的安全性和保护工具 十,VBA程序的部署 十一,VBA高级应用 参见 一,概述VBA...
    VBA
    
    一,概述 二, 宏 三,使用控件设计用户界面 四,使用VB编辑器 五,VBA语法基础 六,VBA对象模型 七,模块 八,测试与错误处理 九,VBA的安全性和保护工具 十,VBA程序的部署 十一,VBA高级应用 参见

    一,概述

    VBA(Visual Basic For Applications)是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。VBA是Visual Basic的一个子集,VBA不同于VB,原因是VBA要求有一个宿主应用程序才能远行,而且不能用于创建独立应用程序。而VB可用于创建独立的应用程序。VBA可使常用的过程或者进程自动化,可以创建自定义的解决方案,最适用于来定制已有的桌面应用程序。

     

    通常意义上的VBA就是在Office中包含着的一种加强Office功能的Basic语言。经过发展,在Office中,Word、Excel、Access、PowerPoint?四个软件都有了自己的程序设计语言,分别称为WordBasic?、ExcelBasic?、AccessBasic?、PowerPointBasic?(在Outlook中的开发语言为Visual Basic Scripting Edition)。通常统一称为VBA(VB for Application)。

     

    二, 宏

     

    宏是能够自动完成某个任务的一组指令,这些指令放在一起就如同一个命令一样。宏与Dos中的批处理文件一样。批处理文件用于自动化用户完成的一组任务。VBA把需要重复进行的任务创建宏,并编写其它涉及决策的任务的代码以完成任务自动化,最后可以把这个过程保存成文件并发布。

     

    录制宏比从头开始编写代码要快得多。在实际开发中,为节省时间可以先录制尽可能多的宏,用它来建立应用程序的基础,然后再对录制下来的代码进行修改。

     

    1,录制宏:在VBA中,可以采用宏录制器或编程的方式自动处理任务。不必了解宏录制器使用的编程语言,便可以在VBE编辑宏。通过记录完成任务的步骤,或者在VBA中编程,都可以创建宏。Office应用程序,例如word、Excel、PowerPoint?、Access和Outlook都支持宏。Office应用程序提供的创建宏的工具是Macro Recorder(宏录制器)和VB编辑器。宏录制器用于自动化重复的任务,而VB编辑器自动化那些涉及决策的任务。可以给宏指定符号(工具栏上的图标)、键(键盘上的键)或名字,用于表示一列命令、活动或击键。

     

    录制宏有两种方式,一是双击状态栏中的"录制"命令,或者鼠标单击工具/宏/录制新宏命令,WORD等将记录下您的操作并转换为VBA语言。

     

     

    2,修改宏:

     

    A, 指定快捷键:

     

    B, 指定宏的保存位置:Excel可保存宏到个人宏工作簿中

     

    C, Excel可将宏指定给按钮(视图|工具栏|窗体|点选按钮到页面|指定宏)/图片(插入|图片|右击图片|指定宏)/工具栏按钮(工具|自定义|命令|宏|自定义...|拖动自定义按钮到工具栏|右击按钮可编辑图标和指定宏|关闭自定义...)

     

    三,使用控件设计用户界面

     

    首先要进行需求分析:应用程序的客户是谁,使用的数据的来源,数据保存在哪,对数据怎么操作,输出结果是什么?然后根据用户需求来添加控件(标签,按钮,复选框,选项按钮,列表框,组合框,滚动条控件,微调控件。)使用工作表还是用户窗体完全取决于个人的爱好和应用程序的用户。熟练Excel用户适合以工作表的形式工作。初级用户适合使用用户窗体。

     

    1, 向工作表添加控件: 视图|工具栏|窗体|点选控件到工作表|右击工作表上的控件选设置控件格式。通过使用控件、设置格式和公式,可以执行一些简单的自动化任务(至少对你的用户来说是这样)。

     

    2, 向用户窗体添加控件:

     

    (1)添加用户窗体: 打开一个新的工作簿|工具|宏|VBE|VBE的工具栏上的“插入用户窗体”按钮(或者选择“插入|用户窗体”,显示出新添加的用户窗体)

     

    (2)设置用户窗体的Name(一般前缀推荐取frm),Caption等属性

     

    (3)添加控件到用户窗体上:只要从工具箱中选择想要使用的控件,然后使用鼠标把控件拖到窗体上就可以了。

     

    (4)设置控件的Name,Caption和其它相关属性:控件Name命名前缀规范:复选框chk,组合框cbo,命令按钮cmd或者btn,分组框grp或者fra,图像img,标签lbl,列表框lst,多页(MultiPage?)mul,选项按钮opt,引用编辑(RefEdit?)ref,滚动条hsb或者vsb(取决于是水平的还是垂直的),微调项spn,选项卡条(TabStrip?)tab,文本框txt,切换按钮tog

     

    A, 命令按钮Default属性:一个窗体上只有一个命令按钮的Default属性可以设置为True。把Save(保存)/Cancel?(取消)按钮的Default属性设置为True。在窗体上当按下回车键时,窗体将执行保存/取消操作。

     

    B,控件的尺寸调整为一致并对齐:同时选中两个控件|点工具栏上“宽度相同”按钮旁边的向下箭头|选'两者都相同'|点“对齐”工具栏按钮旁边的向下箭头|选'左对齐',

     

    C,禁用控件:把Enabled(启用)属性设置为False就可以禁用控件。

     

    D,为控件分配Tab键切换顺序:设置TabIndex?属性值,可以从第一个控件起设置其TabIndex?为0,1,2..,也可以从最后一个控件起逆序设置每个TabIndex?为0(原理:当把某个控件的TabIndex?属性值设置为0时,其他所有控件的TabIndex?属性值都会加1)

     

    E,为控件分配加速键(键盘访问键):在控件的标题字母中找出一个作为该控件的加速键,把该字母赋值给控件的Accelerator属性,当设置完成以后,控件标题中该字母下会有下划线

     

    (5)运行用户窗体: 按F5键

     

    四,使用VB编辑器

     

    VBE(Microsoft Visual Basic Editor,Visual Basic 编辑器,VB编辑器)就是我们设计/调试VBA代码的编辑器,它是捆绑在Application(如WORD)应用程序中的一个程序。进入VBE的方式:ALT+F11;工具/宏/Visual? Basic 编辑器命令;工具/宏/宏对话框,创建或者编辑命令,也可以进入Visual Basic 编辑器

     

     

    1, 使用工具栏

     

    2, 浏览代码功能:编辑|查找或替换;书签标注需要查错,添加代码,更新或升级的代码区域。

     

    3, 使用在线帮助:帮助|Microsoft Visual Basic帮助

     

    4, 使用对象浏览器:单击标准工具栏上的“对象浏览器”按钮。/选视图|对象浏览器/按F2键。

     

    5, 设置编辑器选项:工具|选项|编辑器选项卡|自动显示快速信息,自动语法检测等

     

    五,VBA语法基础

    VBA语法基础

     

    六,VBA对象模型

    VBA对象模型

     

    七,模块

     

    作为一个单元保存在一起的定义、过程、函数和事件处理程序的集合称为模块。每个应用程序都是模块的集合。模块充当了项目的基本构件。它们是存储代码的容器。如果统筹安排模块内的代码,将有利于维护、调试和重复使用代码。如下共有三种类型的模块:

     

    1,用户窗体: 是用于为应用程序提供用户界面,采用.frm扩展名存储的用户窗体。窗体模块包含窗体中的所有控件及其属性。也可以为窗体和控件指定常量和变量声明、过程以及事件过程。窗体模块中的所有声明都默认是Private(私有),不能在窗体外访问。

     

    2,标准模块: 是用于存储通用过程,以便其他模块中的过程可以调用,采用.bas扩展名存储的代码模块。它们包含常量、类型、变量、过程和函数的声明。标准模块中所有声明都默认是Public(公共的),可以在模块外全局访问。当录制宏时,如果不存在该模块,Excel会自动为你创建。如果愿意,也可以添加附加的模块。Excel和VBA并不关心过程位于哪个模块中,只要过程位于打开的工作簿中即可。

     

    3,类模块: 类模块的使用方式与窗体模块相似。两者之间惟一差别是类模块中不包含可见组件。使用类模块可以创建自己的对象。类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。要为每个类编写代码,必须使用类模块。窗体是类模块的示例。窗体是指包含属性(如字体、名称和标题)、方法(如单击)、预定义行为的对象。当创建窗体时,它会成为代码的独立模块。同样,所有控件,例如命令按钮和文本框,都是它们各自类的对象。

     

    变量命名前缀规范:

     

    数据类型 短前缀 长前缀
    A r r a y a a r y
    B o o l e a n f b i n
    B y t e b b i t
    C u r r e n c y c c u r
    D a t e / Ti m e d t dtm/d a t
    D o u b l e d d b l
    I n t e g e r I i n t
    L o n g l l n g
    O b j e c t o o b j
    S i n g l e ? s n g
    S t r i n g s s t r
    Va r i a n t v v a r

     

     

    八,测试与错误处理

     

    1,测试:

     

    (1)测试代码,检查它是否正确。为确保代码能够正常作用,必须在指定时间周期内采用不同的样本数据运行它。

     

    (2)如果代码没有按照预想方式正常作用,就需要调试它。可以用VBA提供的调试工具调试代码。

     

    (3)尽力模拟代码运行的不同环境,并检查其正确性。重点是检查代码的可移植性。

     

    (4)在成功地测试了代码之后,可以对观察到的现象进行存档,例如代码末正常运行的环境。

     

    2,错误类型:Error(错误,可捕获并用代码处理)并非Bug(程序错误,无法捕获)

     

    A, 语法错误(如输入时关键字或标点符号拼写错误)

     

    B, 编译错误(如使用对象的方法时,该对象并不支持这个方法)

     

    C, 运行期间错误(如除0、打开或关闭并不存在的文档、关闭未打开的文档)

     

    D, 逻辑错误(逻辑锗误是最难查找的错误类型,它们是由程序中使用的逻辑引起的。它们并不显示任何错误消息,所以不能提供错误线索及发生的位置。然而,有时,它们会产生运行期间错误,以便确定已经产生锗误的语句。如果编写了模块代码,而且该代码包含很多函数,而且一个函数调用另一个函数,那么不得不调查所有过程,以识别错误位置。)

     

    3,调试工具:要确保代码中的变量和表达式按照预想的方式运行,可以使用VBA中的各种调试工具跟踪它们。VBE有如下不同的调试工具。

     

    (1) 中断模式:

     

    A, 进入中断模式方法:在过程的开始位置按下F8键。/使用断点(F9键或者单击当前空白指示器栏)。/使用Stop语句。/当过程运行时,按下Ctrl+Break键。/使用运行期间错误MsgBox?对话框 。

     

    B, 退出中断模式方法:从Run(运行)菜单中选择"Run Sub|Userform"〔运行子过程/用户窗体);或者按下F5键,或者单击Debug工具栏上的"Run Sub|Userform"按钮。/从Run菜单中选择Reset(重新设置)选项,或者单击Debug工具栏上的Reset按钮

     

    (2) 单步执行过程:

     

    A, 单步执行过程:从Debug菜申中选择StepInto?(逐语句)选项/单击Debug工具栏上的StepInto?按钮按下F8键

     

    B, 跳过过程(跳过已测试无误的过程节省时间):从Debug菜单中选择Step 0ver选项/按下Shint+F8键/单击Debug工具栏上的Step Over按钮

     

    C, 跳出过程(跳过程剩余部份):从Debug菜单中选择stepOut选项/按下Ctrl十shift十F8键/单击Debug工具栏上的StepOut?按钮

     

    D, 运行到光标处(跳过一组语句):从Debug菜单中选择RugToCursor?选项/按下Ctrl+F8键

     

    E, 设置下一条语句为光标所指语句(要警惕会忽略不执行中间的语句):从Debug菜单中选择Set Next Statement/或者按下Ctrl十F9键。

     

    F, Sbow Next Statement选项指明下一个将要执行的语句是什么。当需要在Code窗口中监视很多过程、却丢失了跟踪时,这个特征就显得非常有用。

     

    (3) 监视过程。

     

    A, Locals(本地)窗口(显示当前过程中使用所有变量及其值,还会显示当前加载窗体和控件的属性。):从V1ew (视图)菜单中选LocalsWindow?选项/单击Debug工具栏上的localswindow按钮

     

    B, CallStack?对话框(查看所有活动的过程调用):从View菜单中选CallStack?选项/按下Ctrl+L键/ 单击Debug工具栏上的CallStack?按钮

     

    C, Immediate(立即)窗口(可查询并设置变量值,创建或撤销对象,执行单行命令如Debug.print [outputlist]):从View菜单中选择ImmediateWindow?选项/按下Ctrl+G键/单击Debug工具栏上的ImmediateWindow?按钮

     

    D, Watches窗口(是一个调试工具,在中断模式下可使用它更改变量和表达式的值,以查看不同的值如何影响代码):从View菜单中选择WatchWindow?选项/单击Debug工具栏上的WatchWindow?按钮参考:

     

    E, Auto Data Tips(自动显示数据提示)工具:Too1s(工具)菜单中选择Options(选项)Editor(编辑器)选项卡中的Auto Data Tips选项。就可以激活变量值自动显示(即在中断模式期间,只需把光标放在code窗口中的变量之上,该变量的值会自动以提示的方式显示出来。)

     

    4,预防错误

     

    A, 使用注释

     

    B, 缩进代码:Tab键或启用Too1s(工具)菜单选Options(选项)Editor(编辑器)选项卡中的Auto Indent(自动缩进)

     

    C, 使代码模块化

     

    D, 显式声明变量:使用Option Explicit语句,或启用Too1s(工具)菜单选Options(选项)Editor(编辑器)选项卡中的Require variable Declaration(需声明变量)复选框。

     

    E, 避免使用变体Variant(当某变量可能包含NULL值时就只能惟一指定Variant类型了)

     

    F,打开语法检查:启用Too1s(工具)菜单选Options(选项)Editor(编辑器)选项卡中Auto Syntax Check(自动语法检测)

     

    G,谨防Dim陷阱:Dim mystr1, mystr2 As String '并未声明mystr1变量

     

    5, 错误处理:调试只能够发现可以预测的错误,要处理不可预测的和不可避免的错误时,就必须使用错误处理。通过启用错误处理,捕获并提示错误处理,可以使程序更健壮。就可以使应用程序更稳定、更健壮。如果应用程序中包含了好几个过程,那么可以考虑采用集中式错误处理程序。

     

    (1) 捕获错误:On Error Goto line (On Error Goto 0会在当前过程禁用错误处理程序) 在这个语法中,line指定了发生运行期间错误时控制将跳转到的代码行

     

    
    

     

    (2) 编写错误处理程序:给用户显示错误信息;提示补救方法;允许继续或取消操作。使用Err对象:
    属性 说明
    Number 存储最后一个错误的数字ID。这是默认属性
    Description 存储说明错误的有关信息
    Source 包含发生了错误的对象名或应用程序名
    HelpFile? 包含帮助文件的名字
    HelpContextID? 包含错误号对应的帮助上下文ID
    LastDLLError? 包含最后一次调用DLL的系统错误代码

     

    Raise方法可以让用户自定义错误处理信息,还可把错误处理信息传回调用过程: Err.Raise number[, source, description, helpFile, helpContext]

     

    Clear方法清除Err对象的所有属性值:Err.Clear (当调用On Error, Exit Sub, Exit Function, Exit Property, Resume 等语句时,会自动调用Err.Clear方法。)

     

    (3) 退出错误处理程序:

     

    A, 0n error Resume:当错误处理程序已经修复错误后,可以用它来返回控制给引起错误的语句。但注意如果错误还在的话,会引起无限循环。

     

    B, 0n error Resume Next:忽略错误语句,继续下一句

     

    C, Resume [LineLabel?]: 把控制传递给行标号(必须和Resume语句处在同一个过程中)所在点的语句

     

    D,也可使用Exit Sub或者Exit Function甚至End语句退出已产生错误的过程,但这些语句应放在错误处理程序之前,这样当未产生错误时就不会执行错误处理程序。

     

    (4), 创建集中式错误处理函数程序:只需创建一次,就可反复使用

      

    '添加一个模块创建一个函数,命名为HandleErrors
    Function HandleErrors(iErrNum) As Integer
    Select Case iAction
    Case 5
    'Invalid procedure call
    MsgBox Error(iErrNum) & " Contact Help Desk."
    iAction = 2
    Case 7
    'Out of memory
    MsBox "Close all unnecessary applications. "
    iAction = 1
    Case 11
    'Division by zero
    MsgBox "Zero is not a valid value. "
    iAction = 1
    Case 48, 49,51
    'Error in loading DLL
    MsgBox iErrNum & "Contact Help Desk. "
    iAction = 5
    Case 57
    'Device I/O error
    MsgBox "Insert Disk in Drive A."
    iAction = 1
    Case Else
    MsgBox "Unrecoverable Error. "
    iAction = 5
    End Select
    ErrorHandler = iAction
    End Function
    '在另一模块的ErrorExample过程中使用HandleErrors函数
    Private Sub ErrorExample ()
    Dim sngValue As Single, sngDivideBy As Single, sngAnswer As Single
    Dim iResponse As Integer
    On Error GoTo ErrorZone
    s n g Value = InputBox("Enter the number you wish to divide: ")
    sngDivideBy = InputBox("Enter the number you wish to divide by: ")
    sngAnswer = sngValue / sngDivideBy
    MsgBox "The answer is " & sngAnswer
    Exit Sub
    E r r o r Z o n e :
    'This Select statement uses the value returned
    'from the HandleErrors function for its condition.
    Select Case HandleErrors(Err)
    '对应于五种处理方法:Resume/Resume Next/Resume “行”/退出该过程/结束整个应用程序。
    Case 1
    Resume
    Case 2
    Resume Next
    'This procedure doesn't need case 3 which is resuming to a line.
    Case 4
    Exit Sub
    Case 5
    End
    End Select
    End Sub
     

    九,VBA的安全性和保护工具

     

    1, 数字签名:保护在VBA中编写的宏、过程、窗件或代码。也可以把它应用于文档、模板和内插附件。把数字签名添加到宏项目中的步骤如下:打开VBE>Tools菜单上的Digital Signture(数字签名)命令>单击Choose(选择)指定数字证书。

     

     

    2, 指定安全级别:Tools工具>Macro宏>Security安全性。可以指定Security LeveI?(安全级别)和Trusted Source(信任源)

     

    3, 代码的密码保护:打开VBE>Tools>Project 属性,写人密码锁定代码查看

     

     

    十,VBA程序的部署

     

    不管是加载宏程序还是一般的电子表格程序,其部署都很简单,我们可以直接拷贝这个文件到目标机,对于加载宏,需要在Excel 中将其加载,对于后者,可以直接双击使用Excel打开运行。而对于应用VSTO 开发的Office 应用,其程序的存储位置位于独立的文件和DLL。另外,如前文所述,我们也可以将一些算法、代码通过COM 对象封装在独立的DLL 内,在Excel 内通过VBA 调用。对于此类代码,需要在部署前安装和注册相应的(COM)对象。

     

    如果在VBA 代码里使用了其他文件中的资源,如数据、配置信息等,在发布和部署时需要一起发布,对于这些文件资源的位置,可以通过Application 对象获取当前文件或加载宏的所在目录,然后通过目录的相对路径来调用。

     

    例如,当前文件的路径为:Application.ActiveWorkbook?.Path;加载宏的路径则通过以下方法来获取:Application.AddIns?.Item([加载宏名称]).Path

     

    对于有多个文件的程序包,可以使用安装工具制作安装包,也可以通过直接Copy 的方式来部署。

     

    十一,VBA高级应用

     

    VBA高级应用

     

    * VBA病毒:VBA是众多臭名昭著的宏病毒和基于Outlook的邮件病毒的主要技术!宏病毒是一种寄存在文档或模板的宏中的计算机病毒。一旦打开这样的文档,其中的宏就会被执行,宏病毒就会被激活。从此以后,所有自动保存的文档都会“感染”上这种宏病毒,而且如果其他用户打开了感染病毒的文档,病毒又会转移到他的计算机上。

     

     

    参见

     

    ACCESS中国

     

    以 Office 为开发平台时所需掌握的知识

     

    http://www.excelhome.net/

     

     

    http://www.officefans.net/,http://www.officeren.cn/已废弃  
    展开全文
  • VBA SPLIT函数详解

    万次阅读 多人点赞 2019-01-31 13:25:26
    VBA编程是经常会用到字符串拆分函数SPLIT,用法也不复杂,但是大家对于这个函数的参数未必完全了解,下面结合示例讲解一下参数的用法。 SPLIT函数的语法格式如下: Split(expression, [ delimiter, [ limit, [ ...

    VBA编程是经常会用到字符串拆分函数SPLIT,用法也不复杂,但是大家对于这个函数的参数未必完全了解,下面结合示例讲解一下参数的用法。

    SPLIT函数的语法格式如下:

    Split(expression, [ delimiter, [ limit, [ compare ]]])
    
    参数 含义
    express 需要拆分的字符串
    delimiter 参数为拆分的分隔符,如果省略则使用空格做为分隔符
    limit 指定返回字符串的数量
    compare 指定拆分子字符串时的比较类型

    先来看一个示例,现在需要拆分Good good study day day up为单个单词。

    Sub Demo1()
        Dim strString As String
        Dim varResult As Variant
        Dim arrResult() As String
        strString = "Good good study day day up"
        varResult = VBA.Split(strString)
        arrResult = VBA.Split(strString)
    End Sub
    

    VBA.Split(strString)省略delimiter参数,则使用空格做为分隔符,拆分为6个单词字符串,在【本地窗口】中可以查看数组的值,如下图所示。
    在这里插入图片描述
    请注意变量声明语句,用于保存结果的数组,可以使用如下两种方式:Variant变量或者字符串数组,但是不可以声明为Variant数组。

        Dim varResult As Variant
        Dim arrResult() As String
    

    一般情况下,都无须指定LIMIT参数,下面看一个使用LIMIT参数的例子。对于一些国外地址如:888, Ocean Wind Rd, Markham, V4A,需要拆分为888Ocean Wind RdMarkham, V4A,而不是拆分为4段,此时就需要设置LIMIT参数为3。

    Sub Demo2()
        Dim strString As String
        Dim arrResult() As String
        Dim i As Integer
        strString = "888, Ocean Wind Rd, Markham, V4A"
        arrResult = VBA.Split(strString, ",", 3)
        For i = LBound(arrResult) To UBound(arrResult)
            Debug.Print Trim(arrResult(i))
        Next i
    End Sub
    

    接下来看一下如何使用compare参数,下面示例代码中设置为vbTextCompare,即执行文本比较,也就是说忽略字符大小写区别(S和s都可以作为分界符)。如下代码结果为包含4个元素的字符串数组(AAABBBCCCDDD)。

    Sub Demo3()
        Dim strString As String
        Dim arrResult() As String
        Dim i As Integer
        strString = "AAAsBBBSCCCsDDD"
        arrResult = VBA.Split(strString, delimiter:="s", compare:=vbTextCompare)
        For i = LBound(arrResult) To UBound(arrResult)
            Debug.Print Trim(arrResult(i))
        Next i
    End Sub
    

    如果将compare参数设置为vbBinaryCompare,那么结果就会不同了。

    Sub Demo4()
        Dim strString As String
        Dim arrResult() As String
        Dim i As Integer
        strString = "AAAsBBBSCCCsDDD"
        arrResult = VBA.Split(strString, delimiter:="s", compare:=vbBinaryCompare)
        For i = LBound(arrResult) To UBound(arrResult)
            Debug.Print Trim(arrResult(i))
        Next i
    End Sub
    

    字符串被拆分为三段,BBBCCC之间的S不再做为分界符。

    AAA
    BBBSCCC
    DDD

    通过这个讲解,希望大家完全明白了SPLIT函数的用法。

    展开全文
  • 一键解决WPS中的VBA支持库安装问题

    万次阅读 多人点赞 2019-06-06 11:01:28
    解决 WPS中的VBA问题 在网上看了好多基本都是垃圾文件 ,用不了 话不多说 ,自己亲身经历 直接用 链接:https://pan.baidu.com/s/1uma1TOQy_wdDbG--HH-VWg 提取码:j4r2 完美 ...
  • VBA帮助VBA帮助

    2009-02-05 14:54:46
    VBA帮助。很有用的东东啊,欢迎大家下载啊。快快快。VBA帮助VBA帮助VBA帮助VBA帮助VBA帮助
  • VBA(Visual Basic for Application): ... VBA 简明教程 Office VBA编程手册合集大全 (CHM) Microsoft Office VBA 语言参考 Microsoft Office 2007 System VBA 编程 Office VBA 编程高手 VBA 傻瓜书 第五版 Excel VBA...
  • VBA编程实现不重复随机数输出。VBA里的随机函数是RND,在工作表中随机函数是RAND,一字之差,可要记好了。RND取值范围是[0,1),意思是0和1之间的一个随机数,包含0,但不包含1。 1、用法 语法:Rnd[(number)]  如果...
  • VBA 7.1 FOR WPS 2019

    千次下载 热门讨论 2018-10-30 13:53:38
    适用于安装 WPS 2019 版本的 缺少 VBA 模块的 亲测可用,内含 VBA 7.1 安装顺序1、2、3、4按照顺序安装;
  • 如果是加密整个 workbook,就是wb 无法打开,保护表和VBA 如果是只想保护某个worksheet的修改,可以选择保护 worksheet ,可设置单独密码 如果是想保护workbook结构,可设置单独密码 如果是想单独保护VBA不能...
  • VBA-vba与运算符

    千次阅读 2018-11-09 19:26:08
    声明:笔记来源于我要自学网-《Excel VBA基础教程》-授课讲师:曾贤志 定义:运算符是代表VBA某种运算功能的符号 赋值运算符:= 数学运算符:&amp;(字符连接符)、+(加)、-(减)、Mod(取余)、\(整除)、*(乘)、/...
  • VBA入门

    千次阅读 2018-08-13 23:37:49
    1.VBA代码:VBA的代码组成了VBA程序。 2.过程:用VBA代码把完成一个任务的所有操作保存起来就是一个VBA过程。 3.模块:是保存过程的地方,一个模块可以有多个过程。 4.对象:就是代码操作和控制的东西。 ...
  • VBA是Visual Basic for Application的简写,是一种由微软开发的自动化语言。 主要用于控制Office应用程序 EXCEL VBA就是利用VBA控制EXCEL应用程序 VBA与VB的区别? VBA与VB的代码编写时类似的 其不同之处在于 ...
  • EXCEL VBA编程进阶

    万人学习 2016-02-06 11:14:19
    数组:为了提高VBA的运算速度,特别讲解了数组。以及他的相关应用 图形:这是精彩的部分。讲了图形的各种批量插入方式。通过坐标自动绘制图形。批量制作员工卡等实例。很多实例在工作上都能用到。
  • VBA教程

    千次阅读 2018-06-28 14:34:39
    https://www.yiibai.com/vba/
  • vba编程

    千次阅读 2018-08-07 18:05:18
    VBA 宏编程 相关文件在连接 https://download.csdn.net/download/wei198621/10589098   一 前期安装条件   解压13+Vba6.3+for+WPS+.zip 文件夹内容,执行安装 将后缀从pptx改为pptm,这样可以运行宏   ...
  • VBA事件

    千次阅读 2018-12-08 22:45:32
    VBA中,要手动更改单元格或单元格值范围时,可以触发事件驱动的编程。 更改事件可能会使事情变得更容易,但您可以非常快速地结束一个完整的格式化页面。VBA中有两种事件 - 工作表事件 工作簿事件 工作表事件 ...
  • VBA中经常要用到文件对话框来进行打开文件、选择文件或选择文件夹的操作。用Microsoft Office提供的文件对话框比较方便。用法如下Application.FileDialog(fileDialogType)fileDialogType MsoFileDialogType 类型...
  • VBA字典(详解,示例)

    万次阅读 多人点赞 2019-05-03 17:14:36
    字典主要作用:条件计数、条件求和、去重、匹配。 本篇主要介绍了VBA字典以上使用方法及注意事项。
  • Excel之VBA简单宏编程

    万次阅读 多人点赞 2018-06-05 01:26:32
    Excel之VBA简单宏编程 excel是一款很经典的数据分析的工具,里面包含了很多内置函数,但实际情况有时却复杂得多,而excel的宏编程提供了自定义函数的功能,正好有老师需要帮忙做一些数据分析,就学习了一下,下面是...
  • VBA 生成二维码

    2016-02-18 09:01:48
    vba代码生成二维码,需要改写代码,生成的二维码比较大
  • Visual Basic for Applications(VBA)安装包

    千次下载 热门讨论 2012-04-10 21:41:04
    Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。也可说是一种应用程式视觉化的Basic Script。
  • 【Excel VBA】在VBA中调用函数

    万次阅读 2019-03-23 11:10:15
    VBA代码中直接调用计算数据 EXCEL的表函数也可以直接在VBA中直接调用执行,具体调用格式如下: 调用方法1:变量对象= Application.WorksheetFunction.表函数(表函数参数) 实例:Range("d8") = Application....
  • VBA注释

    千次阅读 2017-11-23 17:24:14
    VBA注释 注释是用来记录程序逻辑和用户信息与其他程序员可以在相同的代码无缝协同工作打好基础。 它可包括开发,修改的信息,例如,它也可以包括引入作为逻辑。注释被解释执行时忽略。 在VBA中的注释用两种方法来...
  • Excel VBA开发自动发送邮件

    万次阅读 2017-04-27 17:37:33
    若没有做如下操作设置,则Excel VBA调用Outlook自动发送邮件时提示如下 2.1 Outlook->工具->信任中心 2.2 编程访问->选中”从不向我发出可疑活动警告(不推荐)“,注意:建议使用Excel VBA自动发送...
  • VBA基础知识整理

    万次阅读 多人点赞 2017-12-16 17:05:54
    最近由于项目的需要,需要在Excel自定义一些函数,来完成特殊的处理,为了完成工作,就囫囵吞枣的写了一些代码,现在闲暇下来,就好好的学习一下,VBA的基础知识。1.变量 1.Dim <<variable_name>> As ...
  • VBA6帮助手册,VBA6MSDN文档

    热门讨论 2011-01-26 10:59:54
    VBA6帮助手册,VBA6MSDN文档 chm文档,语言为中文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,389
精华内容 11,355
关键字:

vba