当前位置: 首页 > news >正文

别再手动改打印机了!用VBA一键获取所有打印机名字和端口号(附完整代码)

用VBA实现打印机智能管理:从基础查询到自动化配置

每次在办公室需要打印文件时,你是否也经历过这样的困扰?面对十几台网络打印机,手动查找每台设备的名称和端口号简直是一场噩梦。更糟的是,当系统更新或网络调整后,原先配置好的打印机突然无法工作,只能重新开始漫长的排查过程。作为一位长期与Excel打交道的财务分析师,我曾经每周都要浪费至少两小时在这种重复劳动上,直到发现了VBA这个强大的自动化工具。

1. 为什么需要自动化管理打印机?

在日常办公环境中,打印机管理往往被忽视,却实际消耗着大量时间。根据一项针对500名办公室职员的调查,平均每人每月要花费3-5小时处理打印机相关问题。常见痛点包括:

  • 设备识别困难:网络环境中存在多台同名或名称相似的打印机
  • 端口号混乱:系统自动分配的端口号缺乏规律,难以记忆
  • 配置易丢失:系统重装或更新后,所有自定义设置需要重新配置
  • 批量操作繁琐:需要为不同部门或文件类型指定不同打印机时操作复杂

VBA提供的WScript.Network对象能够直接与Windows打印系统交互,获取最准确的设备信息。相比手动查看控制面板或注册表,这种方式不仅更快,还能将数据直接用于后续自动化流程。

2. 构建打印机信息查询系统

2.1 核心对象解析

WScript.Network是Windows脚本宿主提供的网络操作接口,通过它可以访问三类关键资源:

  1. 打印机连接:枚举所有已配置的打印机及其端口
  2. 网络驱动器:映射和管理网络共享文件夹
  3. 用户信息:获取当前登录用户的域和用户名

在VBA中使用前,需要创建对象实例:

Dim WshNetwork As Object Set WshNetwork = CreateObject("WScript.Network")

2.2 完整打印机枚举方案

以下代码不仅能列出所有打印机,还会智能分类端口和名称,并标注默认打印机:

Sub GetAllPrinters() Dim WshNetwork As Object Dim oPrinters As Object Dim i As Long Dim result As String Set WshNetwork = CreateObject("WScript.Network") Set oPrinters = WshNetwork.EnumPrinterConnections result = "当前系统打印机列表:" & vbCrLf & vbCrLf For i = 0 To oPrinters.Count - 1 Step 2 result = result & "端口: " & oPrinters(i) & vbCrLf result = result & "名称: " & oPrinters(i + 1) & vbCrLf ' 检查是否为默认打印机 If oPrinters(i + 1) = WshNetwork.GetDefaultPrinter() Then result = result & "(系统默认打印机)" & vbCrLf End If result = result & "------------------------" & vbCrLf Next i ' 显示在立即窗口并弹出消息框 Debug.Print result MsgBox result, vbInformation, "打印机信息报告" End Sub

执行后会得到如下格式的输出:

端口: Ne01: 名称: HP LaserJet Pro MFP M428fdw (系统默认打印机) ------------------------ 端口: Ne02: 名称: Canon imageCLASS LBP6230dw ------------------------

2.3 数据存储与再利用

单纯显示信息还不够实用,我们可以将结果保存到Excel工作表,建立打印机数据库:

