【分享成果,随喜正能量】这个世界上根本没有正确的选择,我们只不过是要努力奋斗,使当初的选择变得正确。。
《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。
类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入,有必要理解这些抽象的理论知识。对象,类,过程,方法,属性,事件,接口,接口如何实现等等。掌握了这些理论,不仅对于VBA这种寄生语言的实质有所深入的理解,也对自然界的很多事物将同样有所感悟。目前,这套教程程序文件已经通过32位,64位两种office系统测试。
这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:VBA类之工作表中响应自定义事件的测试
第五十六讲 在EXCEL工作表中响应自定义事件6
我们继续上讲的讲解,继续监听工作表的事件。
11 工作表中自定义事件的实例讲解,四则运算的自动测验
最近的系列文章,在讲工作表中自定义事件的监听和触发。本讲是这一集的最后一讲,我们仍是通过一个实例来完成我们的讲解。这讲是利用前几讲的内容,实现一个很小的四则运算的自动测验的程序。
如下面的截图:

在这个界面中,我们可以先口算一下数值1和数值2按照运算符号计算所得的结果,然后点击一下运算符号,结果会在D列中自动显示,从而达到即时测验的目的。
下面讲解这个程序的实现过程,先看工作表的代码:
Private WithEvents MyS As mysheet
Private Sub MyS_mySelectRan()
If Cells(MyS.HS, MyS.LS) = "+" Then Cells(MyS.HS, 4) = Cells(MyS.HS, 2) + Cells(MyS.HS, 3)
If Cells(MyS.HS, MyS.LS) = "X" Then Cells(MyS.HS, 4) = Cells(MyS.HS, 2) * Cells(MyS.HS, 3)
If Cells(MyS.HS, MyS.LS) = "/" Then Cells(MyS.HS, 4) = Cells(MyS.HS, 2) Cells(MyS.HS, 3)
If Cells(MyS.HS, MyS.LS) = "-" Then Cells(MyS.HS, 4) = Cells(MyS.HS, 2) - Cells(MyS.HS, 3)
End Sub
Private Sub Worksheet_Activate()
Set MyS = New mysheet
Set MyS.mySht = Sheets("54")
Range("b3", "d15").ClearContents
CD = InputBox("请选择测试的难易程度:A(容易),B(中等),C(难)", "提示")
If CD = "A" Then
mixa = 10: maxb = 20
Else
If CD = "B" Then
mixa = 20: maxb = 50
Else
If CD = "C" Then
mixa = 50: maxb = 100
Else
MsgBox "请选择合适的等级": End
End If
End If
End If
For r = 3 To 15
Cells(r, 2) = Application.WorksheetFunction.RandBetween(mixa, maxb)
Cells(r, 3) = Application.WorksheetFunction.RandBetween(mixa, maxb)
Next
End Sub
Private Sub Worksheet_Deactivate()
Set MyS = Nothing
End Sub
标准模块的代码:
Sub mynz()
Sheets("54").Select
Range("b3", "d15").ClearContents
CD = InputBox("请选择测试的难易程度:A(容易),B(中等),C(难)", "提示")
If CD = "A" Then
mixa = 10: maxb = 20
Else
If CD = "B" Then
mixa = 20: maxb = 50
Else
If CD = "C" Then
mixa = 50: maxb = 100
Else
MsgBox "请选择合适的等级": End
End If
End If
End If
For r = 3 To 15
Cells(r, 2) = Application.WorksheetFunction.RandBetween(mixa, maxb)
Cells(r, 3) = Application.WorksheetFunction.RandBetween(mixa, maxb)
Next
End Sub
代码的截图:



12 实现四则运算的自动测验的代码解读
下面我们将代码进行讲解,其中涉及到类模块的代码这里不再讲了,大家可以回顾一下我们以前的讲解内容:
1 )
Private Sub MyS_mySelectRan()
If Cells(MyS.HS, MyS.LS) = "+" Then Cells(MyS.HS, 4) = Cells(MyS.HS, 2) + Cells(MyS.HS, 3)
If Cells(MyS.HS, MyS.LS) = "X" Then Cells(MyS.HS, 4) = Cells(MyS.HS, 2) * Cells(MyS.HS, 3)
If Cells(MyS.HS, MyS.LS) = "/" Then Cells(MyS.HS, 4) = Cells(MyS.HS, 2) Cells(MyS.HS, 3)
If Cells(MyS.HS, MyS.LS) = "-" Then Cells(MyS.HS, 4) = Cells(MyS.HS, 2) - Cells(MyS.HS, 3)
End Sub
上述代码是mySelectRan事件实现触发后的过程,当我们单击工作表的A列时,当满足一定条件后会触发mySelectRan事件,在这个事件过程中,会根据A列单元格的运算符号实现数值1和数值2的运算。
2)Private Sub Worksheet_Activate()
Set MyS = New mysheet
Set MyS.mySht = Sheets("54")
Range("b3", "d15").ClearContents
CD = InputBox("请选择测试的难易程度:A(容易),B(中等),C(难)", "提示")
If CD = "A" Then
mixa = 10: maxb = 20
Else
If CD = "B" Then
mixa = 20: maxb = 50
Else
If CD = "C" Then
mixa = 50: maxb = 100
Else
MsgBox "请选择合适的等级": End
End If
End If
End If
For r = 3 To 15
Cells(r, 2) = Application.WorksheetFunction.RandBetween(mixa, maxb)
Cells(r, 3) = Application.WorksheetFunction.RandBetween(mixa, maxb)
Next
End Sub
当工作表Activate 事件发生时,实现了类的实例化和工作表监听的关联后会根据用户选择的难易程度在数值1列和数值2列实现数值的自动填充。这个自动填充的过程同样出现在标准模块的“刷新”按钮中。
当用户选择的是容易的级别,那么数值1和数值2的数据取值是10和20 之间;当用户选择的“中等”级别,那么数值1和数值2的数据取值是20和50 之间;当用户选择的是难的级别,那么数值1和数值2的数据取值是50和100之间。大家在看代码的时候要注意,这里利用了一个工作表函数RandBetween。
下面我们看运行的情况:点击A列就可以自动测验结果了:

整个过程是十分友好的。好了,整个工作表事件的触发与监听就讲到这里。

今日内容回向:
1 本讲的实例事件的触发在类模块的哪个部分?
2 运算结果的数值是如何准确定位的?
备注:本讲代码参考程序文件:VBA-CLASS(51-56).xlsm

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

【分享成果,随喜正能量】万物皆空无,一切唯心造。人生顺境是修行,逆境是考验,不管发生什么,坚定好自己的心,便可直面逆境,破浪前行。。




