当前位置:首页 > 实用技巧 >

vb中如何显示平均排名(如何用vb统计成绩)

来源:原点资讯(www.yd166.com)时间:2023-11-03 13:07:34作者:YD166手机阅读>>

本文于2023年9月10日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!

内容提要

  • 工作表权限控制代码解析

VBA代码

1、在用户窗体Usf_Login里

Dim arrUser() Private Sub UserForm_Initialize() Dim ws As Worksheet Dim lastRow As Integer Set ws = ThisWorkbook.Sheets("用户权限表") With ws lastRow = .UsedRange.Rows.Count arrUser = .Range("A2:D" & lastRow).Value End With End Sub Private Sub CmdLogin_Click() Dim ws As Worksheet Dim x As Integer Application.ScreenUpdating = False If Me.TxbUserID = "" Then MsgBox "请输入用户ID!" Exit Sub End If If Me.TxbPassWord = "" Then MsgBox "请输入密码!" Exit Sub End If For i = 1 To UBound(arrUser) If arrUser(i, 1) = Me.TxbUserID Then x = 1 If CStr(arrUser(i, 3)) = CStr(Me.TxbPassWord) Then currUser = arrUser(i, 1) currPermission = arrUser(i, 4) Call BackTo For Each ws In ThisWorkbook.Sheets If currPermission = "All" Then ws.Visible = xlSheetVisible Else If InStr(currPermission, "/" & ws.Name & "/") Then ws.Visible = xlSheetVisible End If End If Next Set ws = Sheets("Main") ws.Range("A1").Value = "当前用户:" & currUser & "(" & arrUser(i, 2) & ") " & Chr(10) & "用户权限:" & currPermission If currPermission = "All" Or InStr(currPermission, "/用户权限表/") Then ws.OLEObjects("CmdUserManage").Visible=True ws.OLEObjects("CmdUserSheet").Visible = True End If Unload Me Exit For Else MsgBox "密码不正确,请重新输入!" With Me.TxbPassWord .SetFocus .SelStart = 0 ' 将光标位置设置为文本框的开头 .SelLength = Len(.Text) ' 选择整个文本框的文本 End With Exit For End If End If Next If x = 0 Then MsgBox "无此用户ID,请重新输入!" Exit Sub End If Application.ScreenUpdating = True End Sub Private Sub CmdExit_Click() Call BackTo Unload Me EndSub

代码解析:

(1)Line1,定义模块级数组arrUser,用来存放用户权限表信息。

(2)line2~10,用户窗体初始化过程,把“用户权限表”存入数组arrUser。

(3)line12~64,登录按钮点击事件。

(A)line16~23,检查用户ID与密码是否输入,不能为空。

(B)line24~41,把用户输入的信息与数组中的信息进行比对,如果相符,则显示“权限”中的工作表。把当前登录用户的权限信息写入工作表“Main”的A1单元格。

(C)line42~45,如果如果权限为“All”或者有“用户权限表”的,工作表“Main”中的两个关于“用户权限”的按钮可见。

(D)line49~55,如果密码不符,则给出提示信息,退出过程,把控件焦点设为TxbPassWord,并选中内容,便于重新输入。

(E)line59~62,如果用户ID未正确输入,则给出提示信息,退出过程。

(4)line66~69,退出按钮点击事件。用户不输入用户名密码,点退出隐藏窗体进入工作表,为防止显示权限以外的表,这里干脆把除了“Main“以外的表全部隐藏。

2、在用户窗体Usf_Permission里:

