• Excel VBA简单使用——数据缺失处理


    VBA(Visual Basic for Applications)是VB的一种宏语言。用来扩展应用程式的功能。特别是Microsoft Office软件。

    转载请注明原文地址:http://blog.csdn.net/ts_dchs/article/details/50318345

    1 使用原因

    在处理传感器数据文件的时候。有些节点有丢包严重的现象。这样就会产生时间的累计误差。

    所以须要依据包序号将之后的传感器数据填在合适的位置,也就是为丢包流出空行。

    这样手动对照的方式非常不方便,所以想到用代码方式解决。

    VBA提供了这个机会。i

    之后的介绍内容以有用为准,不做具体介绍。

    详见网络或者相关书籍。

    2 基本准备

    须要的excel文件是能够载入宏的文件。

    与普通Excel文件不同。
    普通:xlsx 可载入宏:xlsm
    能够自己有一个能够载入宏的文件,处理完数据后复制过去。
    假设要执行宏须要在选项的信任中心打开启用宏

    这种设定非常easy让机器中招。所以用完后最好关掉。

    3 开启编程环境

    右键sheet标签,“查看代码”打开BVA编辑页面。
    当前编辑的就是对应的sheet的代码。


    高速開始:两个下拉菜单选为worksheet和BeforeDoubleClick来使得在表格中双击之前执行代码。
    得到这样一个框架:

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ...
    End Sub

    其它选项百度

    4 基本的语法

    (一般首字母大写的为关键字,全小写为參数)
    获取一个单元格的值,对还有一个赋值

    Sheet4.Cells(2, 1) = Sheet4.Cells(1, 1)

    最后没有分号。

    在保存之后,在Excel文件对应Sheet中双击能够看到结果。

    变量声明
    声明一个整整型的i

    Dim i As Integer

    调试相关
    F5执行脚本,一般能够在一个自定义的宏中先測试好,在放到能够和Excel操作相关的宏中。比方如今自己的宏中測试好再放入双击操作中。

    打印语句。用Debug对象。

    在“马上窗体”查看输出。“马上窗体”能够在视图中打开。

    Dim i, j As Integer
    i = 5
    j = 10
    ' 单引號作为行凝视
    ' 打印多个元素,多个元素用分号隔开,VBA可能会自己加上。
    Debug.Print i; "x"; j; "="; i * j; "  ";
    ' 打印空行
    Debug.Print

    条件语句

    If x > y Then
        [statements]
    ElseIf x>z Then
        [statements]
    Else
        [statements]
    End If

    For Next语法

    For counter = start To end [Step step]
        [statements]
        [Exit For] ' like break
        [statements]
    Next [counter]

    eg.获取自定义的參数元素后填入一列serial number:
    (在Sheet的(2,1)(2,2)本别定义起始值 1,终止值 20,(2,3)(2,4)分别定义数据起始行号 5,要放置结果的列号 7。)

    Sub copyTest()
        Dim tsart, tend, tcol, trow As Integer
        tstart = Sheet4.Cells(2, 1)
        tend = Sheet4.Cells(2, 2)
        trow = Sheet4.Cells(2, 3)
        tcol = Sheet4.Cells(2, 4)
    
        Debug.Print
        Debug.Print "start index: "; tstart
        Debug.Print "end index: "; tend
        Debug.Print "result start:("; trow; ", "; tcol; ")"
    
        Dim i As Integer
        For i = tstart To tend Step 1
            Sheet4.Cells(trow + i - 1, tcol) = i
        Next i
    End Sub

    也能够针对一个区域来做:

    For Each c In Range("a1:c5")
      i = i + 1
      c.Value = i
    Next

    这样会先填充一行,再填充下一行。

    * While Wend *

    While condition(s)
       [statements 1]
       [statements 2]
       ...
       [statements n]
    Wend

    5 一个实例

    利用VBA将一系列传感器数据按序填写到新的位置来自己主动空出丢包的行。
    比方收到数据的包序是101,102,104,105,则在新的位置写入时增加103行,后面为空。(在Sheet的(2,1)(2,2)本别定义起始值。终止值。(2,3)(2,4)分别定义数据起始行号。要放置结果的列号。

    原始数据占用列1-5。从第5行開始放。

    新数据的開始放在表格定义的位置,并在第一列增加连续的serial number)程序例如以下:

    Sub copyTest()
        Dim tsart, tend, tcol, trow As Integer
        tstart = Sheet4.Cells(2, 1)
        tend = Sheet4.Cells(2, 2)
        trow = Sheet4.Cells(2, 3)
        tcol = Sheet4.Cells(2, 4)
    
        Debug.Print
        Debug.Print "start index: "; tstart
        Debug.Print "end index: "; tend
        Debug.Print "result start:("; trow; ", "; tcol; ")"
    
        Dim i, i2, j As Integer
        i = 0
        i2 = 0
        j = 0
        While i < (tend - tstart + 1)
            Sheet4.Cells(trow + i, tcol) = i + tstart
            If Sheet4.Cells(trow + i2, 1) = i + tstart Then
                For j = 1 To 5 Step 1
                    Sheet4.Cells(trow + i, tcol + j) = Sheet4.Cells(trow + i2, j)
                Next j
                i2 = i2 + 1
                ' Debug.Print i2
            End If
            i = i + 1
        Wend
        Debug.Print i2; "total Data number: "; i2
    End Sub

    notification
    source: 资料源于网络。个人所学有限。若有错误和不足还请指教,我会及时更正。Terrence Zhou.
    http://blog.csdn.net/ts_dchs
    转载请注明原址

  • 相关阅读:
    Java lamda Stream
    java动态绑定的一点注意
    javascript的一点学习
    阶段总结
    some notes about spring aop
    java 命令notes
    Guava cache
    位运算
    解析JDK 7的动态类型语言支持
    Maven里面多环境下的属性过滤(配置)
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6993327.html
Copyright © 2020-2023  润新知