用户窗体组合框未填充外部数据范围
Userform Comboboxes not populating with external data range
我有一个带有 2 个组合框的用户窗体,应该从外部工作簿获取数据范围。
我正在使用 F8 单步执行代码以查看过程,一切运行无误,但当用户表单显示时组合框为空。
当我在 Watch window 中检查时,命名范围已设置并有效。
当我将命名范围设置为组合框时,我不确定 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
FrmVendor_Initialize()
sub 由设置标签之前的行 With New FrmVendor
触发。将代码移动到一个新的 sub
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
我有一个带有 2 个组合框的用户窗体,应该从外部工作簿获取数据范围。 我正在使用 F8 单步执行代码以查看过程,一切运行无误,但当用户表单显示时组合框为空。
当我在 Watch window 中检查时,命名范围已设置并有效。 当我将命名范围设置为组合框时,我不确定 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
FrmVendor_Initialize()
sub 由设置标签之前的行 With New FrmVendor
触发。将代码移动到一个新的 sub
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