Sub SavePrintersToSheet() Dim ws As Worksheet Dim WshNetwork As Object Dim oPrinters As Object Dim i As Long Dim rowIndex As Integer ' 创建或选择"打印机列表"工作表 On Error Resume Next Set ws = ThisWorkbook.Sheets("打印机列表") On Error GoTo 0 If ws Is Nothing Then Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) ws.Name = "打印机列表" ' 设置表头 ws.Range("A1:D1") = Array("序号", "端口号", "打印机名称", "是否默认") Else ' 清空旧数据(保留表头) ws.Range("A2:D1000").ClearContents End If Set WshNetwork = CreateObject("WScript.Network") Set oPrinters = WshNetwork.EnumPrinterConnections rowIndex = 2 For i = 0 To oPrinters.Count - 1 Step 2 ws.Cells(rowIndex, 1) = rowIndex - 1 ' 序号 ws.Cells(rowIndex, 2) = oPrinters(i) ' 端口 ws.Cells(rowIndex, 3) = oPrinters(i + 1) ' 名称 ' 检查默认状态 If oPrinters(i + 1) = WshNetwork.GetDefaultPrinter() Then ws.Cells(rowIndex, 4) = "是" Else ws.Cells(rowIndex, 4) = "否" End If rowIndex = rowIndex + 1 Next i ' 自动调整列宽和格式化 ws.Columns("A:D").AutoFit ws.Range("A1:D1").Font.Bold = True ws.ListObjects.Add(xlSrcRange, ws.Range("A1:D" & rowIndex - 1), , xlYes).Name = "PrinterTable" MsgBox "成功保存 " & (rowIndex - 2) & " 台打印机信息到工作表!", vbInformation End Sub

提示:定期运行此代码可以建立打印机配置历史记录,便于追踪变化和排查问题

3. 高级打印机管理技巧

3.1 智能打印机选择器

基于收集的打印机信息,我们可以构建交互式选择界面:

Sub SmartPrinterSelector() Dim WshNetwork As Object Dim oPrinters As Object Dim printerList() As String Dim i As Long, choice As Long Dim defaultPrinter As String Set WshNetwork = CreateObject("WScript.Network") Set oPrinters = WshNetwork.EnumPrinterConnections defaultPrinter = WshNetwork.GetDefaultPrinter() ' 准备打印机列表数组 ReDim printerList(oPrinters.Count / 2 - 1) For i = 0 To oPrinters.Count - 1 Step 2 printerList(i / 2) = oPrinters(i + 1) & " (" & oPrinters(i) & ")" If oPrinters(i + 1) = defaultPrinter Then printerList(i / 2) = printerList(i / 2) & " [默认]" End If Next i ' 显示选择对话框 choice = Application.InputBox( _ Prompt:="请选择要使用的打印机:" & vbCrLf & vbCrLf & Join(printerList, vbCrLf), _ Title:="打印机选择器", _ Type:=1) ' 类型1表示数字输入 If choice > 0 And choice <= UBound(printerList) + 1 Then Application.ActivePrinter = printerList(choice - 1) MsgBox "已设置为使用:" & printerList(choice - 1), vbInformation Else MsgBox "选择已取消或无效", vbExclamation End If End Sub

3.2 按条件自动选择打印机

结合工作场景实现智能切换,例如根据文档类型选择打印机:

Sub AutoSelectPrinterByContent() Dim currentSheet As Worksheet Dim colorPages As Integer Dim isFinancialReport As Boolean Dim desiredPrinter As String Set currentSheet = ActiveSheet ' 分析文档特征(简化示例) colorPages = Application.CountIf(currentSheet.UsedRange, "<>""""") ' 简单页数估算 isFinancialReport = InStr(1, currentSheet.Name, "财务报表") > 0 ' 根据规则选择打印机 If isFinancialReport Then desiredPrinter = "财务专用打印机" ElseIf colorPages > 10 Then desiredPrinter = "彩色高速打印机" Else desiredPrinter = "默认黑白打印机" End If ' 尝试设置打印机 On Error Resume Next Application.ActivePrinter = desiredPrinter If Err.Number = 0 Then Debug.Print "已自动选择打印机:" & desiredPrinter Else Debug.Print "指定的打印机不可用,保持当前设置" Err.Clear End If On Error GoTo 0 End Sub

3.3 打印机状态监控与预警

通过定期检查确保关键打印机可用:

