在我的窗体中共用7大需求,分别对应着不同的Application.Caller值,这样我可以在加载UserForm窗口时可以精准实现我的控制。如下面的删除代码传递的Application.Caller是8
If Right(Application.Caller, 1) = 8 Then '删除
' UserForm1.CommandButton3.Enabled = False '开始
UserForm1.CommandButton1.Enabled = False '下一条记录
UserForm1.CommandButton4.Enabled = False '最后一条记录
UserForm1.CommandButton5.Enabled = False '编辑记录
UserForm1.CommandButton7.Enabled = False '查找记录
UserForm1.CommandButton8.Enabled = False '删除记录
UserForm1.CommandButton6.Enabled = False '保存记录
UserForm1.CommandButton9.Enabled = False '录入记录
UserForm1.TextBox1.Enabled = False
UserForm1.TextBox2.Enabled = False
UserForm1.TextBox3.Enabled = False
End If
上述代码就是实现了在加载窗体时,只有“开始”按钮可以响应代码,耳其他的十项内容是不可以响应代码的。
二 在实现窗口的交互工程的设计的时候窗体的设计和代码的设计要同时进行
为了能让代码控制窗体时达到最友好的界面,让用户有友好的体验,我们要对代码和窗体同步的设计,不要先涉及完窗体,再写代码,这样往往会造成在写代码时发现窗体设计的不合理后修改麻烦。更不能在写完代码后再布局窗体。而是应该按照一步一个脚印的办法同步完成窗体的布局和代码的书写。
1.写一段代码时,可能用到多个控件,那么我就先把这些控件先布置好;
2.在布置一个控件时往往会用到其他的控件,那么我们就一并布置好。
3.布置控件和写代码可以同步进行,边写代码边布置控件
如我在写上述工程的保存按钮代码时会遇到录入保存和修改保存两种情况,那么我要合并来考虑,不要分开写;
Private Sub CommandButton6_Click() '保存
If UserForm1.TextBox1.Value = "" Or UserForm1.TextBox2.Value = "" Or UserForm1.TextBox3.Value = "" Then MsgBox "信息有空值,请确认!": Exit Sub
If MsgBox("是否要保存记录?", vbOKCancel, "提示") = vbCancel Then Exit Sub
Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Dim myData() As Variant
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.FullName
cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 12.0;hdr=yes;imex=0';" _
& "data source=" & strPath
strSQL = "SELECT * FROM [数据7$]"
rsADO.Open strSQL, cnADO, 1, 3
If UserForm1.TextBox1.Enabled = False Then '编辑的保存
If rsADO.RecordCount > 0 Then rsADO.MoveFirst
Do While Not rsADO.EOF
If Trim(rsADO.Fields(0)) = UserForm1.TextBox1.Value Then
rsADO.Fields(1) = UserForm1.TextBox2.Value
rsADO.Fields(2) = UserForm1.TextBox3.Value
rsADO.Update
GoTo 100
End If
rsADO.MoveNext
Loop
100:
UserForm1.TextBox1.Enabled = False
UserForm1.TextBox2.Enabled = False
UserForm1.TextBox3.Enabled = False
UserForm1.CommandButton6.Enabled = False
MsgBox ("保存OK!")
Else '录入的保存
If rsADO.RecordCount > 0 Then
Do While Not rsADO.EOF
If Trim(rsADO.Fields(0)) = UserForm1.TextBox1.Value Then MsgBox "员工编号重复,请确认!": GoTo 110
rsADO.MoveNext
Loop
End If
rsADO.AddNew
rsADO.Fields(0) = UserForm1.TextBox1.Value
rsADO.Fields(1) = UserForm1.TextBox2.Value
rsADO.Fields(2) = UserForm1.TextBox3.Value
rsADO.Update
110:
UserForm1.TextBox1.Value = ""
UserForm1.TextBox2.Value = ""
UserForm1.TextBox3.Value = ""
UserForm1.TextBox1.SetFocus
MsgBox ("保存OK!")
End If
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
上述代码中在打开数据库的连接设置时是一样的,我就用同样的连接来进行。
三 代码要采用自己熟悉的方式写法进行。
实现一个目的有很多方法,写代码也是一样,实现一个功能,有很多代码的写法,有的人喜欢用这种,有的人喜欢有那种,无可厚非。大家要注意VBA的定位,我也多次讲过,对于我们日常工作的OFICE内容,运行时间是可以不用作为第一要素来考虑的。往往,我们更注重的是和手工操作的比较。
所谓采用自己熟悉的方式,就是在我的书籍中经常提到的搭积木的方法,罗列你的代码到合适的位置,然后再修正它。
四 完成自己的工程后要做细致的调试。这种调试包括:
1 通用数据的测试。
2 首尾数据的测试。
3 异常数据的测试。
所谓通用数据就是一般正常的数据实现,首尾数据的测试为了避免由于变量设置失误而造成数据的丢失。异常数据是指通常的“坑”,自己给自己挖个坑,然后自己跳下去,也未尝不可,这样可以更能检测自己的程序运行情况。
好了,再看看我们最后的窗体运行:
最后祝大家在VBA的道路上稳步的前进。
(本书完)