【问题标题】:Userform Comboboxes not populating with external data range用户表单组合框未填充外部数据范围
【发布时间】:2020-07-19 12:33:03
【问题描述】:

我有一个带有 2 个组合框的用户窗体,它应该从外部工作簿获取数据范围。 我正在使用 F8 单步执行代码以查看该过程,一切运行都没有错误,但是当用户窗体显示时 ComboBoxes 为空。

当我在 Watch 窗口中检查命名范围时,命名范围已设置并有效。 当我将命名范围设置为组合框时,我不确定 userform_initialize 是否存在问题?

任何建议将不胜感激。

Option Explicit
Public m_Cancelled As Boolean
Public Const myRangeNameVendor As String = "myNamedRangeDynamicVendor"
Public Const myRangeNameVendorCode As String = "myNamedRangeDynamicVendorCode"
Public VendorName As String
Public VendorCode As String



Sub NamedRanges(wb As Workbook, wSh As Worksheet)

    'declare variables to hold row and column numbers that define named cell range (dynamic)
    Dim myFirstRow As Long
    Dim myLastRow As Long

    'declare object variable to hold reference to cell range
    Dim myNamedRangeDynamicVendor As Range
    Dim myNamedRangeDynamicVendorCode As Range


    'identify first row of cell range
    myFirstRow = 2


    'Vendor Name range
    With wSh.Cells

        'find last row of source data cell range
        myLastRow = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

        'specify cell range
        Set myNamedRangeDynamicVendor = .Range(.Cells(myFirstRow, "A:A"), .Cells(myLastRow, "A:A"))

    End With

    'create named range with workbook scope. Defined name is as specified. Cell range is as identified, with the last row being dynamically determined
    wb.Names.Add Name:=myRangeNameVendor, RefersTo:=myNamedRangeDynamicVendor

    'Vendor Code range
    With wSh.Cells

        'specify cell range
        Set myNamedRangeDynamicVendorCode = .Range(.Cells(myFirstRow, "B:B"), .Cells(myLastRow, "B:B"))

    End With

    'create named range with workbook scope. Defined name is as specified. Cell range is as identified, with the last row being dynamically determined
    wb.Names.Add Name:=myRangeNameVendorCode, RefersTo:=myNamedRangeDynamicVendorCode

End Sub


' Returns the textbox value to the calling procedure
Public Property Get Vendor() As String
    VendorName = cboxVendorName.Value
    VendorCode = cboxVendorCode.Value
End Property

Private Sub buttonCancel_Click()
    ' Hide the Userform and set cancelled to true
    Hide
    m_Cancelled = True
End Sub

' Hide the UserForm when the user click Ok
Private Sub buttonOk_Click()
    Hide
End Sub

' Handle user clicking on the X button
Private Sub FrmVendor_QueryClose(Cancel As Integer, CloseMode As Integer)

    ' Prevent the form being unloaded
    If CloseMode = vbFormControlMenu Then Cancel = True

    ' Hide the Userform and set cancelled to true
    Hide
    m_Cancelled = True

End Sub


Private Sub FrmVendor_Initialize()

'add column of data from spreadsheet to your userform ComboBox
With Me
    cboxVendorName.RowSource = ThisWorkbook.Names(Split(.Tag, "|")(0)).Address(external:=True)
    cboxVendorCode.RowSource = ThisWorkbook.Names(Split(.Tag, "|")(1)).Address(external:=True)

End With
cboxVendorCode.ColumnCount = 2

End Sub


Sub Macro5()

Dim wb As Workbook
Dim ws As Worksheet
Dim path As String
Dim MainWB As Workbook
Dim MasterFile As String
Dim MasterFileF As String

Set ws = Application.ActiveSheet
Set MainWB = Application.ActiveWorkbook

Application.ScreenUpdating = False

'Get folder path
path = GetFolder()

MasterFile = Dir(path & "\*Master data*.xls*")
MasterFileF = path & "\" & MasterFile

'Check if workbook open if not open it
If Not wbOpen(MasterFile, wb) Then
    Set wb = Workbooks.Open(MasterFileF, False, True)