Dim arrUser() PrivateSubUserForm_Initialize() Dim arrSheets() Dim topPos As Integer Dim ws As Worksheet Dim iWidth As Integer Dim lastRow As Integer Set ws = ThisWorkbook.Sheets("用户权限表") With ws lastRow = .UsedRange.Rows.Count arrUser = .Range("A2:D" & lastRow).Value End With For i = 1 To UBound(arrUser) If arrUser(i, 1) <> "" And arrUser(i, 1) <> "admin" Then Me.Cmbuser.AddItem arrUser(i, 1) End If Next For Each ws In ThisWorkbook.Sheets If ws.Name <> "Main" Then ReDim Preserve arrSheets(k) arrSheets(k) = ws.Name k = k 1 End If Next leftPos = Me.Lbpermission.Left 10 ' 复选框的左侧位置 topPos = Me.Lbpermission.Top Me.Lbpermission.Height 10 ' 复选框的顶部位置 iWidth = 60 For i = LBound(arrSheets) To UBound(arrSheets) '在指定位置插入复选框 Me.Controls.Add "Forms.CheckBox.1", "CheckBox" & i '设置复选框的位置和属性 With Me.Controls("CheckBox" & i) .Left = leftPos .Top = topPos .Width = iWidth .Height = 20 .Caption = arrSheets(i) .Value = False End With '更新位置 If (i 1) Mod 6 = 0 Then '换行 leftPos = Me.Lbpermission.Left 10 topPos = topPos 20 Else '同行下一个位置 leftPos = leftPos iWidth End If Next End Sub Private Sub Cmbuser_Change() Dim ctrl As Control For i = 1 To UBound(arrUser) If arrUser(i, 1) = Me.Cmbuser Then Me.LbUser = arrUser(i, 2) For Each ctrl In Controls If ctrl.Name Like "CheckBox*" Then ctrl.Value = False ctrl.ForeColor = vbBlack If InStr(arrUser(i, 4), "/" & ctrl.Caption & "/") Then ctrl.Value = True ctrl.ForeColor = vbRed End If End If Next EndIf Next End Sub Private Sub CmdSave_Click() Dim ws As Worksheet Dim newPermission As String Dim ctrl As Control Dim userCell As Range Set ws = ThisWorkbook.Sheets("用户权限表") ForEachctrlInControls If ctrl.Name Like "CheckBox*" Then If ctrl.Value = True Then newPermission = newPermission & "/" & ctrl.Caption End If End If Next newPermission = newPermission & "/" Set userCell = ws.Range("A:A").Find(Me.Cmbuser, LookIn:=xlValues) If Not userCell Is Nothing Then userCell.Offset(0, 3) = newPermission Else MsgBox "无此用户!" End If Unload Me Usf_Permission.Show End Sub Private Sub CmdCheck_Click() If Not wContinue("即将清除无效的工作表权限!") Then Exit Sub Dim oldPermission As String Dim newPermission As String Dim ws As Worksheet Dim wb As Workbook Set wb = ThisWorkbook For i = 1 To UBound(arrUser) oldPermission = arrUser(i, 4) If oldPermission <> "All" Then For Each ws In wb.Sheets If InStr(oldPermission, "/" & ws.Name & "/") Then newPermission = newPermission & "/" & ws.Name End If Next If newPermission <> "" Then newPermission = newPermission & "/" End If arrUser(i, 4) = newPermission newPermission = "" End If Next Set ws = wb.Sheets("用户权限表") ws.Range("A2").Resize(UBound(arrUser), 4) = arrUser MsgBox "权限整理完毕!" Unload Me Usf_Permission.Show End Sub Private Sub CmeExit_Click() Unload Me EndSub

代码解析:

(1)Line1,定义模块级数组arrUser,用来存放用户权限表信息。

(2)line2~50,用户窗体初始化过程,把“用户权限表”存入数组arrUser,把工作表名称作为CheckBox控件的Caption列出来。

(A)line13~17,把用户ID添加到组合框的list。

(B)line18~24,把除“Main”以外的工作表名装入数组。

(C)line25~49,把工作表名作为CheckBox的Caption,添加到用户窗体,供勾选,动态添加控件的代码直接复制【Excel VBA 学生成绩排名(更新)/SQL循环查询/嵌套查询】,稍作修改。

(3)line52~69,Cmbuser_Change事件,根据当前用户的权限信息,把对应CheckBox勾选并改为红色。

(4)line71~93,保存按钮点击事件。把勾选的工作表名写入用户权限表。

(5)line95~122,整理按钮点击事件。如果在设置好用户权限后,工作表有改名或删除的,那么用户权限就可能有不存在的表。把这些不存在的工作表权限删除。

(6)line124~126,退出按钮点击事件,退出过程。

3、在myModule里,两个自定义函数

Public currUser As String Public currPermission As String Sub BackTo() Dim ws As Worksheet Dim curSht As String On Error Resume Next Sheets("Main").Activate ActiveSheet.Visible = xlSheetVisible '显示工作表 curSht = ActiveSheet.Name '遍历所有工作表,隐藏不需要显示的工作表 For Each ws In Excel.ThisWorkbook.Worksheets If ws.Name <> curSht Then '设置工作表对象的Visible属性 'ws.Visible = xlSheetHidden ws.Visible = xlSheetVeryHidden End If Next End Sub Function wContinue(Msg) As Boolean '确认继续函数 Dim Config As Long Config = vbYesNo vbDefaultButton2 vbQuestion Ans = MsgBox(Msg & Chr(10) & "是(Y)继续?" & Chr(10) _ & "否(N)返回!", Config, "请确认操作!") wContinue = Ans = vbYes EndFunction

代码解析:

(1)Line1~2,定义两个公共变量。

(2)line4~19,回到主页,返回到工作表“Main”,隐藏其他工作表。

(3)line21~28,确认继续执行函数。

4、在工作表“Main”里:

Private Sub CmdLogin_Click() Me.CmdUserManage.Visible = False Me.CmdUserSheet.Visible = False Me.Range("A1") = "" Usf_Login.Show End Sub Private Sub CmdUserManage_Click() Usf_Permission.Show End Sub Private Sub CmdUserSheet_Click() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("用户权限表") With ws .Visible = xlSheetVisible .Activate End With End Sub Private Sub Worksheet_Deactivate() If currUser = "" Then Me.CmdUserManage.Visible = False Me.CmdUserSheet.Visible = False Me.Range("A1") = "" Call BackTo Usf_Login.Show End If End Sub