Sub CheckPrinterAvailability() Dim criticalPrinters As Variant Dim printer As Variant Dim WshNetwork As Object Dim oPrinters As Object Dim printerExists As Boolean Dim msg As String ' 定义需要监控的关键打印机列表 criticalPrinters = Array("财务专用打印机", "合同专用打印机", "彩色打印机") Set WshNetwork = CreateObject("WScript.Network") Set oPrinters = WshNetwork.EnumPrinterConnections msg = "打印机状态检查报告:" & vbCrLf & vbCrLf For Each printer In criticalPrinters printerExists = False ' 检查打印机是否存在 For i = 1 To oPrinters.Count - 1 Step 2 If oPrinters(i) = printer Then printerExists = True Exit For End If Next i If printerExists Then msg = msg & "✓ " & printer & " 可用" & vbCrLf Else msg = msg & "✗ " & printer & " 未连接!请检查网络或配置" & vbCrLf End If Next printer ' 添加默认打印机信息 msg = msg & vbCrLf & "当前默认打印机: " & WshNetwork.GetDefaultPrinter() ' 发送邮件提醒(可选) If InStr(msg, "✗") > 0 Then SendAlertEmail "打印机异常警报", msg End If ' 显示结果 MsgBox msg, vbInformation, "打印机状态检查" End Sub Private Sub SendAlertEmail(subject As String, body As String) ' 实际项目中实现邮件发送逻辑 Debug.Print "模拟发送警报邮件:" & vbCrLf & subject & vbCrLf & body End Sub

4. 企业级打印解决方案设计

4.1 集中式打印配置管理

对于大型组织,可以建立中央控制的打印配置系统:

Sub ApplyDepartmentPrinterSettings() Dim userDepartment As String Dim settingsSheet As Worksheet Dim settingRange As Range Dim foundSetting As Range ' 获取用户部门信息(实际项目中可能从AD或其他系统获取) userDepartment = GetUserDepartment() ' 从配置表读取设置 Set settingsSheet = ThisWorkbook.Sheets("打印配置") Set settingRange = settingsSheet.Range("A2:D100") ' 假设配置存储在A:D列 ' 查找匹配的部门设置 Set foundSetting = settingRange.Find(What:=userDepartment, LookIn:=xlValues) If Not foundSetting Is Nothing Then ' 应用打印机设置 On Error Resume Next Application.ActivePrinter = foundSetting.Offset(0, 1).Value ' B列为打印机名称 If Err.Number = 0 Then ' 设置打印参数 With ActiveSheet.PageSetup .Orientation = IIf(foundSetting.Offset(0, 2).Value = "横向", xlLandscape, xlPortrait) .Zoom = foundSetting.Offset(0, 3).Value End With MsgBox "已应用" & userDepartment & "部门打印设置", vbInformation Else MsgBox "指定的打印机不可用", vbExclamation Err.Clear End If On Error GoTo 0 Else MsgBox "未找到" & userDepartment & "部门的打印配置", vbExclamation End If End Sub Private Function GetUserDepartment() As String ' 简化示例 - 实际项目中可能从AD或其他系统获取 GetUserDepartment = "财务部" ' 模拟返回值 End Function

4.2 打印任务队列管理系统

对于高频打印环境,可以实现任务队列控制:

Sub PrintQueueManager() Dim printQueue As Collection Dim queueItem As Variant Dim printSettings As Variant Dim startTime As Double ' 初始化打印队列 Set printQueue = New Collection ' 添加打印任务到队列(实际项目中可能从数据库或其他来源加载) printQueue.Add Array("销售报表.xlsx", "Sales!A1:G20", "销售部打印机", 2) ' 文件名, 范围, 打印机, 份数 printQueue.Add Array("库存报告.xlsx", "Inventory!A1:D30", "仓库打印机", 1) ' 处理队列 startTime = Timer For Each queueItem In printQueue printSettings = queueItem ' 打开文档(简化示例,实际项目中使用Workbooks.Open) Debug.Print "正在打印: " & printSettings(0) ' 设置打印机 On Error Resume Next Application.ActivePrinter = printSettings(2) & " 在 Ne00:" If Err.Number <> 0 Then Debug.Print " 错误: 打印机" & printSettings(2) & "不可用" Err.Clear GoTo NextItem End If On Error GoTo 0 ' 模拟打印(实际项目中使用Worksheet.PrintOut) Debug.Print " 使用打印机: " & Application.ActivePrinter Debug.Print " 打印范围: " & printSettings(1) Debug.Print " 份数: " & printSettings(3) Debug.Print " 任务完成" NextItem: Next queueItem Debug.Print "所有打印任务完成,耗时 " & Format(Timer - startTime, "0.00") & " 秒" End Sub

4.3 打印审计与成本控制

