Excel VBA(07)数据类型和转换

编程入门 行业动态 更新时间:2024-10-19 00:22:53

数据类型和转换

  • 定义合适的数据类型就是节省内存空间,提高程序运行的效率
  • 直接全部变量都定义为 variant 也是可以的,效率差点而已

一、vba 数据类型

1、基本数据类型

  • 整数类型:byte、integer、long、long long
  • 小数类型:single、double
  • 布尔类型:boolean
  • 字符型:string
  • 万能类型:variant
  • 其他类型:date、object

2、类型检查

  • 检查为空:vba.isEmpty() typeName()
  • 检查数字:vba.isNumeric() application.isNumber() typeName()
  • 检查文本:application.isText
  • 检查错误值:vba.isError typeName
  • 检查数组:vba.isArray
  • 检查日期:vba.isDate

typeName基本是一个通用的方法

二、类型转换

1、类型转换函数

  • 就是各种C开头的函数:Cstr、Cint、Clng、Cdbl、Cdate
Sub test()
    Dim b As String
    b = "2012-12-12"
    Debug.Print TypeName(CDate(b))
End Sub

2、Format函数

  • 就是格式化数字和文本的,基本和excel里面的format是一样的作用
Sub test()
    Dim a As Integer
    a = 123
    Dim b
    b = 12304
    Debug.Print Format(a, "0000.00")
    Debug.Print Format(a, "\价格\ 0000.00")
    Debug.Print Format(b, "yyyy-mm-dd")
End Sub
'output
0123.00
价格 0123.00
1933-09-07

日期和时间

一、时间日期获取

1、返回当前日期和时间

  • 其中 timer 是返回0点到现在时间的秒数,常用来计算时间差
Sub test()
    Debug.Print Date
    Debug.Print Time
    Debug.Print Now
    Debug.Print Timer
End Sub
'output:
04.09 
15:31:01 
04.09 15:31:01 
 55861.21 

2、格式化日期

Sub test()
    Debug.Print Format(Now, "aaa")
    Debug.Print Format(Now, "aaaa")
    Debug.Print Format(Now, "ddd")
    Debug.Print Format(Now, "dddd")
    Debug.Print Format(Now, "yy-mm-dd")
End Sub
'output
周四
星期四
Thu
Thursday
20-04-09

2、时间日期设定

Sub test()
    Debug.Print DateSerial(2021, 12, 12)
    Debug.Print TimeSerial(15, 12, 12)
End Sub

2、获取时间的部分

Sub test()
    Debug.Print Year(Now)
    Debug.Print Month(Now)
    Debug.Print Day(Now)
    Debug.Print Hour(Now)
    Debug.Print Minute(Now)
    Debug.Print Second(Now)
End Sub

二、时间日期计算

1、两日期相隔年月日等

Sub test()
    Dim a, b As Date
    a = #12/12/2020#
    b = "2020-12-31"
    Debug.Print "相隔" & (b - a) & "天"
    Debug.Print "相隔" & DateDiff("d", a, b) & "天"
    Debug.Print "相隔" & DateDiff("q", a, b) & "季"
    Debug.Print "相隔" & DateDiff("w", a, b) & "周"
    Debug.Print "相隔" & DateDiff("n", a, b) & "分"
End Sub

2、日期加减

Sub test()
    Dim a, b As Date
    a = #12/12/2020#
    b = "2020-12-31"
    Debug.Print DateAdd("d", 1, b) & "天"
    Debug.Print DateAdd("q", 1, b) & "季"
    Debug.Print DateAdd("n", 120, b) & "分"
End Sub

三、计时器

  • OnTime 无法使用带参数的过程
  • 代码中的 k 一定要定义在模块的最顶端
Dim k As Boolean
Sub test()
    If k Then
        k = False
        Exit Sub
    End If
    Range("a1") = Format(Now, "hh:mm:ss")
    Application.OnTime Now + TimeValue("00:00:01"), "test"
End Sub
Sub stop1()
   k = True
End Sub

