ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 13936|回复: 9

[原创] 调用和设置打印机对象的例程

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-5-7 11:12 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:WMI应用
本帖最后由 hiyou 于 2012-5-7 11:42 编辑

因为某种需要,确切来说,有朋友提出要在一个能用VBS和ACTIVE的应用程序里,通过VBS自动切换打印机(他的要求是可以用代码在界面上切换PDF打印机和"正常"的打印机)
我翻了一下,以前在这个论坛有过朋友提出怎么检查打印机状态的求助贴子,但没有完整控制打印机的例程,这次补上

代码用的是MICROSOFT的WMI服务,通过WMI取得各种WMI系统对象——这里先取得本机打印机集合,然后查找或设置某台打印机、或控制打印机;
示例只给出了怎么枚举打印机、状态(以前那个贴子也有)、查找和设置切换默认打印机的例程.
代码适用于VBS脚本和VBA,它需用到WMI服务,所以一般是XP以后系统,2000以前的不行

WMI打印机对象相关资料在这里可以查到(鸟语警告)
http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx

[code=vb]

call wmilistprint  '<==枚举本机打印机,列出状态,列出默认打印机
'
'找出单独的默认打印机
set myprinter=getDefaultPrinter
msgbox "系统当前默认的打印机是:" & myprinter.name
'
'设置默认的打印机,打印机名根据自已机上的实际情况设定
'可以从wmilistprint列出的打印机名中找
strSetPrint="adopdf"  
if  setdefaultprinter(strSetprint) then
   msgbox "设置 " & strSetprint & "为默认打印机"
else
   msgbox "设置 " & strSetprint & "为默认打印机失败"
end if


'_______________________
'返回本机打印机对象集合
Function getPrinters()
  '取得WMI服务
  Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
  '查找系统所有打印服务(这是集合)
  Set getPrinters= objWMI.ExecQuery("Select * from Win32_Printer")
End Function

'_______________________
'返回默认打印机对象
Function getDefaultPrinter()
getDefaultPrinter=""
set cols=getPrinters()
For each prnX in cols
    if prnX.Default=true then
      set getDefaultPrinter=prnX
      exit Function
    end if
Next
End Function
'_______________________
'以字符名为依据设置默认打印机
'成功返回TRUE,失败返回FALSE
Function SetDefaultPrinter(strName)
SetDefaultPrinter=FALSE
set cols=getPrinters()
For each prnX in cols
    if ucase(prnX.name)=ucase(strName) then
      prnx.SetDefaultPrinter
      SetDefaultPrinter=True
      exit Function
    end if
Next
End Function

'例子:枚举本机所有打印机
Sub WMIListPrint()
Set colPrinters = getPrinters()
   
strMsg = ""
'遍历
For Each objx In colPrinters
    strMsg = strMsg & "打印机名: " & objx.Name & ","
    'strMsg = strMsg &  objx.Location & ","
    Select Case objx.PrinterStatus
        Case 1
            strList = "其它状态"
        Case 2
            strList = "不明"
        Case 3
            strList = "等待"
        Case 4
            strList = "打印中..."
        Case 5
            strList = "开机"
    End Select
    strMsg = strMsg & "打印机状态: "
    strDefault=""
    if objx.Default=true then
      strDefault= "  -默认打印机- "
    end if
    strMsg=strMsg &  strList & strDefault & vbCrLf
Next
MsgBox strMsg
End Sub
[/code]

楼下有朋友提了运行的问题,说明一下.
代码原本作VBS脚本(也可作VBA代码使用)

不过它们有点区别,在VBA里,一定要有SUB和FUNCTION,而VBS就不用,VBS看到有代码直接往下执行,VBA只有在DEBUG框里才能这么干,要么就从某个SUB或MAIN,某个事件某个FORM开始.

而在这些代码里,第一个FUNCTION之前的几行代码都是测试和演示效果用的,所以把这些代码复制到一个文本文件里,并保存为VBS后缀,就是VBS脚本直接执行,应该OK(除了设置那个打印机一般会失败,但这不是代码的问题)

换成VBA的话,在FUNCTION之前的代码就要用SUB XXX 和END SUB框住,然后执行XXX例程测试,这一点仔细想一想大概清楚吧



参考贴,当时楼下提出WSH和WMI解决的方法,楼主想要查状态
http://club.excelhome.net/thread-555283-1-1.html

这个更早了,我只写了一个点,对大多数人双面打印不一定有用,不过多少解释了WMI的用法,还有就是对打印机的输出控制
http://club.excelhome.net/thread-305474-1-1.html



评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-5-7 11:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-5-7 11:23 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-7 11:33 | 显示全部楼层
lpzxhjp 发表于 2012-5-7 11:23
代码好像不完整???

是这样的...前面说了,作为VBS脚本和VBA代码使用,所以前面几行都是测试用的.
在VBA里,一定要有SUB和FUNCTION,VBS就不用,如果你把这些代码复制到一个文本文件里,并保存为VBS后缀直接执行,应该OK(除了设置那个打印机一般会失败,但这不是代码的问题)

换成VBA的话,下面几行就要用SUB XXX 和END SUB框住,然后执行XXX例程测试

01.
02.
03.call wmilistprint  '<==枚举本机打印机,列出状态,列出默认打印机
04.'
05.'找出单独的默认打印机
06.set myprinter=getDefaultPrinter
07.msgbox "系统当前默认的打印机是:" & myprinter.name
08.'
09.'设置默认的打印机,打印机名根据自已机上的实际情况设定
10.'可以从wmilistprint列出的打印机名中找
11.strSetPrint="adopdf"  
12.if  setdefaultprinter(strSetprint) then
13.   msgbox "设置 " & strSetprint & "为默认打印机"
14.else
15.   msgbox "设置 " & strSetprint & "为默认打印机失败"
16.end if

TA的精华主题

TA的得分主题

发表于 2012-7-24 14:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-11-27 16:06 | 显示全部楼层
本帖最后由 utterblue 于 2012-11-27 16:12 编辑

很实用的代码,配合弥补了Application.Dialogs(9).Show的不足

TA的精华主题

TA的得分主题

发表于 2012-12-28 09:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请教楼主您一个问题,请问用EXCEL的VBA

1. 遍历所有打印机名
2. 如果包含某个字符串 例如: srt="小明"
    就使用该打印机打印的代码

我不知道应该如何写呢,希望您能抽个时间指导下我,非常感谢!!

TA的精华主题

TA的得分主题

发表于 2013-2-28 13:45 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-12-26 19:39 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-9-30 09:40 | 显示全部楼层
ManualDuplexPrint  这个参数设置 是  用来 实现 双面 打印 ,还是 单面打印的吧 ?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 00:55 , Processed in 0.053101 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表