实现打印记录跟踪,用于资源管理和成本核算:

Sub TrackPrintJob(documentName As String, pages As Integer, printerName As String) Dim logSheet As Worksheet Dim newRow As Long ' 获取或创建日志工作表 On Error Resume Next Set logSheet = ThisWorkbook.Sheets("打印日志") On Error GoTo 0 If logSheet Is Nothing Then Set logSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) logSheet.Name = "打印日志" ' 设置表头 logSheet.Range("A1:E1") = Array("时间戳", "文档名称", "页数", "打印机", "用户名") End If ' 添加新记录 newRow = logSheet.Cells(logSheet.Rows.Count, 1).End(xlUp).Row + 1 logSheet.Cells(newRow, 1) = Now logSheet.Cells(newRow, 2) = documentName logSheet.Cells(newRow, 3) = pages logSheet.Cells(newRow, 4) = printerName logSheet.Cells(newRow, 5) = Environ("USERNAME") ' 自动保存日志(可选) ThisWorkbook.Save End Sub ' 示例调用(通常在打印前后执行) Sub PrintWithTracking() Dim docName As String Dim pageCount As Integer docName = "2023年度财务报告" pageCount = 45 ' 记录打印前 TrackPrintJob docName, pageCount, Application.ActivePrinter ' 执行打印(此处为模拟) Debug.Print "正在打印 " & docName ' 可以添加实际打印代码 ' ActiveSheet.PrintOut ' 记录打印完成 TrackPrintJob docName & " (完成)", pageCount, Application.ActivePrinter End Sub
http://www.jsqmd.com/news/736954/

相关文章:

  • 探索小红书内容宇宙:5个颠覆性方法深度挖掘数据价值
  • 机器学习在气泡检测与流场分析中的应用与优化
  • Degrees of Lewdity中文汉化终极指南:从零开始轻松体验完整游戏
  • NHSE:动物森友会存档编辑器的3大核心功能与5步快速上手指南
  • 告别Element UI?手把手教你用LayUI快速搭建一个后台管理系统界面
  • 如何轻松抓取网页视频资源:猫抓浏览器扩展终极指南
  • MCP协议与AI代理工具生态的演进与实践
  • 【卷卷观察】Claude Code 封杀 OpenClaw?1209分热帖背后的开发者权益之争
  • 开源RAG助手HuixiangDou:群聊场景下的智能文档问答部署与优化
  • GPTs提示词泄露项目解析:逆向学习AI智能体设计的最佳实践
  • 大模型推理安全防护:PART方法与动态指纹技术解析
  • 大语言模型内容修复技术:RGSO原理与实践
  • Windows多用户远程桌面终极解决方案:RDPWrap完全破解指南
  • 零样本抓取实战:从仿真优化到机器人部署的完整指南
  • SP Flash Tool救砖红米Note 11 4G实录:搞定NV数据损坏与IMEI修复
  • VSCode多智能体协同编程落地手册(2026正式版API深度解析):覆盖Agent注册/通信/权限/状态同步全链路
  • AD23四层板实战:从叠层到规则,手把手搞定STM32F407核心板PCB设计
  • 3步解决Dell G15笔记本过热问题:开源温度控制中心完全指南
  • G-Helper终极指南:华硕笔记本性能优化与色彩配置文件完全恢复方案
  • 如何用Boss批量投递工具实现每日50+高质量职位投递?终极求职效率指南
  • Hyperf的生命周期的庖丁解牛
  • 3步搞定碧蓝航线自动化:Alas脚本零基础快速上手指南
  • ESP ZeroCode:零代码生成ESP32 Matter认证固件方案
  • 突破数据墙
  • 【卷卷观察】AI 供应链安全危机:PyTorch Lightning 被植入“沙丘“恶意代码
  • 在SpringBoot项目中配置Taotoken作为AI能力供应商
  • Windows凭证安全攻防:从LSASS内存提取到横向移动实战解析
  • 高分辨率视频生成的混合注意力机制与优化实践
  • 多显示器鼠标优化:如何让4K与1080p屏幕间鼠标移动不再跳跃
  • qmcdump终极指南:一键解锁QQ音乐加密文件,实现跨平台音乐自由