调用用户表单并使用来自不同工作簿的范围

Call Userform and use range from different workbook

我试图让用户窗体上的命令框填充从不同工作簿调用的命名范围。我有一个主子调用不同的子和用户窗体代码。(代码如下)

目前,用户窗体正在加载,但组合框是空的。 我认为问题在于调用 main Sub 然后 初始化用户窗体 sub.

    Load FrmVendor
    FrmVendor.Show
Private Sub FrmVendor_Initialize(myNamedRangeDynamicVendorName As Range, myNamedRangeDynamicVendorCode As Range)

'add column of data from spreadsheet to userform ComboBox
    cboxVendorName.RowSource = myNamedRangeDynamicVendorName.Address(external:=True)
    cboxVendorCode.RowSource= myNamedRangeDynamicVendorCode.Address(external:=True)
    cboxVendorCode.ColumnCount = 2

这是代码的一部分,用于显示我从何处获取命名范围、所有用户窗体设置以及调用用户窗体的主宏部分。

Option Explicit
Private m_Cancelled As Boolean


Sub NamedRanges(wb As Workbook, wSh As Worksheet)
    Dim myNamedRangeDynamicVendor As Range
    Dim myNamedRangeDynamicVendorCode As Range

'declare variable to hold defined name
    Dim myRangeNameVendor As String
    Dim myRangeNameVendorCode As String

'specify defined name
    myRangeNameVendor = "namedRangeDynamicVendor"
    myRangeNameVendorCode = "namedRangeDynamicVendorCode"

'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

 'Vendor Code range
    With wSh.Cells

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

    End With

'create named ranges
    ThisWorkbook.Names.Add Name:=myRangeNameVendor, RefersTo:=myNamedRangeDynamicVendor
    ThisWorkbook.Names.Add Name:=myRangeNameVendorCode, RefersTo:=myNamedRangeDynamicVendorCode
End sub



' Returns the cancelled value to the calling procedure
Public Property Get Cancelled() As Boolean
    Cancelled = m_Cancelled
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(myNamedRangeDynamicVendorName As Range, myNamedRangeDynamicVendorCode As Range)

'add column of data from spreadsheet to userform ComboBox
    cboxVendorName.RowSource = myNamedRangeDynamicVendorName.Address(external:=True)
    cboxVendorCode.RowSource= myNamedRangeDynamicVendorCode.Address(external:=True)
    cboxVendorCode.ColumnCount = 2

End Sub


Sub Main Macro
'
'
'
    Call NamedRanges(wb, wSh)

    ' Display the UserForm
    Load FrmVendor
    FrmVendor.Show


    ' Clean up
    Unload FrmVendor
    Set FrmVendor = Nothing

如有任何帮助,我们将不胜感激!

改变 :

Load FrmVendor
FrmVendor.Show

至:

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

并且您无法更改 Initialize 事件的签名 不带参数

Private Sub FrmVendor_Initialize()

    'add column of data from spreadsheet to 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

你应该修改:

ThisWorkbook.Names.Add Name:=myRangeNameVendor, RefersTo:=myNamedRangeDynamicVendor
ThisWorkbook.Names.Add Name:=myRangeNameVendorCode, RefersTo:=myNamedRangeDynamicVendorCode

为了使用 Range Addresses 而不是纯 Ranges(顺便说一句,那些 Ranges 永远不会设置)

编辑:

确保你的 Main Macro() sub 中同时包含 myRangeNameVendormyRangeNameVendorCode "visibile":yuy 可以将它们声明为 Public constant String 类型的 s,并在您的整个项目中使用它们

Public Const myRangeNameVendor As String = "namedRangeDynamicVendor"
Public Const myRangeNameVendorCode As String = "namedRangeDynamicVendorCode"

Sub Main Macro
'
'
'
    Call NamedRanges(wb, wSh)

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

   ...

因此 NamedRanges 将是:

Sub NamedRanges(wb As Workbook, wSh As Worksheet)
    Dim myNamedRangeDynamicVendor As Range
    Dim myNamedRangeDynamicVendorCode As Range


    'Vendor Name range
    With wSh.Cells

        ...

在上面@HTH 回答的帮助下更改范围名称,我在填充组合框时仍然遇到问题。从我发布的另一个线程中,问题已通过@HTH 和@CDP1802 答案的组合解决。

Link:

需要更改的主要代码

  • 将所有用户窗体子程序和过程移至用户窗体代码
  • 删除了初始化代码
  • 根据上面的@HTH 回答调整了命名范围
  • 更改了用于设置组合框地址的 .tag 代码

.tag 代码通常可以工作,但给我带来了问题,所以不得不将其更改为以下内容(上面提供的 link 中的完整答案和描述,由@CDP1802 回答)

    ' Display the UserForm
With New FrmVendor
    .cboxVendorName.RowSource = wb.Names(myRangeNameVendor).RefersToRange.Address(external:=True)
    .cboxVendorCode.RowSource = wb.Names(myRangeNameVendorCode).RefersToRange.Address(external:=True)
    .Show
    VendorName = .cboxVendorName.Value
    VendorCode = .cboxVendorCode.Value
End With