2017-05-25 59 views
0

因此,基本上我使用vba从ms访问表生成一个word文档,然后打印它。
代码如下:VBA - 使用标准而不是即时打印来打印word文档与打印输出

With rs 
    'ensure the recordset is populated 
    If Not .BOF And Not .EOF Then 

     Set objWord = CreateObject("Word.Application") 
     'objWord.Visible = True 
     Set doc = objWord.Documents.Add 
     doc.SaveAs CurrentProject.Path & "\report.doc" 

     'not necessary but good abtitude 
     .MoveLast 
     .MoveFirst 

     While (Not .EOF) 
      If Not IsNull(.Fields("REGIONE SOCIALE")) Then 
       regioneSociale = .Fields("REGIONE SOCIALE").Value 
       regioneSociale = UCase(regioneSociale) 
      End If 
      If Not IsNull(.Fields("INDIRIZZO")) Then 
       INDIRIZZO = .Fields("INDIRIZZO").Value 
      End If 
      If Not IsNull(.Fields("CAP")) Then 
       CAP = .Fields("CAP").Value 
      End If 
      If Not IsNull(.Fields("LOCALITÀ")) Then 
       LOCALITA = .Fields("LOCALITÀ").Value 
      End If 
      If Not IsNull(.Fields("CODICE FISCALE")) Then 
       codFiscale = .Fields("CODICE FISCALE").Value 
      End If 
      If Not IsNull(.Fields("CODICE STALLA")) Then 
       codStalla = .Fields("CODICE STALLA").Value 
      End If 
      If Not IsNull(.Fields("NOTE")) Then 
       NOTE = .Fields("NOTE").Value 
      End If 
      'Debug.Print regioneSociale & CAP & LOCALITA & codFiscale & codStalla & NOTE 
      objWord.Selection.Font.Bold = True 
      objWord.Selection.Font.Underline = True 
      objWord.Selection.TypeText regioneSociale 
      objWord.Selection.Font.Bold = False 
      objWord.Selection.TypeParagraph 

      objWord.Selection.Font.Italic = True 
      objWord.Selection.TypeText "INDIRIZZO:" 
      objWord.Selection.Font.Underline = False 
      objWord.Selection.Font.Italic = False 
      objWord.Selection.TypeText " " & INDIRIZZO 
      objWord.Selection.TypeParagraph 

      objWord.Selection.Font.Underline = True 
      objWord.Selection.Font.Italic = True 
      objWord.Selection.TypeText "LOCALITÀ:" 
      objWord.Selection.Font.Underline = False 
      objWord.Selection.Font.Italic = False 
      objWord.Selection.TypeText " " & CAP & " " & LOCALITA 
      objWord.Selection.TypeParagraph 

      objWord.Selection.Font.Underline = True 
      objWord.Selection.Font.Italic = True 
      objWord.Selection.TypeText "CODICE FISCALE:" 
      objWord.Selection.Font.Underline = False 
      objWord.Selection.Font.Italic = False 
      objWord.Selection.TypeText " " & codFiscale 
      objWord.Selection.TypeParagraph 

      objWord.Selection.Font.Underline = True 
      objWord.Selection.Font.Italic = True 
      objWord.Selection.TypeText "CODICE STALLA:" 
      objWord.Selection.Font.Underline = False 
      objWord.Selection.Font.Italic = False 
      objWord.Selection.TypeText " " & codStalla 
      objWord.Selection.TypeParagraph 

      objWord.Selection.Font.Underline = True 
      objWord.Selection.Font.Italic = True 
      objWord.Selection.TypeText "NOTE:" 
      objWord.Selection.Font.Underline = False 
      objWord.Selection.Font.Italic = False 
      objWord.Selection.TypeText " " & NOTE 
      objWord.Selection.TypeParagraph 

      objWord.Selection.TypeParagraph 
      .MoveNext 
     Wend 
    Else 
     MsgBox "No record selected/empty table" 
     Exit Sub 
    End If 
    .Close 
End With 

doc.Save 
'this instruction gives immediate printing instead of the standard one... 
doc.PrintOut , , , CurrentProject.Path & "\report.doc", , , , , , , True 
doc.Close 

事实是,其实我想给用户在打印前更改打印机或任何其他选项的可能性。

我说的是给他这种观点enter image description here

打印之前,而不是立即打印文档。

vba有可能吗?代码

片段,我用的@Sergey建议:

End With 
objWord.Dialogs(wdDialogFilePrint).Show 
doc.Save 
doc.Close 

回答

1

您可以使用

doc.Activate 'just to make sure that user didn't select other document while generating 
objWord.Dialogs(wdDialogFilePrint).Show 

代替doc.PrintOut

另外,作为一个小的代码优化我会建议删除所有If-s用于字段数据并修改字的相关部分,如下所示:

 With objWord.Selection 
      .Font.Bold = True 
      .Font.Underline = True 
      .TypeText UCase(Nz(rs![REGIONE SOCIALE].Value, "")) 
      .Font.Bold = False 
      .TypeParagraph 

      .Font.Italic = True 
      .TypeText "INDIRIZZO:" 
      .Font.Underline = False 
      .Font.Italic = False 
      .TypeText " " & Nz(rs!INDIRIZZO.Value, "") 
      .TypeParagraph 

      ............. 
     End With 
+0

感谢您的建议。然而,'objWord.Dialogs(wdDialogFilePrint).Show'会使Access冻结(代码保持执行状态),并且只有在流程管理器终止它之后,它才会显示打印对话窗口......有些东西不能按预期工作 – UrbiJr

+0

它适合我。确保所有Word进程在执行前都被终止。你也可以显示word窗口进行调试:'objWord.Visible = True' –

+0

哦,现在我得到了什么错误。事实是,打印对话窗口与Word应用程序有关。所以如果我以前没有打开它,它基本上等待它被打开。实际上,使用'.Visible = True'可以工作,但是它会打开一个Word窗口,我不想... – UrbiJr