【问题标题】:VBA excel printing to printer with user formVBA excel打印到带有用户表单的打印机
【发布时间】:2017-03-12 02:50:33
【问题描述】:

我有一个用户表单,填写后,底部有一个命令按钮。单击按钮时,它将数据复制到工作表2,然后将行信息复制到工作表4,这是一个表单,关闭用户表单。打开欢迎用户表单,然后我希望它打印工作表4。

这是我的代码。打印功能将不起作用。

Private Sub SavePrintButton_Click()

EditAdd

Sheet4.Activate
Dim myValue As Variant
myValue = TextBox1.Value
Range("b2").Value = myValue

Unload Me

Function PrintOneSheet()
      Sheets("Sheet4").PrintOut 
End Function

WelcomeUserForm.Show



End Sub

【问题讨论】:

  • 删除Unload Me。之后的任何事情都无法实现。另外...您不能在Sub 中包含Function。您显示的代码甚至不会编译,更不用说运行了。
  • Unload Me 的说法不正确。其他几个领域有许多代码行,之后可以正常工作。如果我可以在 sub 中有一个函数,我将如何编辑它以使我想要完成的工作?
  • Unload Me 卸载当前实例。您正在使用它,就好像它是Me.Hide,但不仅如此,而且您正在滥用它。我的代码可以编译,你的不行。接受你得到的建议。此外,您不应该使用默认的表单实例,它会在一天或一天​​之后咬到您。
  • 仅仅因为您设法让卸载实例在代码中的其他地方“工作”并不意味着这是一个好主意。想一想你在那里做什么。你告诉运行时它应该卸载对象然后有更多的代码。使用这样的表单的默认实例可以创建各种狡猾的行为。像对待任何其他类一样对待它们——使用对对象实例的硬引用。如果你在Terminate 处理程序中加入一些Debug.Print 语句,我猜你会对卸载顺序感到惊讶......
  • OP,Unload Me 是您应该在表单中执行的最后一行正常代码(某些表单具有在例如卸载表单时调用的过程;但您的显然没有)。 Unload Me 不是“这里有一周的通知”,它相当于把你的东西收拾好,然后被带出办公室。在下面的回答中,我只是调整了您的代码,以便它或多或少地工作。我没有神奇地将它转换成好的代码。

标签: vba excel printing


【解决方案1】:

您的“PrintOneSheet”函数嵌入在 SavePrintButton_Click 中。将“end sub”移到“unload me”之后,并在“unload me”上方插入“call PrintOneSheet”。我冒昧地添加了“Me.Hide”行,因为您显然希望当前表单在显示 WelcomeUserForm 之前消失。一旦不需要,它仍然会被卸载。同时,如果您出于任何原因想要返回以更正某些内容,只需再次显示即可。

Private Sub SavePrintButton_Click()
    Dim myValue As Variant

    EditAdd

    Sheet4.Activate
    myValue = TextBox1.Value
    Sheet4.Range("b2").Value = myValue

    Call PrintOneSheet
    Me.Hide
    WelcomeUserForm.Show
    Unload Me
End Sub

Function PrintOneSheet()
    Sheets("Sheet4").PrintOut
End Function

另一方面,Sheet4 是否总是被称为“Sheet4”? Sheet4 是对对象 id 的直接调用,“Sheet4”是对其属性之一(其名称)的调用。你应该在你的参考中保持一致,否则有一天你会改变一些看似很小的东西,混乱就会爆发。

【讨论】:

  • 赞成,除非卸载一个持有对另一个 (WelcomeUserForm) 引用的对象 (Me) 存在严重错误......虽然是的,它是默认实例,所以它存在于全局范围...天哪,这太错误了...我会让负责显示此表单的人负责在此表单关闭时显示WelcomeUserForm 的新实例。如果调用者正在创建表单的实际实例,则无需Unload。在很多方面,使用默认实例都是错误且容易出错的。
  • 为什么PrintOneSheetFunction?它不返回任何内容(隐含的Empty 除外),如果确实如此,您将使用Call PrintOneSheet 显式丢弃返回值。
  • 我试过你的实例,最后卸载我,welcomeuserfrom 没有出现。SaveButton_CLick() 是不同用户表单中的保存按钮。想法是,当单击它时,表单会添加/编辑 sheet2 中的数据,激活 sheet4 并相应地填充单元格,打印 sheet4,关闭当前用户表单(卸载我)并打开 WelcomeUserForm。我只是在卸载之前添加了 sheet4.printout 并且它起作用了,然后是welcomeuserform.show。
  • 所以我的问题是,如果我想关闭当前的用户窗体并加载另一个,我会用什么来代替卸载我?
  • OP,您的原始代码无法编译。我将它粘贴到用户窗体中,添加了 TextBox1 和 SaveprintButton。我展示了它,当我单击 SaveprintButton 时收到一条错误消息“编译错误:预期的结束子”,因为您的代码中嵌入了一个函数。所以我把它拔了出来。现在您已经测试了新代码并且您知道您不需要该函数,因为 sheet4.printout 可以完成这项工作。恭喜!现在阅读@Mat's Mug 告诉你的内容。另外,this
【解决方案2】:

我对代码做了一些修改。这看起来更像是应该的吗?我摆脱了 vba 中的所有 unload.me。

Private Sub SavePrintButton_Click()

EditAdd

Sheet6.Activate
Dim myValue As Variant
myValue = TextBox1.Value
Range("b2").Value = myValue

ClearForm
Me.Hide

Sheet6.PrintOut

WelcomeUserForm.Show

MsgBox "New Run Added"

MsgBox "Run Sent to Printer"

End Sub

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多