调用用户表单并使用来自不同工作簿的范围
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
Address
es 而不是纯 Range
s(顺便说一句,那些 Range
s 永远不会设置)
编辑:
确保你的 Main Macro()
sub 中同时包含 myRangeNameVendor
和 myRangeNameVendorCode
"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
我试图让用户窗体上的命令框填充从不同工作簿调用的命名范围。我有一个主子调用不同的子和用户窗体代码。(代码如下)
目前,用户窗体正在加载,但组合框是空的。 我认为问题在于调用 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
Address
es 而不是纯 Range
s(顺便说一句,那些 Range
s 永远不会设置)
编辑:
确保你的 Main Macro()
sub 中同时包含 myRangeNameVendor
和 myRangeNameVendorCode
"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