Ch 11: Userforms CP212 Winter 2010. Topics Designing User Forms o Controls Setting Properties o Tab...

27
Ch 11: Userforms CP212 Winter 2010

Transcript of Ch 11: Userforms CP212 Winter 2010. Topics Designing User Forms o Controls Setting Properties o Tab...

Ch 11: Userforms

CP212 Winter 2010

Topics

•Designing User FormsoControls

•Setting PropertiesoTab OrderoTesting

•Writing Event HandlersoUserform_InitializeobtnCancel_Click

•Displaying a User Form•Looping Through Controls•Working with Listboxes•Working with Excel Controls

Background

•some information covered in the lecture on interface design•textbook calls a Userform a “dialog box”ocan be much more than that

•called simply a form in Visual Basicorelated topic: Windows Forms Programming

•example in textocomplex spreadsheetoform gives the user options to choose fromoeasier to use this “application” than learn Excel

Starting a Form

•creating a GUI based application or form starts with designing the form

•to insert a form in VBEoInsert -> UserformoToolbox gets displayed - sometimes it disappears

click View -> Toolbox to get it back

Designing the Form

Need to know 3 things:

•Which controls are available•How to place, resize and line up controls in a form•How to set the properties

Controls

Common Uses

•CommandButton: allows user to execute code (subs or macros)

•Label: explain something•Textbox: get input from the user (can be read-

only - set Enabled property to False)

Common Uses

•ListBox: choose one or more items from a list•ComboBox: like a listbox, but allows a custom item to be

added that isn't in the list.•CheckBox: any, none, or all of the boxes can be selected•OptionButton: also called a radio button, only one option

can be selected (usually one is mandatory) per group•Frame: organize a set of options, or grouping of controls•RefEdit: similar to a textbox but also allows user to select a

range of cells

Custom Controls

•Right-click on the toolbox and select Additional Controls•One good one is the Calendar tool:oCalendar Control 12.0 (but there are others)

The calendar control was removed in Office 2010. You can either buy a new one, or create your own. That would be a good exercise, and has been used as part of an assignment in the past.

Laying Controls

•To help, controls can be resized and aligned to each other or the form

•Format -> Align, Format -> Make Same SizeoExperiment with it

Setting Properties

•most controls have different properties•some are common•Name: used to refer to the control with

VBA Codeoname not necessary if you plan on

not referring to it with code (like labels)

•Caption: what you see on the screen, usually on forms, buttons and labels.

•Text or Value: What gets displayed in a Textbox.

•Most Properties can be set at design time (in the VBE) or with code

Naming controls

•use a 3 letter prefix•good exercise on pg 213 of text

•can greatly improve the usefulness of your form•tab order begins as the order in which you placed them on

the form•you can change the TabIndex property•TabIndex starts at 0•Set TabStop to False if you don't want the user tabbing to it.•Items in a frame are indexed separately from other items on

the form.•View        TabOrder

Tab Order

Writing Event Handlers

•a GUI program (or a form) just sits there and waits for events•a subroutine written to execute when the event happens is

called an event handler•events handlers are placed in the form's code window, not a

module•when viewing a form, click View -> Code or double-click a

control•double-clicking a control will open the event handler for that

control's default event (like CommandButton1_Click)•event handlers are named controlname_EventName•try it and use the Object Browser to learn moreoRefEdit control has its own library... hard to find

Displaying a Form

•give the form a name• insert a new module and create a sub to display the form

Public Sub Display()    ' Shows the form I want to use    frmMyForm.ShowEnd Sub

•form will appear and then the event handlers take over

Example Code from text (pg.221)

Shown here is a Window XP screenshot.

Practice Form.xlsm (pg. 223)

•code for adding items to a listoFor Loop or RowSource property

•variables declared Public at the top of the code window, so they can be accessed from inside the form as well

•Useful functions: IsNumeric and IsDate to check for data validation

•can use Exit Sub if an error occurs but you still want form to be displayed

Practice Form cont'd

•use Select Case for option buttonsooptTruck.Value = True if it has been selected

•Value property of a listbox: Indicates which item was selected.oListIndex: position in the list of the selected item, base 0oIf ListIndex = -1 then no item selectedomake bulletproof code: set ListIndex = 0 in

UserForm_Initialize, forcing user to make a selection•Must Unload the form to remove it from the screen•When unloaded, the original calling sub will continue

Looping Through Controls

•have many controls on a form and you want to check all of them

•would be easy if they were in an arrayocan't be done in VBA

•so use For Each... in the collection of Controls on the form:Dim ctl As ControlFor Each ctl In Me.Controls    If TypeName(ctl) = "TextBox" Then    If ctl.Value = "" or Not IsDate(ctl) Then        MsgBox "Enter valid dates", vbInformation, "Invalid Entry"        ctl.SetFocus ' Allows user to enter data again        Exit Sub    End IfEnd IfNext

List Boxes

•two types: single and multi•use MultiSelect property•SingleoListIndex = -1 means Nothing selectedoListIndex = 3 means the 4th item was selectedolstMyList.Value will also hold the selected item

•Multiocan't use Value or ListIndexoSelected property is a 0-based array of True or False

valuesoListCount will count the items in the list

For i = 0 to lstProducts.ListCount -1    isChosen(i) = lstProducts.Selected(i)Next

Private Sub btnOk_Click()' Display the value the user has selected in the list    txtOutput.Text = lstBox.Value    txtIndexValue.Text = lstBox.ListIndexEnd Sub

Private Sub UserForm_Initialize()    ' Restore default height    Me.Height = 310.5        ' Add items to the list    lstBox.AddItem "One"    lstBox.AddItem "Two"    lstBox.AddItem ("Four")    lstBox.AddItem "Three", 2        lstExtended.AddItem ("One")    lstExtended.AddItem ("Two")    lstExtended.AddItem ("Four")    lstExtended.AddItem "Three", 2    lstExtended.AddItem "Five"    lstExtended.AddItem "Six"    lstExtended.AddItem "Seven"            ' Clear the values in the list box    lstMulti.Clear     

      ' Get values from the spreadsheet    Dim c As Range    For Each c In Worksheets("wksData").Range("defaultValues")        ' Add each item to the list        lstMulti.AddItem c.Value    Next

Private Sub btnChooseEnhanced_Click()    Dim mySelections As String    Dim isChosen() As String        ' Resize the array based on the size of items in the list    ReDim isChosen(lstExtended.ListCount)        ' Show the hidden portion of the form.    Me.Height = 396.75        ' Place the selected items in an array    For i = 0 To lstExtended.ListCount - 1        ' Check to see if the item was selected        If lstExtended.Selected(i) Then            ' If it was selected, place it in the array            isChosen(i) = lstExtended.List(i)            ' This produces gaps in the output if items were not selected.        End If    Next        ' Create a string of all the items joined together    mySelections = Join(isChosen, ", ")        txtMultiOutput.Text = mySelectionsEnd Sub

Wrap Up

•Check pg. 230 about working with Excel controls (little or no VBA)

•read the summary, work on exercises 1, 2, 4