求助:如何用VBA获取任务管理器中的以太网使用率?
获取以太网使用率的VBA解决方案
你已经搞定了CPU和内存的获取,卡在以太网使用率确实挺头疼的——任务管理器里的这个数据其实是从系统性能计数器里提取的,咱们可以通过**WMI(Windows Management Instrumentation)**来实现,这是Windows自带的系统管理接口,比直接调用底层API更直观易懂。
完整实现代码(整合你的内存逻辑)
我把你现有的内存获取代码和新的以太网、CPU获取逻辑整合到了一起,直接就能用:
Private Type MEMORYSTATUS dwLength As Long dwMemoryLoad As Long dwTotalPhys As Long dwAvailPhys As Long dwTotalPageFile As Long dwAvailPageFile As Long dwTotalVirtual As Long dwAvailVirtual As Long End Type Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS) ' 获取CPU使用率(补充你可能需要的CPU逻辑) Function GetCPUUsage() As Double Dim objWMIService As Object Dim colItems As Object Dim objItem As Object Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set colItems = objWMIService.ExecQuery("SELECT LoadPercentage FROM Win32_Processor") For Each objItem In colItems GetCPUUsage = objItem.LoadPercentage Exit For ' 单CPU/多核心取第一个核心的使用率,需要平均值的话可以累加计算 Next End Function ' 获取内存使用率(你的原有代码封装) Function GetMemoryUsage() As Long Dim memStatus As MEMORYSTATUS memStatus.dwLength = Len(memStatus) GlobalMemoryStatus memStatus GetMemoryUsage = memStatus.dwMemoryLoad End Function ' 获取以太网使用率 Function GetEthernetUsage() As Double Dim objWMIService As Object Dim colNetworkInterfaces As Object Dim objInterface As Object Dim usage As Double Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") ' 筛选以太网接口,根据你的系统语言调整关键词(比如英文系统用"Ethernet") Set colNetworkInterfaces = objWMIService.ExecQuery( _ "SELECT * FROM Win32_PerfFormattedData_Tcpip_NetworkInterface WHERE Name LIKE '%以太网%' OR Name LIKE '%Ethernet%'") For Each objInterface In colNetworkInterfaces ' 计算逻辑和任务管理器一致:(实时收发总速率 / 网卡最大带宽) * 100 If objInterface.CurrentBandwidth > 0 Then usage = ((objInterface.BytesReceivedPerSec + objInterface.BytesSentPerSec) * 8) / objInterface.CurrentBandwidth * 100 GetEthernetUsage = Round(usage, 2) Exit For ' 取第一个匹配的以太网接口 End If Next ' 未找到有效接口时返回-1标记 If usage = 0 Then GetEthernetUsage = -1 End Function ' 测试函数,按F5运行后看立即窗口输出 Sub TestSystemMetrics() Debug.Print "CPU使用率: " & GetCPUUsage() & "%" Debug.Print "内存使用率: " & GetMemoryUsage() & "%" Debug.Print "以太网使用率: " & GetEthernetUsage() & "%" End Sub
关键注意事项
- 系统语言适配:如果你的系统是英文/繁体中文,要把筛选条件里的关键词改成对应语言(比如英文用
%Ethernet%,繁体用%乙太網%)。 - 多网卡处理:如果电脑有多个以太网接口(比如有线网卡+虚拟机网卡),可以修改代码遍历所有匹配项,或者通过精准的网卡名称筛选(比如
Name = "以太网 2")。 - 权限与宏设置:Office里运行需要启用宏,普通用户权限就足够读取系统性能数据,不需要管理员权限。
原理说明
任务管理器的以太网使用率计算逻辑和代码里完全一致:用当前每秒收发的总字节数(转成bps单位)除以网卡的最大带宽,再乘以100得到百分比。WMI的Win32_PerfFormattedData_Tcpip_NetworkInterface类已经封装了这些实时性能计数器,省去了我们自己解析底层API的麻烦。
内容的提问来源于stack exchange,提问作者response
相关产品推荐
相关产品推荐