End If


'Set Vendor Name and Code Range names
Call NamedRanges(wb, wSh)


'Select Vendor name and Vendor code with User Form and set variables

    ' Display the UserForm
With New FrmVendor
    .Tag = myRangeNameVendor & "|" & myRangeNameVendorCode
    .Show
End With

    VendorName = FrmVendor.cboxVendorName.Value
    VendorCode = FrmVendor.cboxVendorCode.Value


    ' Clean up
    Unload FrmVendor
    Set FrmVendor = Nothing

【问题讨论】:

  • 整合VendorName =...VendorCode =...的结束赋值到With New FrmVendor构造中(在.ShowEnd With之后),但简单地省略引用用户窗体的默认实例FrmVendor:例如VendorName = .cboxVendorName.Value(注意写点前缀)。因此,您正在引用当前的“新”实例,而不是在设计时可能输入的值。 - 在AddItem not populating options in combobox 找到更多解释
  • 顺便说一句,您无需进行整个清理工作,因为新用户窗体实例的生命周期会自动以End With 结束。旁注:通常对FrmVendor 的任何进一步调用都会重新激活您尝试销毁的默认实例,尽管它没有在您的情况下使用:-)
  • @T.M.我尝试将代码更改为您的第一个建议。组合框为空时,我仍然遇到同样的问题。我不确定移动这两个参数是否有助于组合框不填充范围,因为它们只是为了捕获在框中选择的选定值(当它们最终填充时)。不过,谢谢,任何其他建议都会有很大帮助。我以前从未使用过用户表单和组合框,所以在代码中苦苦挣扎。
  • 假设之前也有问题(见聊天)-tldr:-;可能下面的答案加上我的提示会帮助你:-)
  • 绝对命名约定是UserForm_Initialize(),无论表单名称是什么,即不是FrmVendor_Initialize();类似UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) :-)

标签: excel vba combobox range userform


【解决方案1】:

FrmVendor_Initialize() sub 由设置标签之前的With New FrmVendor 行触发。将代码移动到新的子目录中

Sub SetCboxRowSource()

    'add column of data from spreadsheet to your userform ComboBox
    With Me
        cboxVendorName.RowSource = ThisWorkbook.Names(Split(.Tag, "|")(0)).Address(external:=True)
        cboxVendorCode.RowSource = ThisWorkbook.Names(Split(.Tag, "|")(1)).Address(external:=True)
    End With
    cboxVendorCode.ColumnCount = 2

End Sub

标签设置后调用它

With New UserForm1
    .Tag = myRangeNameVendor & "|" & myRangeNameVendorCode
    .SetCboxRowSource
    .Show
End With

或者直接使用设置行源

 With New FrmVendor
      .cboxVendorName.RowSource = wb.Names(myRangeNameVendor).RefersToRange.Address(external:=True)
      .cboxVendorCode.RowSource = wb.Names(myRangeNameVendorCode).RefersToRange.Address(external:=True)
      .Show
   End With

【讨论】:

  • 我尝试了上面的代码,我得到的第一个错误是 .SetCboxRowSource 错误:找不到方法或数据成员。所以我用Call SetCboxRowSource 替换了它,然后它运行了,但是我在Sub SetCboxRowSource 行cboxVendorName 上得到了错误variable not defined。我的 Sub SetCboxRowSource 也有错误,With Me 错误:对 Me 的使用无效。感谢 CDP1802,有什么地方出错的建议吗?
  • @Simone 您是否将子代码放在与 FrmVendor_Initialize() 相同的位置?
  • 目前所有代码都在同一个模块中,没有一个在用户表单代码中
  • @Simone 将 SetCboxRowSource() 放入用户表单代码中,使其成为该表单上的方法。它只是替换了您在 _Initialize 中的代码。
  • 我按照您的指示更改了代码。我现在在 cboxVendorName.RowSource = ThisWorkbook.Names(Split(.Tag, "|")(0)).Address(external:=True) 行的 Sub SetCboxReowSource 中遇到错误,错误:应用程序定义或对象定义错误
猜你喜欢
  • 2016-02-29
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多