I have built a quoting tool and Userforms to act as a user interface to this tool. The userforms basically just feed user input back to relevant sheets. I have a number of textboxes, listboxes and radio buttons on multipages. Now the issue is that each control has an Afterupdate or Change event associated with it. Consider this scenario:
I have 4 product categories (represented by radio buttons) : Cat A, Cat B, Cat C, Cat D
Each category can have up to 10 line items which are represented by combo boxes.
Now lets say the user has selected Cat A radio button, he selects a product from the combo box (the cursor or focus is still on the combo box) and clicks on Cat B radio button. Here is the issue: on the first click, Afterupdate or Change event of Combo box fires but radio button is still unselected. The user has to click Cat B radio button AGAIN to select Cat B radio button. So essentially it takes two clicks with a slight pause between them to change categories.
One way to avoid this is to press Enter or 'tab through' each field. But this is not very intuitive. I have tried using Exit, Afterupdate, Exit, Change events without success. I can't use ControlSource option because the cell to input info to is dynamically selected. I have used xlCalculationManual for some text boxes but can't use this since some inputs on the userforms depend on the right value being calculated on the sheet.
I use the following (work in progress) function to add the controls to the userform (usually added to page or frame).
Code: Public Function AddControls(ByVal objTarget As Object, ByVal strUiName As String) Dim rngControls As Excel.Range, rngProperties As Excel.Range Dim rngControl As Excel.Range, rngProperty As Excel.Range Dim objControl As Object
With shtFormUI Set rngControls = .Range("D2:D" & .Range("D" & .Rows.Count).End(xlUp).Row)
Now I need a means of trapping the controls events. I thought I could use a class, e.g.: cFormEvents
Code: Option Explicit
Public WithEvents lblLabel As MSForms.Label Public WithEvents tbxTextBox As MSForms.TextBox Public WithEvents cbxComboBox As MSForms.ComboBox Public WithEvents lbxListBox As MSForms.ListBox Public WithEvents cbtCommandButton As MSForms.CommandButton
Private Sub lblLabel_Click()
It seems I cannot reference the controls because I they are added at runtime. For the given example, I want to run whatever procedure name appears for lblPrimaryContact in column AC (click event). So in my userform module I instantiate the class, but I get an error when I try and reference the control:
Code: Set m_clsFormEvents.lblLabel = Me.lblPrimaryContact Error is "method or data member not found".
Any alternative method to grab the click event for the control added at runtime?
I want to access the Properties of a number of controls in a running form, and these controls may or may not be contained in a Frame or a MultiPage.
In particular I want the Top and Left for these controls, which means I have to first find out if the control is contained in a Frame or MultiPage so I can get the reference for Top and Left. I'm ok with doing this for controls inside a Frame, but the MultiPage is eluding me. I get an error when I try to access these controls and it looks like they are actually owned by the individual Pages of the MultiPage.
how do I find out if a given control is contained in a given MultiPage?
My workbook simply has multiple columns of data which will be summarized visually in a tag cloud (I have the tag cloud part taken care of already creating either a jpg or png, I simply have to change the extension within a batch file to change between picture formats)
I need to have the tag cloud image display and update depending on which column the user would like to summarize (for now I have simplified the issue by only having one of the data columns in my workbook, and will worry about the user selection of the data column to be summarized later).
My Main Question:
Focusing on the image display and updating now, whether it be an ActiveX Image Control or any other way. I've been playing around manually before I try and code it and I can not get either a jpg or png file to attach to the ActiveX control (both of which cause an Invalid Picture Message).
The file name can stay the same if need be and for now I think/assume that'd be easiest (I have my Tag cloud generator just replacing the previously existing image file of the same name).
Would ActiveX control be the way to go for this dynamically changing image?
I have a number of image controls on a user form, each being loaded with an image from file.
Image1 being loaded with a picture of a bus image2 being loaded with a picture of a school
And so on
Now what I am trying to do is when that image is clicked the name of that image is passed to a textbox
So the action would be
1 image of bus loaded into image control1 , the name of that image being bus.jpg 2 image is clicked 3 the name bus.jpg appears in a text box
Here is what I have so far
Private Sub Image1_Click() DataInput.TextBoxItem.Value = bus.jpg
DataInput.TextBoxItem.Value= Image1.Name - this does not work
Which works but as you can see this is static, as I have supplied the value , were as I would like the clicking action to pick up the name of the jpeg being displayed
So expanding upon this if say image1 is loaded with say a picture of a car instead of a bus
LValue4 = "E:Car.jpg"
Image1.Picture = LoadPicture(LValue4)
Now when it is clicked the name of the image being displayed in image control1 would be Car.jpg
And it is this value I wish to transfer to a text box for now will do more with it later
In addition to this I am not sure if the best idea is to have a number of image controls and load each with an individual picture or have one image control and swap the picture by clicking a command button
I am trying to display an image ("image") on an image control ("Image1") placed in a worksheet ("Sheet1"). The problem is that I want this action to take place when I press a button in a user form. I am trying to use the following code, but it seems that VBA does not recognize the image control ("Image1") in the worksheet.
Private Sub cmdDisplayImage_Click() Dim image As Variant image = ThisWorkbook.Path & "sun.jpg" Sheets("Sheet1").Activate Image1.Picture = LoadPicture(image) End Sub
I have a userform with a multipage issue. On page1 I have a command button that formats cells. On page2 I have textbox1 with a fixed number, textbox2 that counts the number of formatted cells (from the command button on page 1) and textbox3 that's going to sum textbox1 and 2. So here's the issue. Lets say I'm on page2 viewing the textboxes, if I switch back to page1 and format additional cells and then switch back to page2, textbox2 does not update with the additional cells formatted. I always need to close the userform and reopen it for the changes to take place.
I would like to know if it's possibale to use VB, to auto manage these levels IE, 1 box asks for the part number 2nd asks you how many 3rd/4th boxes are "+", "-" When + or - is pressed the part number will automatically add's/subtracts that part level. I had 10x abcde's I enter 2 in "How Many", then press "-" it will then adjust the level from 10 to 8
I know how to load a picture onto an image control using VBA code, but how do I clear the picture? (NOTE: I am not talking about using the properties window in the VBE, I am talking about coding in VB)
I am attempting to put in some dropdown boxes and text boxes and maybe some other items using the control toolbox in Excel. After a selection is made I would like to count that particular item. I was using the validation method in which all I needed was the following to sum up the selections made: =SUMIF(G:G,"Monday",I:I)
Now I realize this will not work due to the fact the control toolbox controls are embeded and merley sit on the cells. How do I sum selections made using drop down boxes that are derived from the control toolbox? If someone can give me an example to try or point me to a place to find such information that would be great.
The file I am trying to view is saved as follows: C: Test.gif
What I have done.Added a image control to a dialog box, called image1 Added the following event handler to image1: x = c: test.gif Image1.picture = loadpicture (X)Pressed F5 to test the code and brings up a dialog box with a blank image box.
Not called the userform in the main module (didn't seem much point considering the test failed)
where I am going wrong with this, the correct code?
Also in inputting the address of the file I could not use the C: format as this brought up an error. What is the correct format?
I am able to work out a code to upload pictures from my files using this:
Private Sub cmdfind_Click() Application. ScreenUpdating = False Dim strfind As String Dim rsearch As Range Dim strfolder As String Dim strname As String Dim strpic As String Dim b As Range Set rsearch = Worksheets("m").Range("ap3", Range("ap65536").End(xlUp)) 'define path to images strfolder = "F:SEC FILESMAC2PIC" 'get data from userform strname = frmsearch.txt201.Value 'check if pic exists strpic = strfolder & strname & ".jpg".......................
How do i avoid the 'File Not Found' error if the picture is not available in my file folder?
I want to delete a picture from an image control in a worksheet when pressing a button. So my code is:
Private Sub CommandButton1_Click() Sheets("Sheet1").Image1.Picture = LoadPicture("") End Sub
Well, the problem is that this code only works when I create it. If I save and close the excel file when I open it again and I press the CommandButton1 I get the following error: Run-time error '-2147417848(80010108)' Method "Picture of object "IImage" failed.
I have a worksheet that contains a number of ActiveX image controls, which have been scaled to a uniform height to serve as thumbnails.
I have also created a class, where each instance is initialized with one of these image controls, and events (specifically the on click event) are captured. When the user clicks the picture, it opens a userform containg the same picture. However, I'd like that picture to be at its original size, not the scaled-down size.
how can I determine the original dimensions of a picture used in an image control? I can tell that the original resolution is there (by changing the PictureSizeMode to clip), but I can't find any properties that show me how big that image actually is, only ones that return or set the size of the object itself.
Is it possible to create a "floating" UserForm with VBA? That is, a form that is always on top af all the other windows. If not I think I will have to create an application in VB that imports data from the active Excel Spreadsheet, wich I have been lead to understand is fully possible. I really need this for the application that I am currently developing and I from what I have heard it is possible in VB.
I have a UserForm that requires a value in TextBox10. I load a "1" into it at start up. If the user tries to delete the value in TextBox10 and exit, leaving either "" or 0 in the TextBox, it will cause a great many problems. I need someway to keep the focus in TextBox10.
I tried to find something using the search engine but I could not find anything searching with this subject.
Here is the code from my first attempt:
Private Sub TextBox10_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox10.Value = 0 Or TextBox10.Value = vbNullString Then TextBox10.SetFocus Exit Sub End If
It doesn't seem to do anything. When I delete whatever is in the Textbox and hit enter, it should just stay in TextBox10 but instead it goes to the next tab location.
This is weird - if you delete a sheet that contained a control then
a. showing a modeless userform resluts in a userofrm that goes invisible at subroutine End b. public variables lose their value
These things do not happen if the sheet did not contain a control. Attached is an example file - put the inputfile.xls in your default file location (or add a path in the code) then open the ProblemDemo.xls and run the main macro to see it fal - isthis another Excelbug I've found?
I have a series of Userforms that I would like the user to be forced to enter in some sort of information in one of those userform in the series. I do not want it to be submitted blank. Is there a code or a properties toggle to make this possible.
I have several non-modal userforms in my App, some of them have date-fields that require manual entry typing of dd/mm/yy etc (No single userform has more than one date-box in it, this I think may be pivotally useful)
Now the Userform 'Calendar' that is built on the class of the same (cCalendar) name, has the write value line 'ActiveCell.value = theCal.value'
I'm looking to change this to refer to the correct userform.Textbox value, depending on which form is open.
I would imagine I could simply have a global string, whose value is set (or re-set) whenever a Userform is initialized (some sort of 'ActiveUF.value = Me.Name), where I get lost is referring to the components by name, so as to have a case statement by where I go:
Private Sub theCal_AfterUpdate() Select Case ActiveUF Case "AddForm" application.vbe.components("AddForm").controls("AddFormDatePicker").value = theCal.value Case "EditForm" '.... etc end select end sub
better way of doing this (instead of passing around the userform name as a variable) - or proper syntax for referring to controls outside of the 'active' userform (but an open userform nonetheless)?
Every time I have to do this particular thing with userforms, I completely forget how, and the object browser always leads me on an infinite loop of Application.vbe.activevbproject.vbcomponents.vbe.active....
PS - there may be one slight complication to the process - one of the forms, has a 2-tab page in it, each page having similar (but named differently) fields. So I may need to be able to throw in 'Activepage' or whatnot
At two places in the middle of my code I need to specify a particular variable; usually this is done by some autodection-method, but whenever this fails a userform gets loaded and the user needs to do some clicks which finally specifies that variable.
So far my code does NOT wait for the userform (and the user-input), but continues running until it fails, cause that particular variable (see above) had not been initialised with the correct value for this run.
How can I force the code to wait until the userform has been closed? Or what other way do you usually solve that problem when wanting to use a userform in mid-code? Below you find the place where I load the User form 'UsrFormSpecifyFormat' ....
A userform to move the curser to a column then activate the Excel App and keep the userform visiable.
The problem is when excution the code step by step (F8) works fine, but when excution the code by F5 the cursor moves to the Range("A65536").End(xlUp) and doesnot then move to the required column.
also this line AppActivate ("Microsoft excel")
does not work , it gives me Invalid proceduers or call argument.
Private Sub ComboBox1_Change()
Range("A65536").End(xlUp).Activate If ComboBox1.ListIndex = 0 Then Cells(ActiveCell.Row, "I").Activate If ComboBox1.ListIndex = 1 Then Cells(ActiveCell.Row, "J").Activate If ComboBox1.ListIndex = 2 Then Cells(ActiveCell.Row, "K").Activate
I have a userform that has nested multipages (5 in the outer page, 4 in the inner page).
On each of these multipages, I want to have the same controls (sliders) laid out in the same order - but with unique names, named after their tab location, for each control so I can use their value property later in the code.
I've designed the layout and named all the controls on my first sheet (e.g. Slider1Outer1Inner1). I now need a way of automating the replication of these across the other 19 sheets (including the nested inner multipage!); so that equivalent slider for example would be called Slider1Outer1Inner2, Slider1Outer1Inner3 etc.
I'm not sure about coding VBA to act on items within VBA...
VB: " For each multipage in outer For Each multipage In inner For Each Object In current multipage Copy inner.object -> Next multipage Inner.object.name = CurrentOuter & CurrentInner & CurrentSlider "