Stumped: ExcelVBA RowSource for a ComboBox - excel

I'm stumped. I've read every thread regarding applying a RowSource to a ComboBox and just cannot get the solutions (which are mostly the same) to work.
The details are:
Excel 2010
UserForm = UFToTakeList
ComboBox = cbLvl2Selector
For which I want to have the RowSource as NRM1Lookup!NRM1GroupNoRange
I have typed: UFToTakeList.cbLvl2Selector.RowSource = NRM1Lookup!NRM1GroupNoRange to no success. I have added "" and '', I have tried other variations on the theme.
I can type the RowSource in the Properties box but I want to be able to concatenate another Range and know that I can apply this method to all my ComboBoxes.
I think my fundamental problem is knowing where to put the code. It automatically selects the _Change parameter for the ComboBox within the UserForm. If that is correct then I cannot workout why I can type the path above into the Properties box but it won't work as code.
Any guidance would be very much appreciated. My grey matter is frying.

From your explanation I could not understand what you want? You can try following codes, is it helpful to you or not?
Private Sub UserForm_Initialize()
Dim rng As Variant
rng = Sheets("Sheet1").Range("A1", Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp))
If IsArray(rng) Then
ComboBox1.List = rng
Else
ComboBox1.AddItem rng
End If
End Sub

Related

Clearing a list box and any selected items in list

I have an Excel VBA application that goes through a sheet which contains product orders on a sheet in a workbook and searches the worksheet for orders that match various criteria which is populates in a search worksheet. The contents from this worksheet are then displayed in list box. There are several user forms that allow the user to select an order and then manipulate the order. After doing this the order manipulated may not meet the search criteria so I want to clear the list box contents and the selected row in the list box. I have tried numerous things but nothing seems to work. My latest is something list this:
Private Sub ClearListBox()
UserForm5.lstOpenO.ListIndex = -1
UserForm5.lstOpenO.RowSource = ""
End Sub
But I have tried setting the UserForm5.lstOpenO.Selected to false for all the rows. I have tried clearing the search worksheet and then displaying that which should only show the headers on the columns but the highlight in the selected row remains.
Any help would be greatly appreciated
Bruce
First of all you should not use the default instance of the userform in your code. This will lead to ambigous behaviour
I'd suggest
Private Sub ClearSelectionInListBox()
Dim varItm as variant
With lstOpen0
varItm = .MultiSelect
.MultiSelect = 0
.MultiSelect = 1
.MultiSelect = varItm
End With
End Sub
This will clear the selection within the listbox.
It is not clear if you really want to clear the contents. Because if you want then it does not make sense to think about clearing the selection.
If you want to clear the listbox then it is not neccessary to clear the selection first.
Private ClearListBox()
With lstOpen0
.RowSource = ""
.Clear
End With
End Sub
But after that you need to fill the listbox again.
Further reading
VBA userform
Userform.Show
ListBox

Detect ComboBox Change Excel VBA

I have a sheet with a bunch of ComboBoxes(form control) and I want to detect when a user changes any one of them and write text in a cell. Using Worksheet_Change on the target cells doesn't work. I have tried a bunch of things that don't work. I'm not sure what needs to be in the private sub line or the if statement.
Private Sub DropDowns_DropButtonClick()
If ActiveSheet.DropDowns.Value > 1 Then
Cells(13, 5).Font.Bold = True
Cells(13, 5).Font.Color = vbRed
Cells(13, 5).Value = "!!! Selections have been changed. !!!"
End If
End Sub
I have tried
ComboBox_AfterUpdate()
ComboBox_Change()
DropDowns_AfterUpdate()
DropsDowns_Change()
and anything else I could find. I've also tried a few different things in the if statement with no luck.
I appreciate any help.
Chris
If I'm reading you correctly, you're comboboxes are in a userform. If I'm correct, simply open your userform in 'Visual Basic' and double click on the relavant combobox. This will open the code pane and create an empty Private Sub routine called 'Private Sub <Combobox Name> ()'.
Enter your code to place your data in the sheet (or whatever else you want) into the subroutine and Bob should be your uncle.
Apologies in advance if there's something I've missed.
RannochRob
Edit...
OK, my mistake, it's a form control.
My first comment is that it's easier to use an activex control if you can... however, with a form control, should (a) Use the cell link box in the 'Format Control' drop down ('Control' tab) to place the result in a cell... however, that result will not be the content of the box but an integer equal to the position of the selected entry on the list of entries in the combobox. You then need to (b) assign a macro to the combobox which will pick up the result and use it to get the required information from the range containing the list of entries. Like I say, much easier with an activex control...
RannochRob
Here's how you can do it by assigning a macro to the combobox (right click on the combobox>assign macro) as #BigBen mentioned in the comments section:
Option Explicit
Sub DropDown1_Change()
Dim sht As Worksheet
Dim dd As DropDown
Set sht = ThisWorkbook.Worksheets("Name of your Worksheet") 'Name of the worksheet in which the combobox is located
Set dd = sht.DropDowns("Drop Down 1") 'name of your combobox
sht.Range("G1").Value = "The selected value is: " & dd.List(dd.Value) 'dd.value returns the index of the selected value
End Sub
You can use the same code for each one of your comboboxes.
For demonstration purposes i have used the following set-up:
You can easily modify the code to best fit your needs.

