`

Excel VBA的一个总结

阅读更多

我以前的VBA都是满足我自己的一个小小的需求的,他们通常都比较简单,属于自娱自乐型的,都很简单,今天终于写了一个稍微复杂一点的, 程序有两个bug, 在写这篇博客之前, 我刚花费两个小时把它们解决掉, 趁着还没忘, 对吸取到的一些经验教训加以总结.

 

下面是部分excel代码,代码后面是总结, 总结的地方已使用"- == BUG == -"标出:

' -- ==  BUG == --
' use this option, the interpreter will help you~~~
' Option Explicit


'used in step 01
Dim st
Dim et
Dim maxrow
Dim count

'used in step 02
Dim waste

Private Sub CommandButton1_Click()
    
    st = DateValue("2008-08-29")
    et = DateValue("2008-9-06")
    maxrow = 61000
    count = 1

    
    'MsgBox DateValue(Cells(2, 1))

    Call processSheet(Sheet2)
    Call processSheet(Sheet3)
    Call processSheet(Sheet4)

    MsgBox (count)
    
End Sub

Private Sub processSheet(sheet)

    sheet.Activate
    
    For i = 2 To maxrow
        If sheet.Cells(i, 1) <> "" Then
            t = DateValue(sheet.Cells(i, 1))
            If t >= st And t <= et Then
                count = count + 1
                sheet.Rows(i).Copy
                Sheet5.Rows(count).Insert Shift:=xlDown
            End If
        End If
    Next


   
    'MsgBox (Cells(2, 1))
    'MsgBox (count)
    
End Sub


Private Sub CommandButton2_Click()

    
    For i = 2 To 5815
        d = DateValue(Cells(i, 1))
        t = TimeValue(Cells(i, 1))
        
        Call findPos(d, t, Cells(i, 2), Cells(i, 3))
        Cells(i, 14) = waste
        
        If waste = Cells(i, 13) Then
            Cells(i, 15) = "Yes"
        Else
            Cells(i, 15) = "NO"
        End If
    Next
    
End Sub


Sub findPos(d, t, asset, serial)

    'Sheet5.Select
    waste = "-"
    
    For i = 2 To 60000
        'asert date is not null
        If Sheet5.Cells(i, 1) = "" Then
            Exit For
        End If
        
        'find waste box
        td = DateValue(Sheet5.Cells(i, 1))
        tt = TimeValue(Sheet5.Cells(i, 1))
        diff = DateDiff("n", t, tt)
        
        If d = td And (diff > -10 And diff < 10) And asset = Sheet5.Cells(i, 2) And serial = Sheet5.Cells(i, 3) Then
            waste = Sheet5.Cells(i, 14)
            Exit For
        End If
        
    Next
    
    'Sheet1.Select
    
End Sub

Private Sub CommandButton3_Click()

    
    For i = 2 To 5815
        
        If "NO" = Cells(i, 15) Then
            d = DateValue(Cells(i, 1))
            t = TimeValue(Cells(i, 1))
            
            Cells(i, 1).Select
        
            Call findFuzzy(d, t, Cells(i, 2), Cells(i, 3))
            Cells(i, 14) = waste
        
            If waste = Cells(i, 13) Then
                Cells(i, 15) = "Yes"
            Else
                Cells(i, 15) = "NO"
            End If
        End If
    Next
    

End Sub



Sub findFuzzy(d, t, asset, serial)

    Min = DateValue("2099-08-29")
    mintime = TimeValue("23:59:59")
    mintimebeh = TimeValue("23:59:59")

    waste = "-"
    flag = True
    
    For i = 2 To 60000
        'asert date is not null
        If Sheet5.Cells(i, 1) = "" Then
            flag = False
            Exit For
        End If
        
        'judge wheather is the same printer
        If asset = Sheet5.Cells(i, 2) And serial = Sheet5.Cells(i, 3) Then
        
        
            'find waste box
            td = DateValue(Sheet5.Cells(i, 1))
            tt = TimeValue(Sheet5.Cells(i, 1))
            diff = DateDiff("n", t, tt)
        
                
            'record the min date before last day
            If DateDiff("d", d, td) = 1 Then
                    If tt < mintimebeh Then
                        mintimebeh = tt
                        ' -- ==  BUG == -- i spell mpbeh as mpben by mistake
                        ' -- ==  BUG == -- pay more attantion on the spelling of the var
                        mpbeh = i
                    End If
            End If
            
            'record the min value today
            If DateDiff("d", d, td) = 0 Then
                    If tt > t And tt < mintime Then
                        mintime = tt
                        mp = i
                    End If
            End If
            
        'end judge
        End If

    Next
    
    
    If mintime <> TimeValue("23:59:59") Then
        ' -- ==  BUG == --  waste = Cells(mp, 14)
        ' -- ==  BUG == --  when use the cells that are not in the same sheet of the button ,you must use  "Sheet5" to modify it.
        waste = Sheet5.Cells(mp, 14)
    Else
        waste = Sheet5.Cells(mpbeh, 14)
    End If
    
    'Sheet1.Select
    
End Sub

Private Sub CommandButton4_Click()

    d1 = DateValue("2008-08-29")
    d2 = DateValue("2008-7-06")
    

    MsgBox DateDiff("d", d1, d2)
    
End Sub

 

总结两点:

1. 第一个bug的原因是我误将mpbeh拼写成了mpben,以至于我没有得到我想要的值, 该死的键盘设计的有问题, h & n靠的那么近, 还张得那么像, 在一堆字符里错误的出现通常很难辨识,尤其在脑袋大的时候.

 

为此MrLiu建议使用:"Option Explicit"来减少,变量拼写的错误, 恩,不错,thx

 

2. 在引用了不和空间在一个sheet里面的cells的时候,没有使用sheet进行限定.

虽然通篇我都很小心的注意了这一点, 但我还是漏掉了一处, 为此我也付出了应有的代价. 以后只有更加留神,或者写vba的时候尽量避免这种情况出现. 毕竟你想我刚开始那样直接写上一个Cells, 他在解释器看来是再合法不过的了, 虽然你可能并不想这么做.

 

另:玩具一样的例子中学到的东西也有限, 如果我有一个机会出一个实际题目, 让自己或者别人通过这个例子强化一下vba, 我会出什么? 刚才想了一下这个问题, 一个答案是做一个:"SQL学习环境", 毕竟他和数据库还都挺关系的. 还有别的更好的答案吗?

分享到:
评论

相关推荐

    隐藏ExcelVBA.rar

    3. **使用第三方工具**: "隐藏ExcelVBA.exe"可能就是这样一个工具,它可能通过某种方式自动隐藏或加密VBA模块,提供更高级的保护。使用此类工具时需要注意安全性和兼容性,确保它们不会破坏Excel文件或引入恶意软件...

    EXCEL VBA获取电脑硬盘的序列号

    总结起来,通过Excel VBA和Windows API,我们可以轻松地获取电脑硬盘的序列号和其他相关信息。这种技术在开发特定的Excel应用程序时非常有用,尤其是在需要识别或验证硬件设备的场景下。不过,要注意的是,访问这些...

    EXCEL VBA PDF 文件

    类似地,`Workbooks.Open("PDF的路径")`是Excel VBA中的一个方法,通常用于打开Excel工作簿,但如果你安装了支持的ActiveX控件,它也可以用来打开PDF文件。 下面是一个示例脚本,展示了如何结合使用`CreateObject`...

    Excel VBA/Excel VBA

    Excel VBA为用户提供了一个强大的工具集,不仅能够极大地提高工作效率,还能够实现高度定制化的应用程序开发。通过本课程的学习,学员将能够掌握Excel VBA的基础知识,并能够在实际工作中灵活运用这些技能来解决复杂...

    Excel VBA 快速上手之宝典

    附录提供了一个详细的VBA对象模型图,帮助读者理解VBA环境中不同对象之间的关系和层次结构。 通过阅读这本书,读者不仅可以掌握Excel VBA的基本语法,还能学会如何利用VBA进行更复杂的数据操作和自动化任务,提升...

    Excel VBA帮助

    Excel对象模型是VBA在Excel中的核心组件,它是一个层次结构的类库,包含了各种对象、属性、方法和事件。理解这个模型是学习VBA的关键。以下是一些主要的Excel对象: 1. **Application对象**:代表整个Excel应用程序...

    Excel VBA基础入门(PDF)

    - **Function函数**: 可以返回一个值的过程,用于计算结果。 - **Property属性过程**: 定义对象的属性。 - **Event事件过程**: 处理对象触发的事件。 **1.12 内部函数** - **测试函数**: 如`IsNumeric`、`IsEmpty`...

    ExcelVBA辅助录入v2.2.2(交通工程质量监督管理系统)

    总结来说,ExcelVBA在交通工程质量监督管理系统中扮演着不可或缺的角色,通过自动化数据处理,提高数据管理的质量和效率,使得复杂的数据管理工作变得更为便捷和可靠。同时,对VBA的学习和掌握,对于提升工作效率和...

    Excel VBA创建动态图表

    1. **设置图表对象**:首先,我们需要在VBA编辑器中创建一个ChartObject,这代表了一个Excel图表。可以使用`Worksheets("Sheet1").ChartObjects.Add`方法来添加一个新的图表对象到指定的工作表上。 2. **选择图表...

    一款用ExcelVBA编写的游戏

    总结来说,“水晶精灵”这款游戏不仅是娱乐的工具,更是一个学习Excel VBA的理想平台。它以一种直观且有趣的方式展示了VBA的潜力,鼓励着人们去探索编程的乐趣,提升技术素养。无论你是初学者还是有经验的开发者,都...

    EXCEL VBA三角函数

    - **定义**: 计算一个数的反正弦值。 - **VBA 实现**: ```vb Public Function ArcSin(ByVal X As Double) As Double ArcSin = Atn(X / Sqr(-X * X + 1)) End Function ``` - **解析**: - `Atn` 是 Excel VBA ...

    Excel VBA_排课表显示实例集锦.doc

    本文档的标签为"ExcelVBA 排课表显示实”,表明本文档的内容是关于使用 Excel VBA 编程语言来实现排课表的显示实例,并提供了相关的标签来帮助读者快速了解文档的内容。 部分内容解释: 本文档的部分内容提供了一个...

    ExcelVBA的常用对象及应用

    本文将详细介绍Excel VBA中的常用对象,并通过一个具体的实例——数据汇总功能的实现——来展示如何利用这些对象。 #### 二、Excel VBA的常用对象 在Excel VBA中,对象是程序的核心组成部分。理解这些对象及其属性...

    如何用excel vba设置登陆密码

    通过以上步骤,我们可以轻松地使用Excel VBA创建一个简单的登录界面,从而实现对敏感数据的保护。这对于希望提高数据安全性的初学者来说是一个很好的实践项目。当然,这只是VBA强大功能的冰山一角,深入学习VBA将为...

    实用的EXCELVBA编程大全总结.doc

    实用的EXCELVBA编程大全总结.doc

    Excel VBA实现的最全的单位换算-VBA源码.rar

    在这个“Excel VBA实现的最全的单位换算-VBA源码”的压缩包中,你将找到一个利用VBA编写的单位换算程序,它覆盖了各种常见的物理量单位,如长度、重量、体积、温度、速度等。通过学习和理解这个源码,你可以提升自己...

    vb/vba引用excel无法退出excel进程的解决方法

    在使用VB/VBA编程语言操作Excel时,经常会遇到一个令人头疼的问题:尽管已经执行了`xlapp.Quit` 和 `Set xlapp = Nothing`来关闭Excel应用并释放相关资源,但Excel进程仍然在任务管理器中持续运行,无法完全关闭。...

    EXcelVBA另存之后删除按钮及宏代码

    根据提供的Excel VBA代码,我们可以总结出以下关键知识点: ### 关键知识点一:宏操作流程 这段宏的主要目的是实现一个自定义的“另存为”功能,并在保存新工作簿后,删除原工作簿中的某些元素(如指定的工作表和...

Global site tag (gtag.js) - Google Analytics