Answers:
我认为避免这种情况的唯一方法是使用不是远程的默认打印机。这是一个简单的JScript,它将默认打印机设置为“Microsoft XPS Document Writer”(假设您安装了它),它始终是本地的非硬件打印机。
var network = new ActiveXObject("WScript.Network");
network.SetDefaultPrinter("Microsoft XPS Document Writer");
保存为SetDefaultPrinter.js
,您可以使用命令行运行它:
cscript //nologo SetDefaultPrinter.js
...或者您可以将其保存到桌面并双击以运行它。
将默认打印机更改为本地定义的打印机可能会有所帮助。
应用程序在更改字体样式时与打印机交互没有明显的(至少是合理的)理由,但如果发生这种情况,则至少本地打印机不会跨越未连接的网络。
您可以ThisWorkbook/ThisDocument
在personal.xls / normal.dot 的模块中添加一个过程,该过程将检测您是否在家并正确设置打印机默认值。
我没有对此进行测试,但USERDOMAIN
(索引30)应该适用于此目的。以下代码应该让您大致了解执行此操作所需的内容。
Sub checkDomain()
Dim desiredPrinter As String
If Environ(30) = "USERDOMAIN=YOURWORKDOMAIN" Then
'Set work default printer
desiredPrinter = "\\NetworkAddress\Work Printer on Ne04:"
Else
'Set home default printer
desiredPrinter = "Microsoft XPS Document Writer on Ne01:"
End If
If Not Application.ActivePrinter = desiredPrinter Then
Application.ActivePrinter = desiredPrinter
End If
End Sub
请注意,您的PC上的端口可能会有所不同,您可以运行以下代码来检查VBA认为您的打印机被调用的内容。
Sub PrinterList()
Dim objWMIService
Dim colInstalledPrinters
Dim objPrinter
Dim strPrinterName As String
Dim strComputer As String
strPrinterName = Application.ActivePrinter
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery("Select * from Win32_Printer ")
For Each objPrinter In colInstalledPrinters
If objPrinter.PrinterStatus = 1 Or objPrinter.PrinterStatus = 2 Or objPrinter.PrinterStatus = 7 Then
Debug.Print "offline:" & objPrinter.Name
Else
If InStr(strPrinterName, objPrinter.Name) Then
Debug.Print objPrinter.Name & "*"
Else
Debug.Print objPrinter.Name
End If
End If
Next
End Sub
这将在Visual Basic编辑器的立即窗口中列出所有已安装的打印机名称(如果您不熟悉VBA,则为立即窗口的CTRL + G)
虽然您可以在Excel 2007中检查ActivePrinter属性,但由于某种原因(即使您可以在Word VBA脚本中)也无法设置它。以下是Excel VBA中的解决方法:
Set oWord = CreateObject(Class:="Word.Application")
oWord.ActivePrinter = NewDefaultPrinter$
oWord.Quit False
Set oWord = Nothing
如果默认打印机当前设置为网络打印机,则更改默认打印机特别有用,因为如果VBA宏修改工作簿(删除列等)会出现延迟 - 它似乎在每次更改时检查打印机。为防止这种情况,需要在工作簿修改过程中将默认打印机设置为本地打印机,然后再重新打印。
另一种解决方案是简单地禁用慢速选项卡上的分页符显示。你可以在这里看到一个例子:http://blogs.mccombs.utexas.edu/the-most/2010/02/17/hidepagebreaks/
打印通信通常是因为Excel试图不断地重新分页,这是昂贵的,而且通常是不必要的。通过简单地禁用该选项,我已经看到了良好的性能改进。