fill multiple excel dropdowns in a loop

I have a for loop which creates multiple dropdowns in different parts of my excel sheet. However i am having a hard time filling these with a list. The list should be obtained from the sheets in ws. I guess the problem here is that, when naming my combo box, it doesnt get assigned as an object.
Here is the code i have. Anybody have an idea on how to do this? Thanks in advance.
Private Sub CommandButton1_Click()
Set ws = Sheets(Array("rpi301", "rpi302", "rpi303", "rpi304", "rpi305"))
For Each Sh In ws
Set Cell = Range(Sh.Range("B8").Value & CStr(Sh.Range("B9").Value))
With Cell
ActiveSheet.DropDowns.Add(.Left, .Top, .Width, .Height).Name = "Combo"
ActiveSheet.Shapes("Combo").ControlFormat.ListFillRange = Sh.Range("B2:B7")
End With
Next
End Sub
Code is right. But the problem what naming the dropdowns. They should have unique names.

Excel Visual Basic Code Issue

I'm designing a PO that changes the cost per unit depending on the item selected in the Drop Down List.
I'm using...
Sub DropDown8_Change()
If (DropDown8.SelectedItem = "1") Then
Range("E21").Value = "54.90"
End If
End Sub
However I get the error,
Run-time error '424': Object required
If I remove the IF statement and have it simply change the contents of the Cell, It works.. So I'm assuming it is an issue with the Conditional Statement.
From my signifigant past with Visual Basic in Visual Studio, The name of the Control is included in the Method so I'm confused. I could be doing alot wrong here so bear with me :).
Thanks in advance
Working with Shapes on an Excel worksheet is kind of annoying. I usually stay away from them if I can.
Here's how you get the data you're looking for:
Sub DropDown8_Change()
Dim selectedItem As String
Dim ws As Excel.Worksheet
Set ws = Sheets(1)
Dim selectedIndex As Long
selectedIndex = ws.Shapes("Drop Down 8").ControlFormat.Value
selectedItem = ws.Shapes("Drop Down 8").ControlFormat.List(selectedIndex)
If (selectedItem = "1") Then
Range("E21").Value = "54.90"
End If
End Sub
The problem is that the method that's generated for you (in your case, DropDown8_Change()) doesn't really give you much to work with (like with Worksheet_Change(ByVal Target As Range)), and you have to deal with VBA Shapes (yuck).
You need to reference the Shape by it's actual name (unless you know the Shape's index, which isn't as easy to determine). The name can be found by right-clicking on the shape and then looking in the Range address textbox to the left of the formula bar. Then you have to go through this whole ControlFormat hoops to get what you're looking for.
Sorry for the rant. I hate VBA Shapes.

Excel Userform Combobox Properties Rowsource box issues?

I have a userform in Excel that works as a calculator.
In this userform I have two ComboBoxs (1 & 2)
In VBA editor, with ComboBox1 selected, In Properties, under Rowsourse I have: Sheet1!a4:a5
In Sheet1, A4 = Auckland and A5 = Christchurch
This is fine and when I run the userform there is a drop down arrow with the two options (Auckland or Christchurch).
However my problem is that when you open this workbook I have a VBA command to hide it from the users sight, leaving them only the userform to work with which is what is desired.
The issue is that if you have another workbook open then open this calculator workbook (which automatically hides itself). Then the combobox list is populated by Sheet1!a4:a5 on the other workbook that was already open, not the workbook that actually contains "Auckland" & "Christchurch" from which the userform is from.
I have tried making the Rowsource for the comboboxes more specific by putting the following in the rowsource box in properties: [book1.xlsm]sheet1!a4:a5 but this comes up with a "Invalid Property Value" error message.
I have also tried making a:
Private Sub Userform1_Initialize()
ComboBox1.Additem "Auckland"
ComboBox1.Additem "Christchurch"
End Sub
And also tried this:
Private Sub Userform1_Initialize()
ComboBox1.RowSource = Workbooks("book1.xlsm").Sheets("Sheet1").Range("a4:a5").Value
End Sub
However with both codes when it opens and runs now the comboboxes are empty and there is no list.
I think the easist solution would be to somehow put the full path (including workbook name) into the rowsource box under properties. But I must be missing something as its coming up with that error for me?
All help would be greatly appreciated.
Thanks
You are missing ' in your full path row source.
It should be like this:
Me.ComboBox1.RowSource = "'[book1.xlsm]Sheet1'!$A$4:$A$5"
I have similar question that can be found HERE.
Set the row source property of the combobox as: SheetName!$Col$Row:$Col$Row, e.g.: Location!$A$1:$A$3.
You may try adding this code on userform:
Private Sub UserForm_Initialize()
ComboBox1.list = Array("Auckland","Christchurch")
End Sub
Then set Combobox propert "MatchEntry" to "1".

Resources