------ 前言------
当学习office办公软件的脚本语言到一定阶段后, 我相信很多朋友们会有对自己工作簿做打开,阅读或者修改等操作权限设置的想法。比如带有脚本的工作簿发给其它工作组同事或者客户、供应商的员工使用时,不希望工作簿被某些人打开,或者只希望工作簿只能被自己打开,或者不允许删除某个工作表,或者修改某个单元格值等等等等。保护的思路有很多,什么常规密码保护工作簿,隐藏工作表, 锁定单元格,通过在某个工作表中预设隐藏的单元格值,或者通过预设的单元格区域名称,或者通过电脑硬件信息等等都可以实现这样的场景需求。本篇分享如何获取硬件信息的示例代码。
VBA代码如下:
Sub 获取本机信息()
'获取CPU序列号
Set WM = GetObject("winmgmts:\\.\root\cimv2")
Set devices = WM.ExecQuery("Select * From Win32_processor")
For Each device In devices
ID = device.ProcessorId
Next
[B1] = ID
'获取计算机名称和用户名称
Dim WN As Object
Set WN = CreateObject("Wscript.Network")
[B2] = WN.ComputerName
[B3] = WN.UserName
'获取主板序列号
Dim Obj As Object, sn As String
For Each Obj In GetObject("WinMgmts:").InstancesOf("Win32_BaseBoard")
sn = Obj.SerialNumber
Next
[B4] = sn
'获取C盘序列号
[B5] = Format(CreateObject("Scripting.FileSystemObject").GetDrive("C:").SerialNumber)
'获取网卡
Dim MAC
Set MAC = GetObject("Winmgmts:").InstancesOf("Win32_NetworkAdapterConfiguration")
For Each m In MAC
If m.IPEnabled = True Then
[B6] = m.MacAddress
Exit For
End If
Next
'销毁对象
Set WM = Nothing
Set MAC = Nothing
Set WN = Nothing
End Sub
通过运行上面示例代码,即可得出如下输出结果。(注意下图所示硬件信息已做安全处理,仅做示范)
使用VBA处理职场数据时,写通用函数《神奇的VBA》认为是一个很好的习惯和意识。这样便于后续快速重复调用,减少代码量。针对上面代码,为了更好为我们后续使用,《神奇的VBA》已改写成通用函数,以便后续复用。代码如下:
Function 获取CPU序列号() As String
Set WM = GetObject("winmgmts:\\.\root\cimv2")
Set coldevices = WM.ExecQuery("Select * From Win32_processor")
For Each objdevice In coldevices
ID = objdevice.ProcessorId
Next
获取CPU序列号 = ID
Set WM = Nothing
End Function
Function 获取计算机名称() As String
Dim WN As Object
Set WN = CreateObject("Wscript.Network")
获取计算机名称 = WN.ComputerName
Set WN = Nothing
End Function
Function 获取用户名称() As String
Dim WN As Object
Set WN = CreateObject("Wscript.Network")
获取用户名称 = WN.UserName
Set WN = Nothing
End Function
Function 获取主板序列号() As String
Dim Obj As Object, sn As String
For Each Obj In GetObject("WinMgmts:").InstancesOf("Win32_BaseBoard")
sn = Obj.SerialNumber
Next
获取主板序列号 = sn
End Function
Function 获取硬盘序列号(chr As String) As String
On Error Resume Next
获取硬盘序列号 = Format(CreateObject("Scripting.FileSystemObject").GetDrive(chr).SerialNumber)
End Function
Function 获取网卡信息() As String
Dim MAC
Dim RLT
Set MAC = GetObject("Winmgmts:").InstancesOf("Win32_NetworkAdapterConfiguration")
For Each m In MAC
If m.IPEnabled = True Then
RLT = m.MacAddress
Exit For
End If
Next
获取网卡信息 = RLT
Set MAC = Nothing
End Function
在工作簿,工作表事件中调用上面的硬件信息函数结合if..then结构的逻辑判断语句等就可以有针对性的保护工作簿或者工作表相关操作。如果不知道如何使用事件,不知道CreateObject等方法,以及循环遍历的基础知识,请查阅《神奇的VBA》插件学习。 注意本篇代码经过初步验证,可以直接使用,但函数没有做更多容错判断,如果运行错误请自行查找问题。
另外提醒:上面的Fuction函数,放在标准模块后,也可以当做工作表函数在工作表单元格中使用。
------ 结语------
在《神奇的VBA》插件中并没有相关内容的介绍。VBA编程语言最恰当的应用场景是更好的处理职场中的相关数据,而不是实用性和功能性较弱的保护措施。本篇纯属扫盲分享。
更多职场Excel VBA数据编程知识(职场牛人必备秘技),可下载安装使用职场高效达人必备的参考和学习工具《神奇的VBA》,一款嵌入进Excel Ribbon界面,打开任意Ms Excel工作簿就能随时参阅和学习Excel VBA编程知识的赋能工具。 我还开发了免费的《Power Click》办公增效插件,如需要请自由下载安装。
联系客服