精华内容
下载资源
问答
  • vba数据类型符号

    2018-08-11 10:46:00
    为什么80%的码农都做不了架构师?>>> ...
    • Integer %
    • Long &
    • Single !
    • Double #
    • String $
    • Currency @

    转载于:https://my.oschina.net/xfan/blog/1926137

    展开全文
  • 比如拼写错误,符号错误,格式错误等等 ,一般是比较低级的错误 运行前,编译时就会报错的 因为代码运行前,编辑器会先检查语法错误 VBA里的编译错误,就是写在VBE里,还没运行就报错的那类错误 1.2 运行错误...

    一 认识程序里的三类错误

    1.1 编译错误(语法错误):

    • 比如拼写错误,符号错误,格式错误等等 ,一般是比较低级的错误
    • 运行前,编译时就会报错的
    • 因为代码运行前,编辑器会先检查语法错误
    • VBA里的编译错误,就是写在VBE里,还没运行就报错的那类错误

     

    1.2 运行错误(和数据关系较大):

    • 运行时才会出错的错误
    • 比如一个语句运行时发现此操作会无法进行,卡住,或者返回值报错等等
    • 这种一般是因为处理数据时发生错误,一般是和数据相关
    • 可能是数据错误,也可能是运算方法错误/0, 或数据和方法不匹配,又或是边界情况没处理好

     

    1.3 逻辑错误(语义错误):

    • 甚至运行也不报错,并不代表就一定正确,只是不符合你的目标,需要你自己查

     

    二 coding时的三种模式(三种状态)

    2.1 开发时三种运行模式:开发,运行,中断模式

    • 设计模式:
    • 正在编写代码,增加UI等等,查看各种状态栏等

     

    • 运行模式:
    • 代码正在运行

     

    • 中断模式:break mode
    • 代码运行中断等待(代码出错,或 故意中断)

     

    • 主动进入中断模式方法:
    • 方法1: ctrl+break  / ctrl pause 可强行中断,比如遇到死循环
    • break mode可以被禁用:
    • Application.EnableCancelKey=xlDisabled

     

    • 方法2:VBE里设置断点
    • 方法3:代码中加入  stop (单独行)
    • 下图是举例,2种方法效果相同

     

     

    2.2 调试模式

    • 逐语句
    • 只会在一个过程内的语句内,逐个语句使用,返回有回到过程最开始
    • 逐过程----按 F8 逐个语句运行
    • F5是直接运行

     

     

    2.3 发布时,工程版本的两种版本类型:debug版本和release版本

    • 一般各种测试log需要放在debug模式下,release是发版本的,要保证BUG少,速度快,不要有乱七八糟的东西
    • 在Debug模式下,编译器会记录很多调试信息,也可以加入很多测试代码,方便我们程序员测试,以及出现bug时的分析解决
    • Release模式下,就没有上述那些调试信息,而且编译器也会自动优化一些代码,这样生成的程序性能是最优的,但是如果出现问题,就不方便分析和测试了,
    • Release模式通常用于正式发布
    • Assert断言指令,是属于调试代码,当然只能在debug模式下用

     

    三 代码错误(预)处理--用错误陷阱进行错误捕捉

    3.1 对可能出现的错误的预处理的2种方式,配合抛出异常语句使用

    • 程序出错了,肯定是希望告诉你为什么,而不是原因不明!,所以要抛出异常
    • 另外,代码也需要根据预估的异常先做处理,避免代码运行时各种卡住,不够健壮
    • On error resume next 前面需要加 exit sub呢,是为了避免正常语句执行时走到,异常处理语句,

     

    • exit sub
    • On Error GoTo label
    • 需要配合使用
    • label: 报错信息等

     

    • exit sub
    • On Error Resume Next
    • 需要配合使用
    • 一般下一句就是报错后的处理,报错信息等

     

    四 查错第1步:熟悉各种错误

    参考我整理各种常见BUG报错

     

    五 查错第2步 ,根据经验定位错误的位置

    • 熟悉代码
    • 至少了解,代码的执行次序
    • 基础次序:顺序从上往下执行
    • 特殊次序:分支语句,循环语句
    • 根据语句的执行次序,从上往下取鲁BUG
    • 代码的基本次序是顺序,所以报错也是顺序的,只会先报第1条,前面卡住了后面就不检查了。不代表只有这1个错误

     

     

     直接在立即窗口写代码

    5.1 直接敲代码

    • 如果是debug.print 这种,可以直接使用
    • 调用函数,不返回值
    • 比如 sqr(16)
    • 在立即窗口中运行 VBA语句,不用加 ?等

     

    5.2 需要返回值,记得前面加 ?或print

    • 如果是调用函数等,前面先打 英文半角 ? 或 print 会输出结果
    • 比如 ?sqr(9) 否则不返回结果
    •  
    
    debug.Print 11
     11 
    
    sqr(9)
    ?sqr(9)
     3 
    print sqr(16)
     4 
    
    

     

    本地窗口

    • 本地窗口会显示变量值等
    • 但是注意,运行完成后这些内容会马上清楚
    • 可以加  打断语句等

     

    监视窗口

    • 邮件选择某些变量,可以添加进监视窗口

     

     

    六  高级查错

     

    6.1  出错调试: 先中断!

    • 程序出错了,肯定是希望告诉你为什么,而不是原因不明!,所以要抛出异常
    • 调试方法1:中断操作(可中断死循环)
    • Ctrl+pause/break键盘
    • 中断

     

    debug.assert

    和stop功能类似

    http://www.excelpx.com/thread-117425-1-1.html

     

    6.3  出错调试:跟踪调试,打断点等

    • 如何调试
    • 打断点,逐步看值:行首标记打断点
    • 逐步运行,F8
    • 标记一行后,选择断点,可以看 数值的变化,逐个变化
    • 添加监视窗口,监视变量

     

    参考资料

    搜 VBA debug

    http://www.cnblogs.com/wuzhiblog/p/vba_seven.html

    https://blog.csdn.net/iamlaosong/article/details/39894719

    http://www.360doc.com/content/17/1003/18/30583536_692032205.shtml

    http://www.360doc.com/content/16/0904/08/30583536_588259694.shtml

     

    展开全文
  • VBA基础知识

    2019-11-12 14:18:36
    VB、VBA、Microsoft office、excel、access、PowerPoint1.VBA的基本概念2 数据类型2.1 VBA基本数据类型2.2 VBA自定义的数据类型3 VBA常量3.1 VBA系统定义常量3.2 VBA固有常量3.2 VBA符号常量4 变量4.1 声明4.1 赋值5...

    关键词:VB、VBA、Microsoft office、excel、access、PowerPoint

    引言:我是从百度百科上整理的内容,感觉对自己这种零基础学习的人有帮助,并且用这种笔记的方式来记录自己的学习所得。

    1.VBA的基本概念

    VB语言的一种,寄生于Microsoft office软件的一种编程语言,俗称excel遥控器,要比直接使用excel封装好的内置函数更为快捷高效。个人感觉使用EXCEL的必备技能包,尤其是数据处理上,直接基于Microsoft office进行编程处理,省略中间N多个环境搭载流程,可视化效果较强。再说就是吹牛逼了,毕竟新手。

    2 数据类型

    2.1 VBA基本数据类型

    即Primary Type Data,下述列表的括号内为字节数 [2] :
    • Byte :无符号数类型,取值范围0-255
    • Boolean (2)
    • Integer(2)
    • Long (4)
    • Single (4)
    • Double (8)
    • Currency (8)
    • Decimal (14)
    • Date (8)
    • String
    • Object (4)
    • Variant (根据分配确定) [2]

    2.2 VBA自定义的数据类型

    相当于C语言的struct [2] ,例如:Type 自定义类型名 元素名 As 类型 … [元素名 As 类型] End Type
    VBA数组
    • Option Base 0 :数组索引值从0开始 [2]
    • Option Base 1 :数组索引值从1开始
    • Dim MyArray(10) :声明一个数组变量,10是最大的可用的数组索引值
    • MyArray(5) = 101 :给数组的元素赋值
    • Dim Data(10,5) :声明一个二维数组变量
    • Data(1,1) = “A001” :给数组元素赋值
    • Dim cArr(-11 To 20, 1 To 3) As String :声明一个数组,定义数组索引值的上下界
    • Dim dArr() As String :声明动态数组
    • ReDim dArr(0 To 5, 1 To 2) :改变动态数组的尺寸默认把原数据清除。如果保留原来的数据,必须加上参数
    • Preserve:使用Preserve参数时只能改变最后一位的大小
    • If UBound(vTemp) = -1 Then:判断数组变量vTemp是否为空数组
    • End If Erase MyArrar, Data Erase语句清除数组元素,释放变量占用的空间 [2]

    3 VBA常量

    3.1 VBA系统定义常量

    系统定义常量有3个:True、False和Null。 [4]

    3.2 VBA固有常量

    固有常量是编程时引用的对象库定义的常量。所有固有常量都可以在宏或VBA代码中使用。通常,固有常量通过前两个字母来指明定义该常量。来自VB库的常量则以“vb”开头。来自Access的常量以“ac”开头。可以使用对象浏览器来查看所有对象库中的固有常量列表。 [4]
    在VBA中,常量的数据类型有整型、长整型、单精度型、双精度型、字节型、货币型、字符型、日期型和逻辑型。一个整型数据就是一个整型常量,一个长整型数据就是一个长整型常量。例如,12%、-1%是整型常量,32768&、10000000&是长整型常量,-2.5 1、3.14是单精度实型常量,3.1415926#是双精度实型常量,China、Shanghai是字符型常量,#07/13/2001 11:45PM#是日期常量,由符号 “ # ” 将字符括起来。 [4]

    3.2 VBA符号常量

    可以自行定义的常量即符号常量,必须先定义,后使用。可见,需要声明的常量都是符号常量。 [4]
    (1) 基本语法格式:

    1	[ Publicr/ Private] Const  常量名[As  类型]=表达式
    

    如:Global Const 符号常量名称 = 常量值 [4]
    (2) 语句功能:
    定义一个符号常量,并将指定表达式的值赋给符号常量。 [4]
    (3) 语句说明如下: [4]
    1)“常量名”指定符号常量的名字。符号常量名可以由字母、数字和下画线组成,但只能以字母开头,不能含有空格。 [4]
    2)“表达式”指定符号常量的值。该表达式通常由数值型、字符型、逻辑型或日期型数据以及各种运算符组成,但在表达式中不能出现变量和函数。 [4]
    3) public用来表示这个常量的作用范围是整个数据库的所有模块。 [4]
    4) private则表示这个常量只在使用该声明常量语句的模块中起作用。 [4]
    (4) 说明:
    1)除用户定义的符号常量外,VBA还提供了许多符号常量,我们可以直接使用。 [4]
    2)对数码比较长,并且在程序中多次使用的常量,通常使用符号常量代替。运行程序时,系统自动把程序中的所有符号常量换为赋给它的值。 [4]

    4 变量

    与常量一样,变量也是一块内存空间,用于保存程序运行过程中可能变化的数据。变量的名称是用户定义的一个标识符。 [5]
    在代码中需要使用该变量时,只需引用相应的标识符即可,而不用管变量当前的值具体是什么。 [5]

    4.1 声明

    与用户自定义的常量相似,变量在使用之前都需要声明,在VBA中声明变量的语法格式有以下几种: [5]
    • 关键字变量名 AS 数据类型
    • 关键字变量1,变量2 … 变量n AS 数据类型
    • 关键字变量1 AS 数据类型,变量2 As 数据类型, … ,变量n AS数据类型
    在第二种语法格式中, “变量n”的数据类型为AS关键字后定义的数据类型,而“变量1”、“变量2”、…的数据类型为变体型。 [5]

    在VBA中,可用Dim、Private、Public和Static这4个关键字来声明变量,使用不同关键字声明的变量其含义也有所不同。 [5]

    ◆ 利用Dim关键字声明变量:Dim关键字主要用来在内存中分配一块空间,并为该空间命名,是VBA中声明变量最常用的关键字。使用Dim关键字声明的变量只能在当前过程或模块中使用。 [5]
    ◆ 利用Private关键字声明变量:Private关键字用于在类模块中声明一个私有变量,它只能在当前的类模块中使用。当定义变量的位置同处于类模块中时,其使用效果与使用Dim关键字定义的变量相同。 [5]
    ◆ 利用Public关键字声明变量:利用Public关键字声明的变量可以在程序的任何地方调用,而与声明变量的位置无关。 [5]
    ◆ 利用Static关键字声明变量:Static关键字用于声明静态变量,即变量的值在整个代码运行期间都能被保留。 [5]

    4.1 赋值

    变量在使用时还需要对其进行赋值。在VBA中对变量进行赋值可通过 “ = ” 符号或 “ Set ” 关键字进行。通过 “ = ” 符号对变量赋值的语法格式有以下几种。 [5]
    变量名=数据
    变量1=变量2 运算符 数据
    变量1=变量2 运算符 变量3 … 运算符 变量n
    如果在定义变量时指定了变量的数据类型,则为变量所赋的值也必须是该数据类型的值。如果变量定义为Integer类型,而在赋值时却给了变量一个String类型的数据,则在编译运行的过程中将弹出错误弹框。 [5]

    5 运算符

    运算符是在程序中执行计算功能的某些特殊符号,它是程序代码的重要组成部分。在程序代码中,运算符不能单独使用,必须与其操作数共同组成表达式后才具有运算意义。VBA中的运算符包含算术运算符、连接运算符、比较运算符和逻辑运算符等。 [4]

    5.1 算术运算符

    算术运算符主要用于执行四则运算,仅用算术运算符连接起来的表达式称为算术表达式。算术运算符及其作用与示例如表所示。 [5]

    注意:
    在执行算术运算时,运算符两侧操作的数据类型必须相同,否则会出现“类型不匹配”的错误提示。当“+”运算符左右两侧都是字符串类型的操作数时,执行的是连接运算,如表达式“"Pass+"word"的计算结果为字符串“ PassWord ”。 [5]
    连接运算符
    连接运算符的作用是将运算符两侧的操作数连接成一个数,其操作数的数据类型通常都为String类型。VBA中的连接运算符有“&”和“+”两种,由于使用“+”执行连接运算时,容易与加法运算混淆,所以通常都采用“&”进行连接运算。 [5]
    比较运算符
    比较运算符可以对运算符两侧的操作数执行比较运算,其返回结果为Boolean类型的True或False。比较运算符的操作数通常为具体的数值,当操作数为字符串或其他符号时,是根据该符号的ASCII码进行比较的。VBA中的比较运算符及其作用与示例如表所示。 [5]
    在这里插入图片描述
    注意:
    在执行算术运算时,运算符两侧操作的数据类型必须相同,否则会出现“类型不匹配”的错误提示。当“+”运算符左右两侧都是字符串类型的操作数时,执行的是连接运算,如表达式“"Pass+"word"的计算结果为字符串“ PassWord ”。 [5]

    5.2 连接运算符

    连接运算符的作用是将运算符两侧的操作数连接成一个数,其操作数的数据类型通常都为String类型。VBA中的连接运算符有“&”和“+”两种,由于使用“+”执行连接运算时,容易与加法运算混淆,所以通常都采用“&”进行连接运算。 [5]

    5.3 比较运算符

    比较运算符可以对运算符两侧的操作数执行比较运算,其返回结果为Boolean类型的True或False。比较运算符的操作数通常为具体的数值,当操作数为字符串或其他符号时,是根据该符号的ASCII码进行比较的。VBA中的比较运算符及其作用与示例如表所示。 [5]
    在这里插入图片描述

    5.4 逻辑运算符

    逻辑运算符用于对运算符两侧的操作数执行逻辑运算,参与逻辑运算的操作数本身可以是逻辑表达式(表达式的最终结果为True或 False),也可以是算术表达式(表达式的最终返回值为0或非0)。 [5]
    在逻辑运算中,数值0与逻辑值 False相同,表示逻辑假;非0数值与True相同,表示逻辑真。逻辑运算符及其含义与示例如表所示。 [5]
    在这里插入图片描述

    5.5 语法结构

    (1) if 语句

    if 条件1 then   语句1
    elseif 条件2 then   语句2
    elseif ... 
    ...else   语句
    nend if
    

    (2) Select Case 语句

    Select Case 表达式   Case 表达式列表1 
    语句1 
    Case 表达式列表2  
    语句2 
     ...   Case 表达式列表n       语句nEnd Select 
    

    其中的表达式列表可以为: [5]

    • 表达式 例: “A”
    • 用逗号分隔的一组枚举表达式例:2,4,6,8
    • 表达式1 To 表达式2 例:60 To 100
    • Is 关系运算符表达式 例:Is < 60
      (3) Do…Loop 语句
    Do While或Until 条件   语句块1   Exit Do   语句块2Loop
    

    (4) For…Next语句

    Do   语句块1   Exit Do   语句块2Loop While或Until 条件
    

    (5) For Each … Next语句

    For 循环控制变量=初值To 终值Step 步长   语句块 ‘Exit For语句可以跳出循环体Next
    

    (6) 跳出本次循环的continue语句

    For 循环控制变量=初值 To 终值 Step 步长    Do '用于模拟continue        语句块         If 条件 Then Exit Do '用于模拟continue        语句块     Loop While False '用于模拟continue Next
    

    (7) With语句

    With 对象引用   语句块End With
    

    (8) On Error语句

    On Error Goto 出错处理语句的label '跳转到出错处理语句
    

    On Error Resume Next '遇到错误,不管错误,继续往下执行
    

    (9) 具有控制作用的函数

    • If(条件式,表达式1,表达式2) [5]
    • Switch(条件式1,表达式1,[条件式2,表达式2[,…,条件式n,表达式n]])
    • Choose(索引式,选项1[,选项2,…[,选项n]]) '这是基于1的索引
      (10) 其他语句编辑
    • 注释语句
      使用REM或者单引号开始的行。 [6]
    • 语句的连写与续行
      如果一行包括多条语句,用冒号分割各个语句。跨多行的语句,在行末用“空格加下划线”表示续行 [6] 。

    常用语法案例参考

    Dim sheet As Worksheet
    Dim i As Integer
    
    'for循环用法
    For i = 1 To Worksheets.Count
        Set sheet = Worksheets(i)
        Debug.Print sheet.Name
    Next i
    
    'while用法
    i = 1
    While i <= Worksheets.Count
        Set sheet = Worksheets(i)
        'if用法
        If sheet.Name <> "Sheet1" And sheet.Name = "Sheet2" Then
            'Cells用法
            Debug.Print sheet.Cells(i, i).Value
        End If
        i = i + 1
    
    Wend
    
    'do while用法
    i = 1
    Do While i <= Worksheets.Count
        Set sheet = Worksheets(i)
        If sheet.Name <> "Sheet1" And sheet.Name = "Sheet2" Then
            'range用法
            Debug.Print sheet.Range("A" & i).Value
        End If
        i = i + 1
    Loop
    

    【版权声明:本文为CSDN博主「chadm」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_42695485/article/details/81571843】

    5.6 过程与函数编辑

    Sub 过程名(参数表)    语句块    Exit Sub    语句块End Sub
    Function 函数名(参数表) As Type
    语句块
    函数名=表达式   Exit FunctionEnd Function
    

    可以是Private、Public、Friend、Static等修饰。 [6]
    调用函数/过程时,可以加括号或者不加括号。如果调用表达式作为一行的一部分,那么必须用参数,例如函数调用的返回值赋给变量。 调用过程时, 可以使用/不使用call关键字。使用call语句调用过程,如果无参数,则不加括号;如果有参数,必须加括号。如果调用时用括号包住单个参数,则该参数强行按值传递。需要特别注意,不用call不加括号的调用,形参与实参是传值(passed by value)而不是传引用(passed by reference),这会导致一些对象的方法调用失败。例如: [6]

    Dim cn As ADODB.Connection
    Set cn = CurrentProject.Connection 
    Dim rs As New ADODB.Recordset  
    rs.Open "SELECT * FROM myTable" , cn 
    Dim ExcelApp As New Excel.Application 
    Dim ExcelWst As Worksheet
    Set ExcelWst = ExcelApp.Workbooks.Add.Worksheets(1)
    ExcelWst.Range("A2").CopyFromRecordset(rs) '失败,无法执行该行
    ExcelWst.Range("A2").CopyFromRecordset rs  '可成功执行该行
    

    6 常用内置函数编辑

    6.1 VBA的常用内置函数:

    [5]

    • MsgBox
    • InputBox
    • 舍入函数:Fix 向0取整,Int向下取整, Round四舍五入
    • Rnd: 返回0-1内的单精度随机数
    • 字符串函数: [5]
      – Filter:对字符串的一维数组的过滤
      – InStr([Start, ],[, Compare])与InStrRev: 查找子串
      – Len:字符串长度
      – Join:连接一维数组中的所有子字符串
      – Left,Right,Mid: 截取子字符串
      – Space(数值) :生成空格字符串
      – Ucase,Lcase:大小写转换函数
      – Ltrim, Rtrim,Trim :删除首尾空格
      – Replace
      – Split:分割一个字符串成为一维数组
      – StrComp:字符串比较
      – StrConv:字符串转换
      – String(number, character):制定字符重复若干次
      – StrReverse

    字符串案例: [7]

    Function StringTest()
    Dim s As String
    s = "Hello,world "
    '求长度
    Debug.Print Len(s)
    '去掉两端空格
    Debug.Print Len(Trim(s))
    '替换s中子串a,用b替代
    Debug.Print Replace(s, "world", "chadm")
    '从左边取若干字符
    Debug.Print Left(s, 5)
    '从右边取若干字符
    Debug.Print Right(s, 5)
    '从中间取若干字符
    Debug.Print Mid(s, 1, 5)
    's1中查找字符串s2,返回位置
    Debug.Print InStr(s, "ll")
    '从a位置在s1中查找字符串s2,返回位置
    Debug.Print InStr(6, s, "ld")
    End Function
    
    
    • 日期/时间有关函数: [5]
      – Year, Month, Day, WeekDay,Hour,Minute,Second: 截取日期时间分量
      – DateAdd: 日期/时间增量函数
      – DateDiff(<间隔类型>,<日期1>,<日期2>[,W1][,W2])日期/时间的距离函数
      – DatePart(<分割类型>,<日期>[,w1][,w2])时间分割函数
      – DateSerial(<表达式1>,<表达式2>,<表达式3>) 合成日期;
      – DateValue(“字符串表达式”)返回日期;
      – Date,Time,Now,Timer: 返回日期时间
      – DateValue
      – TimeSerial:由时间序列得到时间对象
      – TimeValue:由时间字符串得到时间对象
      – Weekday:获得日期的周几
      – WeekdayName

    日期函数案例: [7]

    'now:返回当前的时间,格式是:2018/8/11 0:22:56
    'date:返回当前的日期,格式是:2018/8/11
    'time:返回当前的时间,格式是:00:00:0
    Debug.Print Date
    Debug.Print now()
    Debug.Print time
    
    • 转换函数:CBool、CByte、CCur、 CDate、 CDbl、CDec、CInt、 CLng、CLngLng、CLngPtr、 [5] CSng、CStr、CVar、CVErr、Asc(<字符串表达式>)返回第一个字符的Ascii编码值、Chr(ASCII码)返回字符、Hex、Oct、Str(<数值表达式>)返回字符串、Val(string)、Format、FormatCurrency、FormatDateTime、FormatNumber、FormatPercent、MonthName。
    • Nz(表达式或字段属性值[,规定值])如果是空,则返回0或者""或者函数的第二个参数值 [5]
    • 验证函数:isNumeric、isDate、isNull、isEmpty、IsArray、IsError、IsMissing、IsObject [5]
    • 数学函数:Abs、Sqr、Tan、Atn(即atan)、Sin、Cos、Exp(e为基的指数)、Log自然对数 [5]
    • Array:构造一个Array对象 [5]
    • CallByName: get or set a property, or invoke a method at run time using a string name. [5]
    • 控制流:Choose:类似于C语言的select语句、If相当于IF-ELSE语句、Switch [5]
    • Command:获取命令行参数 [5]
    • CreateObject:创建ActiveX对象
    • CurDir:返回指定驱动器的当前工作路径 [5]
    • 由基本数学函数导出的函数:Sec、Cosec、Cotangent、Cotan、Arcsin、Arccos、Arcsec、Arccosec、Arccotan、HSin、HCos、HTan、HSec、HCosec、HCotan、HArcsin、HArccos、HArctan、HArcsec、HArccosec、HArccotan、LogN
    • DoEvents:暂时把CPU控制权交回给系统 [5]
    • Environ:返回环境变量的值 [5]
    • 文件操作: [5]
      – Dir:返回满足条件的所有文件、目录的名字
      – EOF
      – FileAttr
      – FileDateTime
      – FileLen
      – FreeFile Function
      – GetAttr:返回文件、目录的属性值
      – Input:读取文件

    读取TXT文档: [7]

    Function improtProject()
    
    Dim rLine As String
    Dim i As Integer ' line number
    Dim j As Integer
    Dim k As Integer
    Dim file As String
    Dim arr
    Dim dts As Worksheet
    
    Set dts = ThisWorkbook.Worksheets("Config")
    
    i = 1
    k = 4
    file = ThisWorkbook.Path + "\" + "config.txt"
    Open file For Input As #1
    ' stay inside the loop until the end of file is reached
    Do While Not EOF(1)
        Line Input #1, rLine
        'debug.Print rLine
        i = i + 1
        arr = Split(rLine, " ")
        Debug.Print arr(0), arr(1)
        dts.Range("A" & k).Value = arr(0)
        dts.Range("B" & k).Value = arr(1)
        k = k + 1
    
    Loop
    
    Close #1
    
    End Function
    

    – Loc:文件指针位置
    – LOF:文件打开时的指针位置
    – Seek:文件指针定位
    – Spc:使用Print做position output
    – Tab:用于Print函数

    打开excel案例 [7]

    Function openExcel(name As String)
        Dim wb As Workbook
        Dim sheetFrom As Worksheet
    
        '判断文件是否存在
        If Dir(name) <> "" Then
            Debug.Print name + "文件存在"
        Else
            Debug.Print name + "不文件存在"
        End If
    
        '在vba中,对象的使用需要先初始化
        Set wb = Workbooks.Open(name) 'name是表格的完整路径
        'sheetName是sheet表名,打开指定的sheet表
        Set sheetFrom = wb.Worksheets("sheetName") 
    End Function
    

    获取当前文件路径: [7]

    path = ThisWorkbook.Path
    '获取上一级目录
    file = Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.Path, "\") - 1) + "\" + "config.txt"
    

    遍历所有EXCEL sheet表单 [7]

    Dim sheet As Worksheet
    Dim i,row As Integer
    
    For i = 1 To Worksheets.Count
        Set sheet = Worksheets(i)  
        Debug.Print sheet.Name
    Next i
    

    获取表格的行数和列数

     '使用如下方法获取行数和列,有时可能会比实际数大一些,存在空行空列
        row = sheet.UsedRange.Rows.count '表中有多少行
        col = sheet.UsedRange.Columns.Count '表格中多少列
    

    操作单元格range和Cells [7]

    ' 通过range对象来操作
    Debug.Print sheet.Range("A" & i).Value
    '通过Cells对象来操作
    Debug.Print sheet.Cells(i, i).Value
    '设置单元格背景颜色
    sheet.Cells(i, i).Interior.Color = RGB(100, 255, 255)
    '表示一个区域
    sheet.range(cells(1,1),cells(3,3)) 
    

    【版权声明
    :本文为CSDN博主「chadm」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_42695485/article/details/81571843】

    • Error:错误号对应的错误消息 [5]
    • Windows Registry中的数据:GetAllSettings、SaveSetting、
    • GetObject:ActiveX组建的引用 [5]
    • IMEStatus:返回当前Input Method Editor (IME) [5]
    • Macintosh平台:MacID、MacScript [5]
      – 金融函数: [5]
      – DDB:使用double-declining balance计算贬值
      – FV:计算固定利率的年金
      – IPmt:计算利率
      – IRR:计算利率
      – MIRR:计算利率
      – NPer:计算周期数
      – NPV:计算net present value
      – Pmt:计算支付数
      – PPmt:计算本金支付数
      – PV:计算present value
      – Rate:利息率
      – SLN:straight-line depreciation
      – SYD:计算sum-of-years’ digits depreciation
    • Partition:返回字符串,表示一个数值名字落在各个range内。常用于SQL select语句 [5]
    • QBColor:颜色值 [5]
    • RGB:颜色值 [5]
    • TypeName:得到变量的类型名 [5]
    • VarType:得到变量的类型数 [5]

    7 实用案例

    7.1 封装函数方法 [7]

    Function getSheetLine(ByRef target As Worksheet, start As Integer) As Integer
    Dim count As Integer
    count = start
    
    While target.Range("A" & count).Value <> ""
        count = count + 1
    Wend
    getSheetLine = count
    
    End Function
    ---------------------------------------------------------
    需要注意在调用getSheetLine方法的,定义target需要采取如下方式 
    Dim target As Worksheet 
    如果定义为 
    Dim sheet,target As Worksheet 
    会报byref类型不匹配
    ----------------------------------------------------------
    

    7.2 调用EXCEL自身函数方法: [7]

    '第三行第i列的值等,prodts表格的L列里面所有小于等于第二行第i列的值
    Cells(3, i) = WorksheetFunction.CountIf(prodts.Range("L:L"), "<=" & Cells(2, i))
    

    7.3 发送Email [7]

    Sub Mail_workbook_Outlook_1()
    'Working in Excel 2000-2016
    'This example send the last saved version of the Activeworkbook
    'For Tips see: http://www.rondebruin.nl/win/winmail/Outlook/tips.htm
        Dim OutApp As Object
        Dim OutMail As Object
    
        Set OutApp = CreateObject("Outlook.Application")
        Set OutMail = OutApp.CreateItem(0)
    
        On Error Resume Next
        With OutMail
            .To = "XXXXXX"
            .CC = ""
            .BCC = ""
            .subject = "This is the Subject line"
            .HTMLBody = "<H3><B>Dear Customer</B></H3>" & _
                  "Please visit this website to download the new version.<br>" & _
                  "Let me know if you have problems.<br>" & _
                  "<A HREF=""http://www.rondebruin.nl/"">Ron's Excel Page</A>" & _
                  "<br><br><B>Thank you</B>"
            .Attachments.Add ActiveWorkbook.FullName
            'You can add other files also like this
            '.Attachments.Add ("C:\test.txt")
            .Send   'or use .Display
        End With
        On Error GoTo 0
    
        Set OutMail = Nothing
        Set OutApp = Nothing
    End Sub
    

    8 用途

    由于微软Office软件的普及,人们常见的办公软件Office软件中的Word、Excel、Access、Powerpoint都可以利用VBA使这些软件的应用更高效率,例如:通过一段VBA代码,可以实现画面的切换;可以实现复杂逻辑的统计(比如从多个表中,自动生成按合同号来跟踪生产量、入库量、销售量、库存量的统计清单)等。 [5]
    掌握了VBA,可以发挥以下作用: [5]
    1.规范用户的操作,控制用户的操作行为; [5]
    2.操作界面人性化,方便用户的操作; [5]
    3.多个步骤的手工操作通过执行VBA代码可以迅速的实现; [5]
    4.实现一些VB无法实现的功能; [5]
    5.用VBA制做EXCEL登录系统; [5]
    6.利用VBA可以Excel内轻松开发出功能强大的自动化程序。 [5]

    9 参考资料

    1. 杜菁主编;武文芳,周震副主编.数据库技术与应用新概念教程 (第2版)=SHUJUKU JISHU YU YINGYONG XINGAINIAN JIAOCHENG:中国铁道出版社,2016.08:第242页
    2. 刘林,张瑞秋.AutoCAD 2016中文版高级应用教程 高级绘图员考试指南 第5版:华南理工大学出版社,2016.02:第302页
    3. 一线文化.2天学会EXCEL表格与数据处理 2016版:中国铁道出版社,2016.07:第232页
    4. 刘丽,高润泉.ACCESS 2010数据库基础教程:北京理工大学出版社,2016.07:第206页
    5. 杨小丽.EXCEL应用大全 全新升级版:中国铁道出版社,2016.01:第465页
    6. Perry G L W . SpPack: spatial point pattern analysis in Excel using Visual Basic for Applications (VBA)[J]. Environmental Modelling & Software, 2004, 19(6):559-569.
    展开全文
  • VBA学习笔记

    2020-07-12 18:29:29
    一、 vba两个integer变量相乘可能会出现溢出,无论储存结果的变量数据类型是多大 例如: Dim a As Long a = 30000 * 2 (这里会发生溢出错误) 处理办法是在30000后面加&符号,将其声明为long类型 a = 30000**&...

    一、 vba两个integer变量相乘可能会出现溢出,无论储存结果的变量数据类型是多大

    例如:
    Dim a As Long
    a = 30000 * 2 (这里会发生溢出错误)
    处理办法是在30000后面加&符号,将其声明为long类型
    a = 30000**&** * 2
    在这里插入图片描述
    在这里插入图片描述
    如果程序比较长可以用下划线连接,但是前后必须有空格字符串连接,用下面办法
    把多行程序拼成一行用冒号
    在这里插入图片描述
    ****是做整数除法
    在这里插入图片描述

    二、异常处理(GOTO语句还可以用来跳出多层循环,exit可以跳出本层循环)

    exit do;exit sub;exit function;exit for

    在这里插入图片描述
    直接屏蔽错误行
    在这里插入图片描述

    三、关于vab中的四舍五入

    • 函数Cint和Round函数都是采用的银行家四舍五入,就说将0.5转换成离他最近的整数,就说说3.5和4.5都会转换成4,这样有利于当四舍五入较多时,数据变大的问题
    • 如果要用我们常用的0.5都进位,可以用excel自带的函数Round;就是
      Application.WorksheetFunction.Round(X,2);2表示标记小数点后的位数,就是说将3.1415 =》
      3.14

    四、数组

    注意10代表最大下标,就是这个数组有11个元素,存放的是字符串
    如何定义数组的时候没有声明最大下标,可以用ReDim进行声明,或是通过split拆分字符串直接赋值
    定义二维数组Dim cn(9,10) As String 有10行,11列的二维数组(多维数组只需在后面加逗号即可)
    定义二维数组Dim cn(1 to 9,1 to 10) As String 有9行,10列的二维数组
    将range对象转换成二维数组必须声明为动态数组,必须是变体类型(不指定数据类型),下标是从1,1开始而不是默认的0,0
    将***range对象***写回到单元格,让range对象等于单元格即可,二维数组不要求是变体

    将一维数组写入到表格中,直接给range赋值,但是写入一列要用下面方法转置
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    获取多维数组的最大最小小标
    在这里插入图片描述

    五、操作文件

    fileName = Dir(“d:\dome*.xlsx”) 可以找到目录下的所有xlsx文件

    六、ActiveSheet

    ActiveSheet.Cells.Rows.Count表示当前工作表的最大行数
    ActiveSheet.UsedRange 表示使用过的范围对象
    ActiveSheet.UsedRange.Row 起始行
    ActiveSheet.UsedRange.Rows.Count 使用的行数
    ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 结束行

    七、通过range对象查询表格边界

    在这里插入图片描述
    在这里插入图片描述
    range对象的find方法,可以使用office自带的几个通配符
    在这里插入图片描述
    在find时关心格式,在查找的时候要制定***LookAt、LookIn、SearchOrder、MatchByte参数***,否则会造成结果不可预测,会记录住搜索框的选项
    在这里插入图片描述

    八、可变参数 Optional

    函数传递参数 myFun(c:=5,a:=1)等价于myFun(1,5)
    Function myFun(a,Optional b As Integer = 0, Option c As Integer = 0)
    End Function
    VBA默认传递的是引用(就是函数中变量修改后,主函数值也跟着修改),如果想不影响主函数Function myFun(ByVal a)

    九、算数运算

    • List item a Mod b 返回的是a模b的值,就是a除以b的余数

    • List item 生成[a,b]区间的随机整数,包含a,b Int(Rnd()*(b-a+1)+a) 【为了避免每次都生产一样的随机数列,在前面加上 Randomize】

    十、事件处理

    Application.EnableEvents = False 可以关闭事件触发

    十一、查找边界的方式

    1.通过do while判断单元格下一行是否为空
    缺点:不能处理连续数据
    2.通过ActiveSheet.UsedRange
    缺点:①可能会将只设置的格式,而没有数据的单元格包含进去
    ②删除最后一行后,UsedRange不会立刻变化,由于Excel考虑执行效率,不会立刻更新,只有执行保存操作后才会返回正确的结果
    3.通过Range.End(方向)方法,相当于Ctrl+上下左右键
    缺点:

    1. 如果表格没有数据,还是会返回第一行
    2. 如果表格写满数据,则会返回数据的上边界
    3. 只能找某一列的最后一行
    4. 如果遇到合并的单元格,会返回合并单元格的第一个单元格
    5. 筛选过或者是隐藏的行不会被处理,会从边界跳过去
      Set r = Cells(Rows.Count,1).End(xlUp)
      Set r = Cells(1,Columns.Count).End(xlToLeft) '查找最后一列
    6. 通过Range.SpecialCells(xlCellTypeLastCell) 【返回最后一个单元格(右下角的单元格)相当于UsedRange】
    7. 通过find方法
    Dim r As Range
    Set r = Cells.Find("*",after:=Range("A1"),searchorder:=xlRows,searchdirection:=xlPrevious)
    If r Is Nothing Then
    	MsgBox "表格中没有数据"
    Else
    	MsgBox r.Row
    End If
    

    在这里插入图片描述

    十二、自定义排序排序

    在这里插入图片描述
    在这里插入图片描述

    多关键字排序原理:相当于先对次要关键字排序,在对主关键字排序的多次单关键字排序

    十二、正则表达式

    1.()圆括号的使用
    在这里插入图片描述
    2.正则中的环视功能
    在这里插入图片描述

    十三、打开文件对话框的几种方式

    1. 方法:Application.GetOpenFilename
    2. 方法:Application.GetSaveAsFilename
    3. 属性:Application.FileDialog

    十四、错误处理

    1. 从现在开始不处理错误,直接跳到下一行 On Error Resume Next
    2. 在可能出现错误的代码前面写上 ,On Error GoTo somethingWrong,再程序最后写上标签somethingWrong: 在这个标签前要Exit Sub
    3. Err常量代表系统中最近一次发生的错误,Err.Number错误代码;Err.Description该错误的详细描述;Err.Clear将错误清空
    4. 使用Resume Next可以让程序提示完错误以后再跳转回程序
    5. On Error GoTo 0 恢复VBA默认的错误处理机制
      在这里插入图片描述

    十五、Excel加载项

    将一个函数保存为加载项,可以在任何文件的单元格中调用函数
    在这里插入图片描述
    在这里插入图片描述

    将一个子程序保成一个加载项,让他可以被任何程序调用
    在这里插入图片描述
    在这里插入图片描述

    在工具栏中添加按钮
    在这里插入图片描述

    展开全文
  • VBA使用语法

    2011-12-30 10:15:30
    数据类型数据类型”是指如何将数据存储在内存中。 (1)Integer表示从-32768-32767之间的整数,其中一位表示符号,占用2字节的存储空间,缺省值为0。(2)Long表示存储为4...
  • vba17-25

    2020-12-06 10:30:10
    十七 变量默认值 简写变量 常量 1声明变量的同时赋值: 数值:0 字符串:""空字符串 布尔:False 变体:Emply(空) ...常数后面加符号,改变常数数据类型 Date Boolean 没有简写 4 常量声明:一经赋值在程序中不可改变
  • 记忆游戏 用Excel VBA编码的记忆游戏。 游戏具有4个不同的字段大小,... 它还具有不同的游戏类型,数字,符号,单词和某些混合类型。 游戏还为您提供了将自己的数据添加到游戏中的机会。 它可以是单词,数字和符号
  • 文字按插入点自动对齐提供了对自定义数据类型的数组进行排序的一个思路;提取多行文字中的文字内容对AutoCAD中多行文字的格式代码进行了分析。使用ObjectDBX实现的批量文字替换,与上一个版本比较起来,修正了一些...
  • 上一篇文章给大家分享了什么是对象的属性和方法,以及怎么区分?...算术运算符号就是对数据进行算术运算的,一般得到的计算结果肯定也是数据类型的。 那么VBA中都有哪些算术运算符,它们都有什么功能呢?❶ “+”...
  • 自动生成VBA窗体菜单

    2010-08-16 15:23:46
    自动生成VBA窗体菜单 '*************************** '* 菜单类 * '*************************** Option Explicit Private WithEvents MenuBar_MenuItem As MSForms.Label '菜单项 Private WithEvents WorkForm As...
  • 01048利用GetOpenFilename方法获取某类型文件名 01049改变GetOpenFilename方法的默认路径 01050改变GetOpenFilename方法的标题文字 01051使用GetOpenFilename方法时出现错误的处理 01052利用GetSaveAsFilename方法...
  • 日期数据在SQL表达式中的应用 在SQL表达式运算符条件中,要查询日期和时间类型数据,需要在数据值两端加上井字符号(#)以表示日期类型。 日期可以有多种表示方式,最符合中国人的习惯是“年-月-日”或“年/月/日”...
  • 日期数据在SQL表达式中的应用 在SQL表达式运算符条件中,要查询日期和时间类型数据,需要在数据值两端加上井字符号(#)以表示日期类型。 日期可以有多种表示方式,最符合中国人的习惯是“年-月-日”或“年/月/日”...
  • 任务171: 工作表_编辑元数据(更改数据类型) 任务172: 编辑元数据(列的重命名与隐藏) 任务173: 编辑元数据(别名) 任务174: 字段操作(合并字段) 任务175: 字段操作(分层字段) 任务176: 字段操作(字段...
  • Dim i% 中的 %

    千次阅读 2017-01-13 17:51:53
    Integer 数据类型Integer 变量存储为 16位(2 个字节)的数值形式,其范围为 -32,768 到 32,767 之间。Integer 的类型声明字符是百分比符号 (%)。通常书写如下: Dim i As Integer这是VBA中的类型标示符,具体有如下...
  • 1[单选题] VBA中求字符串长度的函数是A.LenB.LengthC.StrLenD.strLength参考答案:A2[单选题] 下列关于货币数据类型的叙述中,错误的是( )。A.货币型字段的长度为8个字节B.货币型数据等价于具有单精度属性的数字型...
  • ArcMap使用手册.pdf

    热门讨论 2012-02-19 15:02:46
    创建和更新数据 8 展示结果 9 开发制图应用 10 学习ArcMap的技巧 11 第二章 快速入门教程 13 练习 1:浏览数据 14 练习 2:操作地理要素 28 练习 3:操作表(table) 42 练习 4:编辑要素 51 练习 5:操作...
  • 1044.11.2 改变字段数据类型和大小 1054.11.3 改变表之间的关系 1064.12 复制和粘贴表 1074.13 疑难解答 1084.14 现实世界—数据库战略和表战术 108第5章 输入、编辑和验证表中的数据 1105.1 在Access表中输入测试...
  • 1044.11.2 改变字段数据类型和大小 1054.11.3 改变表之间的关系 1064.12 复制和粘贴表 1074.13 疑难解答 1084.14 现实世界—数据库战略和表战术 108第5章 输入、编辑和验证表中的数据 1105.1 在Access表中输入测试...
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....
  • 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517....

空空如也

空空如也

1 2 3 4 5
收藏数 82
精华内容 32
关键字:

vba数据类型符号