#1
|
|||
|
|||
UserForm Dropdown List Not Populating
I have a userform called "DrawingNumberEntryForm" with a ComboBox control called "DrawingNumberUf". I am trying to populate the control with a list from an Excel sheet.
Here is my code... Code:
Private Sub DrawingNumberEntryForm_Initialize() Dim varData As Variant Dim lngIndex As Long Dim oCC As ContentControl varData = LoadFromExcel_ADODB("c:\temp\ItemSheet.xlsx", "Item Sheet") Set oCC = .SelectContentControlsByTitle("DrawingNumberUf").Item(1) 'Set oCC = ActiveDocument.SelectContentControlsByTag("Tag").Item(1) With oCC For lngIndex = .DropdownListEntries.Count To 1 Step -1 .DropdownListEntries(lngIndex).Delete Next lngIndex For lngIndex = 0 To UBound(varData, 2) .DropdownListEntries.Add varData(0, lngIndex), varData(1, lngIndex) Next lngIndex End With lbl_Exit: Exit Sub End Sub Function LoadFromExcel_ADODB(ByRef strSource As String, _ strRange As String, Optional bIsSheet As Boolean = True, _ Optional bSuppressHeadingRow As Boolean = True) Dim oConn As Object Dim oRecSet As Object Dim strConnection As String Dim lngCount As Long If bIsSheet Then strRange = strRange & "$]" Else strRange = strRange & "]" End If Set oConn = CreateObject("ADODB.Connection") If bSuppressHeadingRow Then 'Suppress first row. strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strSource & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" Else 'No suppression. strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strSource & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=NO"";" End If oConn.Open ConnectionString:=strConnection Set oRecSet = CreateObject("ADODB.Recordset") 'Read the data from the worksheet/range. oRecSet.Open "SELECT * FROM [" & strRange, oConn, 2, 1 With oRecSet .MoveLast 'Get count. lngCount = .RecordCount .MoveFirst End With LoadFromExcel_ADODB = oRecSet.GetRows(lngCount) 'Cleanup If oRecSet.State = 1 Then oRecSet.Close Set oRecSet = Nothing If oConn.State = 1 Then oConn.Close Set oConn = Nothing lbl_Exit: Exit Function End Function |
#2
|
||||
|
||||
You are trying to use code intended for a content control with a userform combobox.
See http://www.gmayor.com/Userform_ComboBox.html which includes code to populate a list box or combobox from an Excel worksheet.
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
#3
|
|||
|
|||
Quote:
Damn it! I actually had that code from another thread you and macropod helped me with but I chose to try to just duplicate what I did in my main document. Also feel pretty foolish about the "not a content control" thing as well. Thanks gmayor, I will give it a shot. |
#4
|
|||
|
|||
Quote:
Quote:
Your code works fine for me if I define the range as a worksheet. However, when I specify range as a "Named Range" I get the following error... Here is my code... Code:
Private Sub Userform_Initialize() xlFillList ListOrComboBox:=Me.DrawingNumberUf, _ iColumn:=1, _ strWorkbook:="C:\Temp\ItemSheet.xlsx", _ strRange:="CollRange", _ RangeIsWorksheet:=False, _ RangeIncludesHeaderRow:=True End Sub Sub xlFillList(ListOrComboBox As Object, _ iColumn As Long, _ strWorkbook As String, _ strRange As String, _ RangeIsWorksheet As Boolean, _ RangeIncludesHeaderRow As Boolean) If RangeIsWorksheet = True Then strRange = strRange & "$]" Set CN = CreateObject("ADODB.Connection") If RangeIncludesHeaderRow Then CN.Open ConnectionString:="Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strWorkbook & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" Else CN.Open ConnectionString:="Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strWorkbook & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=NO"";" End If Set RS = CreateObject("ADODB.Recordset") RS.CursorLocation = 3 RS.Open "SELECT * FROM [" & strRange, CN, 2, 1 'read the data from the worksheet ... ... |
#5
|
||||
|
||||
Actually you are doing nothing wrong. The error was mine. The code has lost a line
I'll fix it on the web site, but in the meantime, I have corrected it below. The userform primarily needs code to set a Tag of 0 for cancel and 1 for proceeding associated with the command buttons and in both cases to hide the form e.g. Code:
Option Explicit Private Sub btnOK_Click() Me.Hide Me.Tag = 1 End Sub Private Sub btnCancel_Click() Me.Hide Me.Tag = 0 End Sub Code:
Option Explicit Private RS As Object Private CN As Object Private numrecs As Long, q As Long Private strWidth As String Sub Main() Dim oFrm As New DrawingNumberEntryForm With oFrm xlFillList ListOrComboBox:=.DrawingNumberUf, _ iColumn:=1, _ strWorkbook:="C:\Temp\ItemSheet.xlsx", _ strRange:="CollRange", _ RangeIsWorksheet:=False, _ RangeIncludesHeaderRow:=True .Show If .Tag = 0 Then GoTo lbl_Exit 'Do stuff with ofrm End With lbl_Exit: Unload oFrm Set oFrm = Nothing Exit Sub End Sub Private Function xlFillList(ListOrComboBox As Object, _ iColumn As Long, _ strWorkbook As String, _ strRange As String, _ RangeIsWorksheet As Boolean, _ RangeIncludesHeaderRow As Boolean, _ Optional PromptText As String = "[Select Item]") If RangeIsWorksheet = True Then strRange = strRange & "$]" Else strRange = strRange & "]" End If Set CN = CreateObject("ADODB.Connection") If RangeIncludesHeaderRow Then CN.Open ConnectionString:="Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strWorkbook & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" Else CN.Open ConnectionString:="Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strWorkbook & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=NO"";" End If Set RS = CreateObject("ADODB.Recordset") RS.CursorLocation = 3 RS.Open "SELECT * FROM [" & strRange, CN, 2, 1 'read the data from the worksheet With RS .MoveLast numrecs = .RecordCount .MoveFirst End With With ListOrComboBox .ColumnCount = RS.Fields.Count If RS.RecordCount > 0 Then .Column = RS.GetRows(numrecs) End If strWidth = vbNullString For q = 1 To .ColumnCount If q = iColumn Then If strWidth = vbNullString Then strWidth = .Width - 4 & " pt" Else strWidth = strWidth & .Width - 4 & " pt" End If Else strWidth = strWidth & "0 pt" End If If q < .ColumnCount Then strWidth = strWidth & ";" End If Next q .ColumnWidths = strWidth If TypeName(ListOrComboBox) = "ComboBox" Then .AddItem PromptText, 0 If Not iColumn - 1 = 0 Then .Column(iColumn - 1, 0) = PromptText .ListIndex = 0 End If End With 'Cleanup If RS.State = 1 Then RS.Close Set RS = Nothing If CN.State = 1 Then CN.Close Set CN = Nothing lbl_Exit: Exit Function End Function
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
#6
|
|||
|
|||
Quote:
Here is my userform after I added your updated code... Code:
Option Explicit Private RS As Object Private CN As Object Private numrecs As Long, q As Long Private strWidth As String Private Sub CANCELbutton_Click() Me.Hide Me.Tag = 0 Application.Quit End Sub Private Sub OKbutton_Click() ActiveDocument.SelectContentControlsByTitle("Drawing Number").Item(1).Range.Text = DrawingNumberUf Me.Hide Me.Tag = 1 lbl_Exit: Unload Me Exit Sub End Sub Sub Main() Dim oFrm As New DrawingNumberEntryForm With oFrm xlFillList ListOrComboBox:=.DrawingNumberUf, _ iColumn:=1, _ strWorkbook:="C:\Temp\ItemSheet.xlsx", _ strRange:="Table1", _ RangeIsWorksheet:=False, _ RangeIncludesHeaderRow:=True .Show If .Tag = 0 Then GoTo lbl_Exit 'Do stuff with ofrm End With lbl_Exit: Unload oFrm Set oFrm = Nothing Exit Sub End Sub Private Function xlFillList(ListOrComboBox As Object, _ iColumn As Long, _ strWorkbook As String, _ strRange As String, _ RangeIsWorksheet As Boolean, _ RangeIncludesHeaderRow As Boolean, _ Optional PromptText As String = "[Select Item]") If RangeIsWorksheet = True Then strRange = strRange & "$]" Else strRange = strRange & "]" End If Set CN = CreateObject("ADODB.Connection") If RangeIncludesHeaderRow Then CN.Open ConnectionString:="Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strWorkbook & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" Else CN.Open ConnectionString:="Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strWorkbook & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=NO"";" End If Set RS = CreateObject("ADODB.Recordset") RS.CursorLocation = 3 RS.Open "SELECT * FROM [" & strRange, CN, 2, 1 'read the data from the worksheet With RS .MoveLast numrecs = .RecordCount .MoveFirst End With With ListOrComboBox .ColumnCount = RS.Fields.Count If RS.RecordCount > 0 Then .Column = RS.GetRows(numrecs) End If strWidth = vbNullString For q = 1 To .ColumnCount If q = iColumn Then If strWidth = vbNullString Then strWidth = .Width - 4 & " pt" Else strWidth = strWidth & .Width - 4 & " pt" End If Else strWidth = strWidth & "0 pt" End If If q < .ColumnCount Then strWidth = strWidth & ";" End If Next q .ColumnWidths = strWidth If TypeName(ListOrComboBox) = "ComboBox" Then .AddItem PromptText, 0 If Not iColumn - 1 = 0 Then .Column(iColumn - 1, 0) = PromptText .ListIndex = 0 End If End With 'Cleanup If RS.State = 1 Then RS.Close Set RS = Nothing If CN.State = 1 Then CN.Close Set CN = Nothing lbl_Exit: Exit Function End Function I appreciate your help. I really am learning a lot thanks to you and others. |
#7
|
||||
|
||||
Code:
Option Explicit Private Sub CANCELbutton_Click() Me.Hide Me.Tag = 0 End Sub Private Sub OKbutton_Click() Me.Hide Me.Tag = 1 End Sub The parts that you added to the above go in the code that calls the userform e.g. as follows. The Excel function also goes in the same module as Sub Main. Code:
Sub Main() Dim oFrm As New DrawingNumberEntryForm With oFrm xlFillList ListOrComboBox:=.DrawingNumberUf, _ iColumn:=1, _ strWorkbook:="C:\Temp\ItemSheet.xlsx", _ strRange:="CollRange", _ RangeIsWorksheet:=False, _ RangeIncludesHeaderRow:=True .Show If .Tag = 0 Then GoTo lbl_Exit 'Cancel was selected ActiveDocument.SelectContentControlsByTitle("Drawing Number").Item(1).Range.Text = .DrawingNumberUf.Text End With lbl_Exit: Unload oFrm Set oFrm = Nothing Exit Sub End Sub
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
#8
|
|||
|
|||
Quote:
I'll give it a try. |
#9
|
|||
|
|||
Quote:
It's working great! Thanks a lot. I have one final issue I was hoping I could figure out on my own but I'm not having any luck. Maybe you can offer a suggestion or two? Below is the sample table I am using in Excel. Currently the range include all three columns. Populating the "Drawing Number" using this code... Code:
ActiveDocument.SelectContentControlsByTitle("Drawing Number").Item(1).Range.Text = .DrawingNumberUf.Text Any suggestions or links to your web site where you cover this would be greatly appreciated. As always, thanks for your help. |
#10
|
|||
|
|||
If you are populating a multicolumn listbox then your code would look something like this:
Code:
ActiveDocument.SelectContentControlsByTitle("Drawing Number").Item(1).Range.Text = .DrawingNumberUf.Column(0) ActiveDocument.SelectContentControlsByTitle("Rev").Item(1).Range.Text = .DrawingNumberUf.Column(1) ActiveDocument.SelectContentControlsByTitle("Name").Item(1).Range.Text = .DrawingNumberUf.Column(2) |
#11
|
|||
|
|||
Quote:
Awesome! Works exactly how I want it to. Thanks for taking the time to respond. |
#12
|
|||
|
|||
Graham (or anyone else),
I need some assistance on how I would modify the following code so I could use an Access (Access 2016) database as my data source to populate content controls. Any information, be it code or links, will be appreciated. Code:
Sub Main() Dim oFrm As New DrawingNumberEntryForm 'userform to retrieve initial drawing number With oFrm xlFillList ListOrComboBox:=.DrawingNumberUf, _ iColumn:=1, _ strWorkbook:="C:\Temp\ItemSheet2.xlsx", _ strRange:="TableXXX", _ RangeIsWorksheet:=False, _ RangeIncludesHeaderRow:=True .Show If .Tag = 0 Then GoTo lbl_Exit 'Cancel was selected 'ActiveDocument.SelectContentControlsByTitle("Drawing Number").Item(1).Range.Text = .DrawingNumberUf.Text If .DrawingNumberUf.Column(3) = "N" Then ActiveDocument.Unprotect '("PreciseTF") ActiveDocument.Tables(2).Delete ActiveDocument.SelectContentControlsByTitle("Cert Type").Item(1).Range.Text = .DrawingNumberUf.Column(4) ActiveDocument.Protect NoReset:=True, Password:="", Type:=wdAllowOnlyFormFields End If ActiveDocument.SelectContentControlsByTitle("Drawing Number").Item(1).Range.Text = .DrawingNumberUf.Column(0) ActiveDocument.SelectContentControlsByTitle("Revision").Item(1).Range.Text = .DrawingNumberUf.Column(1) ActiveDocument.SelectContentControlsByTitle("Part Description").Item(1).Range.Text = .DrawingNumberUf.Column(2) End With lbl_Exit: Unload oFrm Set oFrm = Nothing Exit Sub End Sub -------------------------------------------------------------------------------- Private Function xlFillList(ListOrComboBox As Object, _ iColumn As Long, _ strWorkbook As String, _ strRange As String, _ RangeIsWorksheet As Boolean, _ RangeIncludesHeaderRow As Boolean) If RangeIsWorksheet = True Then strRange = strRange & "$]" Else strRange = strRange & "]" End If Set CN = CreateObject("ADODB.Connection") If RangeIncludesHeaderRow Then CN.Open ConnectionString:="Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strWorkbook & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" Else CN.Open ConnectionString:="Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strWorkbook & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=NO"";" End If Set RS = CreateObject("ADODB.Recordset") RS.CursorLocation = 3 RS.Open "SELECT * FROM [" & strRange, CN, 2, 1 'read the data from the worksheet With RS .MoveLast numrecs = .RecordCount .MoveFirst End With With ListOrComboBox .ColumnCount = RS.Fields.Count If RS.RecordCount > 0 Then .Column = RS.GetRows(numrecs) End If strWidth = vbNullString For q = 1 To .ColumnCount If q = iColumn Then If strWidth = vbNullString Then strWidth = .Width - 4 & " pt" Else strWidth = strWidth & .Width - 4 & " pt" End If Else strWidth = strWidth & "0 pt" End If If q < .ColumnCount Then strWidth = strWidth & ";" End If Next q .ColumnWidths = strWidth End With 'Cleanup If RS.State = 1 Then RS.Close Set RS = Nothing If CN.State = 1 Then CN.Close Set CN = Nothing lbl_Exit: Exit Function End Function |
#13
|
|||
|
|||
HR955
Graham and I both have published information on populating listboxes on our websites. It is time for you to start catching your own fish. http://gregmaxey.com/word_tip_pages/...functions.html |
#14
|
|||
|
|||
Quote:
I more than agree. That is why I asked for any links. Thanks! |
#15
|
|||
|
|||
Quote:
Just the "bait" I was looking for. Thanks again! P.S. As with Graham's website, I have made a donation to yours. |
Tags |
combobox, populate, userform |
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Excel List Box not populating worksheet field upon submit | Shane.Hutchison | Excel Programming | 1 | 10-22-2015 12:24 PM |
Help!! Dropdown List | christo16 | Word | 1 | 06-29-2015 05:18 AM |
Dropdown list, Macro | shield5 | Excel Programming | 7 | 10-27-2013 01:51 AM |
Need help populating dropdown box | antztaylor | Word | 3 | 11-06-2012 05:46 PM |
Populating ComboBox or Drop Down list with contents of a text field | Billy_McSkintos | Word VBA | 1 | 09-13-2011 05:50 AM |