代码解析:

(1)Line1~6,用户登录按钮点击事件,把其他两个命令按钮隐藏,A1单元格清空,然后再显示用户登录窗体Usf_Login。

(2)line8~10,用户权限管理按钮点击事件,显示用户权限管理窗体Usf_Permission。

(3)line12~19,用户权限表按钮点击事件,显示“用户权限表”。

(4)line21~29,工作表Deactivate事件,工作表转为非激活,等同于点击其他工作表。这里如果系发生统异常,用户权限信息被清空,则返回到工作表“Main”,隐藏其他工作表,显示用户登录窗体,必须重新登录后才能使用,以防止进入权限以外的工作表。

5、在ThisWorkBook里:

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim ws As Worksheet Dim sp As Shape Call BackTo Set ws = Sheets("Main") ws.OLEObjects("CmdUserManage").Visible = False ws.OLEObjects("CmdUserSheet").Visible = False ws.Range("A1") = "" ThisWorkbook.Save End Sub Private Sub Workbook_Open() Usf_Login.Show EndSub

代码解析:

(1)Line1~10,工作簿BeforeClose关闭前事件,调用BackTo过程,把工作表“Main”上的其他两个按钮隐藏,A1单元格清空。

(2)line12~14,工作簿Open打开事件,显示用户登录窗体Usf_Login。。

~~~~~~End~~~~~~

喜欢就点个、点在看留个言、分享一下呗!感谢!

栏目热文

vb中显示小于60分的成绩的代码(vb中显示学生成绩的代码)

vb中显示小于60分的成绩的代码(vb中显示学生成绩的代码)

1 有内容的最行一行、列lr = Range("A" & Cells.Rows.Count).End(x...

2023-11-03 13:03:08查看全文 >>

vb中统计成绩用数组如何写代码(vb程序怎么筛选及格人数)

vb中统计成绩用数组如何写代码(vb程序怎么筛选及格人数)

人生的每一段路上,需要成功的自信;也需要失败的警醒。每一段经历都要珍贵,生活的美好缘于一颗平常心。不必雕琢,踏踏实实做事...

2023-11-03 12:47:16查看全文 >>

vb中如何求每个同学的平均值(vb中怎么求数的个数)

vb中如何求每个同学的平均值(vb中怎么求数的个数)

在VB编程里,模块和子过程是非常重要的概念,把他俩用好了可以让VB\VBA代码变得井井有条、易于管理、易于复制。本教程用...

2023-11-03 12:24:22查看全文 >>

vb求平均分的程序(vb程序做分数段代码)

vb求平均分的程序(vb程序做分数段代码)

今天学习的内容是代码编写的规范,学习编程有一段时间了,一直写代码都是很随意,只要能运行基本上就没有注意代码的规范性,所以...

2023-11-03 12:27:21查看全文 >>

vb求平均成绩代码(vb打印计算结果)

vb求平均成绩代码(vb打印计算结果)

VB6一行代码计算数组的平均值LongArray_Average长整型数组求平均值。引用Public Declare F...

2023-11-03 12:50:17查看全文 >>

cad字体刷新怎么刷(cad字体怎么刷成一样的)

cad字体刷新怎么刷(cad字体怎么刷成一样的)

在工作中,经常会遇到别人发的文件过来,我们打开后由于缺少字体文件,AutoCAD文件中的字体以“?”显示。现在两步操作解...

2023-11-03 12:23:50查看全文 >>

cad剖面线快捷指令(cad的剖面线怎么设置)

cad剖面线快捷指令(cad的剖面线怎么设置)

在CAD中,剖断线是一种用于表示物体内部结构和材料的线型,通常用来辅助绘制立体物体和机械图纸,在工程制图和建筑设计等领域...

2023-11-03 12:58:12查看全文 >>

cad按住什么键可以拖动(cad按住什么键可以拖动画面)

cad按住什么键可以拖动(cad按住什么键可以拖动画面)

CAD“三键客”之一的Shift键,在平时绘图过程中,配合一些操作,能帮助我们更好的去画图。在这里,总结了6个我常用的S...

2023-11-03 13:07:55查看全文 >>

cad刷新快捷键是哪个(cad里面刷新是哪个快捷键呀)

cad刷新快捷键是哪个(cad里面刷新是哪个快捷键呀)

cad是一款功能强大的绘图软件,对于设计人员来说应该不陌生。而CAD可以进行图纸重新生成刷新,那么cad刷新快捷键是什么...

2023-11-03 12:50:15查看全文 >>

cad测量长度快捷键(cad快捷键大全表格)

cad测量长度快捷键(cad快捷键大全表格)

我们在用CAD绘图的时候,经常需要测量各种各样的数据,长度的测量就是很常见的一种,不过有时候要测量的对象却不是一条直线那...

2023-11-03 13:08:09查看全文 >>

文档排行