[英]How to use the Userform Global Variable value in different Workbook using VBA
[英]Call Userform and use range from different workbook
我试图让用户窗体上的命令框填充从不同工作簿调用的命名范围。 我有一个调用不同子程序和用户表单代码的主子程序。(代码如下)
目前,用户窗体加载但组合框是空的。 我认为问题在于调用主 Sub然后初始化 userform 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()
子项中同时具有myRangeNameVendor
和myRangeNameVendorCode
"visibile":yuy 可以将它们声明为String
类型的Public
constant
,并在您的整个项目中使用它们
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 答案的组合解决了。
链接:用户表单组合框未填充外部数据范围
需要更改的主要代码
.tag 代码通常可以工作,但给我带来了问题,因此必须将其更改为以下内容(上面提供的链接中的完整答案和描述,@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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.