图片图形处理

  • 图片图形处理可能涉及到很多的对象、属性和方法,无法完全去记忆
  • 最好的方法就是通过录制宏得到相应的代码,然后根据自己的需要进行调整
  • 批量插入复选框示例代码如下
Sub hah()
    Dim rg As Range
    Set rg = Range("b1:b10")
    For Each r In rg
        With ActiveSheet.CheckBoxes.Add(r.Left, r.Top, r.Width, r.Height)
            .Characters.Text = "是"
            .Value = xlOff
            .LinkedCell = r.Address
            .Display3DShading = False
        End With
    Next r
End Sub

关于 shape 对象

  • 代表绘图层中的对象,例如自选图形、任意多边形、OLE 对象或图片
  • shape 对象的属性和方法参考:https://docs.microsoft/zh-cn/office/vba/api/excel.shape
  • shape 基本都是 type 和 name 属性
  • shapes集合属性方法参考:https://docs.microsoft/zh-cn/office/vba/api/excel.shapes
Set myDocument = Worksheets(1) 
With myDocument.Shapes.AddShape(msoShapeRectangle, _ 
 144, 144, 72, 72) 
 .Name = "Red Square" 
 .Fill.ForeColor.RGB = RGB(255, 0, 0) 
 .Line.DashStyle = msoLineDashDot 
End With

随机抽取

  • 基本的原理就是生成特定范围内的随机数,去匹配数据的行数或者列数,取出相应的数据
  • 取出的数据和当前的范围内的最后一个元素进行互换,然后减去最后一个元素得到当前的有效取数范围
  • 再重复最上面的步骤,这样不停重复就可以将全部元素随机排序(抽取出来)不会重复
Sub hr()
    Dim rg
    Dim num As Integer
    rg = Range("a1:a12")
    For i = 1 To 12
        If i = 12 Then
            Cells(i, 3) = Cells(1, 1)
            Cells(1, 1).Interior.ColorIndex = 3
            Exit Sub
        End If
        num = (Rnd() * (UBound(rg) - 1) + 1) \ 1
        Range("c" & i) = rg(num, 1)
        tmp = Cells(num, 1)
        Cells(num, 1) = Cells(UBound(rg), 1)
        Cells(UBound(rg), 1) = tmp
        Cells(UBound(rg), 1).Interior.ColorIndex = 3
        rg = Range("a1:a" & (UBound(rg) - 1))
    Next i
End Sub
  • 十分重要的提示!!!下面的这两种写法是有很大不同的,加了 set 得到的是一个单元格区域对象,可以通过rg(1,1) = 12等方法直接对单元格进行操作,下面没有加 set 得到仅仅就是一个取单元格区域的数组,通过rg2(1,1) = 12仅仅对数组有效对单元格不会有任何影响
set rg = range("a1:a12")
rg2 = range("a1:a12")

递归算法和程序优化

一、递归算法(略)

二、程序优化

  • 减少对象的使用,不用之后要及时释放,对象耗费的资源是比较多的
  • 循环之中减少计算次数,如果循环的次数多,二次每次的循环中都有复杂计算的话,效率会比较低
  • 禁止闪屏,就我们在进行工作表的切换等操作的时候,禁止闪屏可以提高运行效率
application.screenupdating = false
  • 使用变量前最好先声明,并且最好指明变量的类型,这样程序的效率会比较高
  • 减少使用 vba 和工作表函数,实际上这些函数效率比较低,但是还是很方便
  • 尽量使用静态数组,静态数组的效率比动态数组好
  • 填充单元格数据之前先清空,这样可以提升一定的效率,虽然不是那么高
  • 用批量代替个体就是我们有时进行操作的时候,对一个一个的元素进行操作,远不如我们使用数组等组合整体的效率高
  • 减少循环次数,这个就需要算法的优化了
  • 使用 FillDown 填充公式的效率,比我们一个一个去填充公式的效率更高

文件操作(略)

更多推荐

Excel VBA(07)数据类型和转换

本文发布于:2023-06-13 22:39:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1412525.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据类型   Excel   VBA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!