基于VBA的数据管理器开发
2018新年开工大吉,祝一切好运再接再励。记录第一篇个人技术博,成功入坑CSDN博客。
本blog是总结年前开发的小程序——PLM数据管理器,所用编程语言为基于Excel的开发工具VBA。VBA无需安装其他专门的编程平台,只需安装一个完整的EXCEL即可,本博所用的Excel版本为Microsoft Excel2010。打开Excel后,若开发工具选项栏隐藏了,可在文件--选项--自定义功能区--勾选开发工具,把开发工具选项栏显示出来;然后,点击信任中心--信任中心设置--宏设置--勾选启动所有宏,完成了VBA开发环境的所有配置。
1.管理器设计架构:
(1)如何将自定义宏功能捆绑到初始化界面的控件中;
(2)如何创建窗体,并在窗体中添加框架以及各类控件;
(3)各类控件如何逻辑关联,用到的语法有哪些;
(4)不同事件如何触发;
2.桌面控件的插入与宏定义:
按照开发思路,所有的数据表以及辅助工作表的初始状态均处于隐藏状态,只有工作表“初始化界面”处于显示状态。初始化界面中绘制有1个分组框,5个按钮控件。每个按钮分别对应不同的功能模块——新增电子元器件,新增电路板/程序,查找,添加元器件规格书,非标准封装管理。点击不同的按钮,会弹出不同的窗体,以配合完成不同的管理工作。
初始化界面的绘制:点开菜单开发工具--点击插入--先插入一个分组框--右键设置分组框属性--再插入5个按钮控件--右键设置按钮的属性--完成界面绘制。
自定义宏功能:打开VisualBasic编辑器--点击菜单插入模块--分别自定义5个功能模块的过程名称及逻辑,使得点击按钮,能够显示对应的窗体。
宏的捆绑:在初始界面中右键按钮控件--指定宏--选择对应的自定义宏名称--确定。
3.窗体的创建与控件定义
窗体的创建:打开VisualBasic编辑器--点击菜单插入窗体--在视图菜单中打开工具箱--绘制所用到的控件(包括框架/标签/文字框/列表框/按钮),关于窗体的属性可按F4打开属性窗口,最常用的窗体属性包括名称/Caption/ShowModal,注:若想在窗体显示时,允许编辑单元格内容,则需设置ShowModal属性=False。
控件属性定义:按F4打开属性窗口,可浏览每个控件常用的属性(包括名称/Caption/List/Value/Visible)。
引用控件属性:格式为(控件名称).(属性)= (值) ,例如:
label_check.caption=“PLM图号”//将标签label_check的名称改为“PLM图号”
cmb_ele.value="电阻" //将列表框cmb_ele的值设为“电阻”
Me.cmb_ele.List=Split("差模电感,磁珠,单相共模电感,三相共模电感",",") //设置列表框cmb_ele的下拉值
frm_element.visible=false //将框架frm_element的显示状态设为隐藏
4.表格/控件的逻辑关联及语法:
(1)关联单元格内容
sheets("电阻")range("A1").value=cmb_ele.value //将列表框cmb_ele的值传送到工作表"电阻"的A1单元格
(2)获取工作表最大非空行数
dim max_row as integer
max_row=sheets("电阻").range("A65535").end(3).row //依据A列获取工作表"电阻"中的最大非空行数
(3)关联行与列内容
dim i as integer
for i = 1 to 10
sheets("电阻").cells(max_row+1,i).value=Me.controls("text"& i).value //将10个文字框text中的值赋给工作表的空行
next i
(4)Excel内置函数的调用
dim a as boolean
a=Application.worksheetfunction.iserror(sheets("电阻").range("A1")) //利用内置函数判断工作表中A1单元格的值是否有误,然后赋值给a
(5)弹出确认窗口,并根据确认值执行过程
dim yn as integer
yn = msgbox ("是否确定隐藏工作表?",vbYesNo,"确认") //弹出确认框,含有"是"/"否"按钮,并将按钮值赋给yn
if yn = 6 then
sheets("电阻").Visible=false //选择按钮“是”,工作表隐藏
else
sheets("电阻").Visible=true //选择按钮“否”,工作表不隐藏
end if
(6)窗体最大化/最小化按钮设置
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_THICKFRAME As Long = &H40000 '(恢复大小)
Private Const WS_MINIMIZEBOX As Long = &H20000 '(最小化)
Private Const WS_MAXIMIZEBOX As Long = &H10000 '(最大化)
'窗体UserForm的初始化
Private Sub UserForm_Initialize()
Dim hWndForm As Long
Dim IStyle As Long
hWndForm = FindWindow("ThunderDFrame", Me.Caption)
IStyle = GetWindowLong(hWndForm, GWL_STYLE)
IStyle = IStyle Or WS_THICKFRAME '还原
IStyle = IStyle Or WS_MINIMIZEBOX '最小化
IStyle = IStyle Or WS_MAXIMIZEBOX '最大化
SetWindowLong hWndForm, GWL_STYLE, IStyle
End Sub
(7)批量输入数据
//借助fig变量历遍A1:D1行,并判断A1:D1的单元格值,对应输入text文本框的值到第二行
dim fig as variant
for each fig in Sheets("电阻").Range(“A1:D1”)
if fig.Value = "PLM图号" Then
cells(2,fig.Column)=text_plm.Value
elseif fig.Value="阻值" Then
cells(2,fig.Column)=text_zz.Value
elseif fig.Value="功率" Then
cells(2,fig.Column)=text_gl.Value
elseif fig.Value="温度" Then
cells(2,fig.Column)=text_wd.Value
end if
next fig
(8)对输入值进行查重
//设置变量chachong作为判断值,对工作表B1:D4查找text_shuru文本框的值,赋值给变量chachong,如果chachong值为非空,则该文本值已存在
Dim chachong as variant
set chachong = Sheets("电阻").Range("B1:D4").Find(text_shuru.Value,LookIn:=xlValues)
if Not chachong Is Nothing Then
Msgbox "属性已存在"
(9)锁定工作表
//对工作表中特定的行/列进行保护,不允许用户进行修改。
//注:锁定后的单元格无法修改,若需要修改值,必须先解除锁定
Private Sub Worksheet_Activate()
sheets("电阻").Unprotect //先对工作表解除保护
range("A1:Z1").Locked=True //对保护区域进行锁定
Sheets("电阻").Protect //对工作表重新保护
end sub
(10)跨表操作
//打开与本表路径一直的工作簿“电子元件规格书对照表”,然后将该表sheet1中的A1单元格的值改为“打开成功”
Dim myname as String
Dim mypath as String
myname = "电子元件规格书对照表.xlsx"
mypath = ThisWorkbook.Path
WorkBooks.Open filename:=mypath &“\”& myname
Workbooks(myname).Sheets(1).range("A1")="打开成功"
5.事件触发过程
(1)click过程:鼠标左键单击对象,触发过程,如:
Private Sub butok_Click()
Sheets(1).range("A1").value="触发Click过程" //点击控件butok,使表1单元格A1的值改变
end sub
(2)无事件过程:通常作为宏的使用,也可作为子过程利用Call进行调用,如:
Private Sub button1_Click() //按下按钮,触发过程
if text1.value=1 then
call clear_ele() //调用clear_ele过程
end sub
Sub clear_ele() //定义无事件过程
text1.value=""
end sub
(3)Activate过程:通常作为工作表更新所用,即激活工作表时执行过程,如:
Private Sub Worksheet_Activate()
range("A1").value="激活成功" //激活工作表时,对应的A1单元格内容显示为“激活成功”
end sub
(4)SelectionChange过程:通常用作工作表的内容更新,该事件对应鼠标选中不同位置时,均执行过程,因此提高了刷新效率,如:
Private Sub Worksheet_SelectionChange()
selection.value= 1 //选中的单元格,均赋值1
end sub
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
