【问题标题】:How to pass reference to combobox?如何传递对组合框的引用?
【发布时间】:2016-07-12 13:20:45
【问题描述】:

这是我之前的帖子的延续:How to select a printer for entire job?,我基本上想从我的 Access 数据库中的表单打印一系列报告。

参考此帮助文档:https://msdn.microsoft.com/en-us/library/ee336132(v=office.12).aspx

我正在尝试创建包含活动打印机的组合框,以便临时更改一系列文档的默认打印机。我被它所说的“传递对 ComboBox 控件的引用”的地方绊倒了......如何实现这一点?

这是我到目前为止的代码,其中cboPrinterSelect 是组合框名称:

Private Sub cboPrinterSelect_Load(Cancel As Integer)
    Call GetPrinterList
    ' I'm not sure about this next part either'
    cboPrinterSelect.Value = GetPrinterList.value
End Sub

'***************************************************
Private Sub cboPrinterSelect_AfterUpdate(Cancel As Integer)
    Set Application.Printer = Application.Printers(cboPrinterSelect.ListIndex)
End Sub
'***************************************************

Private Sub GetPrinterList(ctl As Control)
    Dim prt As Printer
    For Each prt In Printers
        ctl.AddItem prt.DeviceName
    Next prt
    ctl = Application.Printer.DeviceName    
End Sub

任何帮助/建议将不胜感激。

编辑:

这是我更新的代码,但仍然抛出错误(在 Andre 的 cmets 中有描述):

Private Sub Form_Load()
    Call GetPrinterList(Me.cboPrinterSelect)
End Sub

'*********************************************************

Private Sub cboPrinterSelect_AfterUpdate(Cancel As Integer)

Set Application.Printer = Application.Printers(cboPrinterSelect.ListIndex)

End Sub

'***************************************************************

Private Sub GetPrinterList(ctl As Control)

Dim prt As Printer
For Each prt In Printers
    ctl.AddItem prt.DeviceName
Next prt
ctl = Application.Printer.DeviceName

End Sub

【问题讨论】:

  • cboPrinterSelect 这也是表单的名称吗?
  • 您拥有Private Sub GetPrinterList(ctl As Control),但在调用Call GetPrinterList 时并未将控件传递给它。您需要添加Call GetPrinterList(your_control_name)
  • 表单名称为“_Print Series”,cboPrinterSelect 只是组合框名称。 @ShaiRado,你能发布一个例子来说明你的意思吗?
  • Private Sub cboPrinterSelect_Load(Cancel As Integer) 那么这段代码应该在表单中加载吗?并且您没有 arg 并且 ctl 不是可选的,因此需要一个。
  • 你可能是对的,但我不知道还能把它放在哪里......也许是更新后而不是加载?正如我所说,我正在尝试按照msdn.microsoft.com/en-us/library/ee336132(v=office.12).aspx 此处的指示进行操作,并且感到困惑

标签: ms-access printing combobox vba


【解决方案1】:

第一部分,GetPrinterList()的调用,必须进入formOn Load事件。

Private Sub Form_Load()
    Call GetPrinterList(Me.cboPrinterSelect)
End Sub

应该就这些了。

默认打印机由这一行预先选择:

ctl = Application.Printer.DeviceName

并确保 cboPrinterSelect 的 RowSourceType 为 Value List

【讨论】:

  • 每当我打开表单时,我都会不断收到错误消息“过程声明与具有相同名称的事件或过程的描述不匹配”。
  • 删除你的cboPrinterSelect_Load()。如果这没有帮助,请使用您当前的代码更新您的问题。
  • _AfterUpdate() 不能有 Cancel 参数,所以删除它。您永远不应该修改事件的子声明,它们必须具有代码生成器创建它们的形式。
  • 太棒了,错误消失了!现在所有打印机都显示出来了,但是它不允许我选择我想要使用的打印机(当我点击它时,默认打印机仍然突出显示)。我假设我必须以某种方式编辑ctl = Application.Printer.DeviceName 行...
  • 不,该行只是一个初始选择(但您可以将其注释掉以进行测试)。也许你的组合框被锁定了?
【解决方案2】:

试试下面的代码,它会在你的 User_Form 的 combo_box 中显示所有连接的打印机。

Public Sub GetPrinters()

    ' Use a large array (supports up to 100 printers).
    ReDim result(100) As String
    Dim wshNetwork, allPrinters As Object

    ' Get the network object
    Set wshNetwork = CreateObject("WScript.Network")
    Set allPrinters = wshNetwork.EnumPrinterConnections

    ' Printers collection has two elements for each printer.
    For i = 0 To allPrinters.Count - 1 Step 2
        Print_Series.cboPrinterSelect.AddItem allPrinters.Item(i + 1)
    Next

    ' call your user form and combo box will have all active printers
    Print_Series.Show

End Sub

【讨论】:

  • 这是我应该需要的,还是我需要保存我已经拥有的部分代码?
  • @cdomination 你跑了吗?你把所有的打印机都放在你的组合框中了吗?我在代码中使用了你的变量名
  • 这是一个访问表单,而不是用户表单。 Access 有Application.Printers 集合,无需重新创建。
  • 如果你想在 Andre 的帖子下加入聊天,也许你可以帮助解决我的奇怪问题
猜你喜欢
  • 2017-08-08
  • 2017-10-20
  • 1970-01-01
  • 2016-06-06
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多