VBA: Trigger an Event in Form Control - vba

I am working on a WBS in Excel with checkboxes.
I have the following:
[checkbox1] Level A
---------[checkBox2] item 1
---------[checkBox3] item 2
[checkbox4] Level B
---------[checkBox5] item 3
When I untick checkbox2 it will put an X in the cell next to item 1
If I tick checkbox2, it will remove the X.
If I untick checkbox1, it will untick checkbox2 and checkbox3, but it does not put an X in the cell next to the item 1 and 2. It just unticks the two checkboxes without triggering the event. How do I link that event to checkBox1?
If it is not possible to trigger that kind of event in Form Control, my other questions would be to know how to know the row and column where the checkbox is
in ActiveX Control?
In Form Control we can use sheets("sheet1").checkboxes(application.caller), but this does not work in ActiveX Control.
The code for checkbox2 or checkbox3:
Sub CheckBoxLine()
Dim ws As Worksheet
Dim chk As CheckBox
Dim lColD, myCol As Long
Dim lColChk As Long
Dim lRow As Long
Dim rngD As Range
lColD = 1 'number of columns to the right
Set ws = ActiveSheet
Set chk = ws.CheckBoxes(Application.Caller)
lRow = chk.TopLeftCell.Row
lColChk = chk.TopLeftCell.Column
Set rngD = ws.Cells(lRow, lColChk + lColD)
Select Case chk.Value
Case 1 'box is checked
rngD.Value = "X"
Case Else 'box is not checked
rngD.Value = "X"
End Select
End Sub
The code for checkbox1:
Select Case chk.Value
Case 1 'box is checked
For Each cb In ws.CheckBoxes
If cb.Name = "Check box 2" Then
cb.Value = 1
End If
If cb.Name = "Check box 3" Then
cb.Value = 1
End If
Next cb
Case Else 'box is not checked
For Each cb In ws.CheckBoxes
If cb.Name = "Check box 2" Then
cb.Value = 0
End If
If cb.Name = "Check box 3" Then
cb.Value = 0
End If
Next cb
End Select

Answer changed after clarifications.
I think there are no events for form controls. And AFAIK getting the cell where ActiveX control would be is a bit complicated. I have it done in one of my workbooks, but it required some code in an additional Class module and I do not recall how to implement it.
Since you use Form control checkboxes, I think it would be easier to use the following code, instead of employing events from newly created ActiveX checkboxes. I hope it would work as you need.
Option Explicit
Dim ws As Worksheet
Sub CheckBoxLine(Optional strChkName As String)
Dim chk As CheckBox
Dim lColD, myCol As Long
Dim lColChk As Long
Dim lRow As Long
Dim rngD As Range
lColD = 1 'number of columns to the right
If ws Is Nothing Then Set ws = ActiveSheet
If strChkName = vbNullString Then
Set chk = ws.CheckBoxes(Application.Caller)
Else
Set chk = ws.CheckBoxes(strChkName)
End If
lRow = chk.TopLeftCell.Row
lColChk = chk.TopLeftCell.Column
Set rngD = ws.Cells(lRow, lColChk + lColD)
Select Case chk.Value
Case 1 'box is checked
rngD.Value = vbNullString
Case Else 'box is not checked
rngD.Value = "X"
End Select
Set chk = Nothing
Set ws = Nothing
End Sub
Sub Code_for_Checkbox1()
Set ws = ActiveSheet
ws.CheckBoxes("Check Box 2").Value = ws.CheckBoxes(Application.Caller).Value
ws.CheckBoxes("Check Box 3").Value = ws.CheckBoxes(Application.Caller).Value
Call CheckBoxLine("Check Box 2")
Call CheckBoxLine("Check Box 3")
End Sub

Related

Selecting all check boxes in a range works only after worksheet's been open for a while

I'm using this macro to select a column range of checkboxes if a particular box is checked, and to uncheck all remaining checkboxes.
Sub SelectAll_Click_Formale_Denkstörungen()
Dim CB As CheckBox
Dim Nicht_Vorhanden As Range
Dim leichtgradige As Range
Dim mittelgradige As Range
Dim schwergradige As Range
Dim keineAussage As Range
Set Nicht_Vorhanden = Hoja2.Range("E26:E38")
Set leichtgradige = Hoja2.Range("F26:F38")
Set mittelgradige = Hoja2.Range("G26:G38")
Set schwergradige = Hoja2.Range("H26:H38")
Set keineAussage = Hoja2.Range("I26:I38")
For Each CB In Hoja2.CheckBoxes
If Not Intersect(CB.TopLeftCell, Nicht_Vorhanden) Is Nothing Then
CB.Value = Hoja2.CheckBoxes("Check Box 513").Value
End If
If Not Intersect(CB.TopLeftCell, leichtgradige) Is Nothing Then
CB.Value = -4146
End If
If Not Intersect(CB.TopLeftCell, mittelgradige) Is Nothing Then
CB.Value = -4146
End If
If Not Intersect(CB.TopLeftCell, schwergradige) Is Nothing Then
CB.Value = -4146
End If
If Not Intersect(CB.TopLeftCell, keineAussage) Is Nothing Then
CB.Value = -4146
End If
Next CB
End Sub
I'm using this very same macro in several instances of the worksheet and most of them work fine, but for a few, it leaves some of the checkboxes it's supposed to check unchecked, but it will work properly after the worksheet has been open for a few minutes. Does anyone know why this may be happening?

Displaying a cell value in a text box and moving around in excel using vba

I have an Excel sheet which contains some values in the cells A1 to A9. I have a text box and command button 1 (renamed to "previous") and command button 2 (renamed to "Next").
When I click the Next button the values in the cells from A1 to A9 should be displayed in the text box which I have in an order from A1 to A9 and when the Previous button is clicked it should behave in the reverse.
edited: added Solution "B" for Form controls
Solution A for ActiveX controls
1) double click "Previous" button and VBA gets you in the sheet code pane with
Private Sub CommandButton1_Click()'<~~ maybe your "Previous" button was not the 1st ActiveX button you inserted in the sheet so the sub title has a different number in it: don't bother and just keep it as you find it
End Sub
that you fill like follows:
Private Sub CommandButton1_Click() '<~~ remember: keep the number you already have there in the sub name
UpdateTextBox 1
End Sub
2) double click "Next" button and and VBA gets you in the sheet code pane with
Private Sub CommandButton2_Click() '<~~ maybe your "Next" button was not the 2d ActiveX button you inserted in the sheet so the sub title has a different number in it: don't bother and just keep it as you find it
End Sub
that you fill like follows:
Private Sub CommandButton2_Click()'<~~ remember: keep the number you already have there in the sub name
UpdateTextBox -1
End Sub
3) place this code in any module code pane
Option Explicit
Sub UpdateTextBox(shift As Long)
Dim found As Range, myRange As Range
Dim s As OLEObject
Dim index As Long
With ActiveSheet
Set s = .OLEObjects("TextBox1") '<~~ set the name of the ActiveX TextBox control
Set myRange = .Range("A1:A9") '<~~ set the range you want to scroll up and down
End With
index = 1 '<~~ default index position should textbox be empty or filled with non valid value
With myRange
If s.Object.Value <> "" Then '<~~ get current textbox value index in range
Set found = .Find(what:=s.Object.Value, LookIn:=xlValues, lookat:=xlWhole) '<~~ search for the current text current textbox value index in range
If Not found Is Nothing Then index = found.Row - .Rows(1).Row + 1
End If
index = index + shift '<~~ make the shift
Select Case index
Case Is > .Rows.Count
index = .Rows.Count '<~~ limit max index to range last row
Case Is < 1
index = 1 '<~~ limt min index to range first row
End Select
s.Object.Value = .Rows(index) '<~~ update textbox value
End With
End Sub
Solution B for Form controls
1) add this in any module code pane
Option Explicit
Sub SkipToNext()
UpdateTextBox2 1
End Sub
Sub SkipToPrevious()
UpdateTextBox2 -1
End Sub
Sub UpdateTextBox2(shift As Long)
Dim s As Shape
Dim found As Range, myRange As Range
Dim index As Long
With ActiveSheet
Set s = .Shapes("TextBox 1") '<~~ set the name of the Form TextBox control
Set myRange = .Range("A1:A9") '<~~ set the range you want to scroll up and down
End With
index = 1 '<~~ default index position should textbox be empty or filled with non valid value
With myRange
If s.TextFrame.Characters.Text <> "" Then '<~~ get current textbox value index in range
Set found = .Find(what:=s.TextFrame.Characters.Text, LookIn:=xlValues, lookat:=xlWhole) '<~~ search for the current text current textbox value index in range
If Not found Is Nothing Then index = found.Row - .Rows(1).Row + 1
End If
index = index + shift '<~~ make the shift
Select Case index
Case Is > .Rows.Count
index = .Rows.Count '<~~ limit max index to range last row
Case Is < 1
index = 1 '<~~ limt min index to range first row
End Select
s.TextFrame.Characters.Text = .Rows(index) '<~~ update textbox value
End With
End Sub
2) assign SkipToNext() to the "Next" button and SkipToPrevious() to the "Previous" button
Starting with a TextBox and two buttons from AutoShapes. Enter the following in a standard module:
Public WhereAmI As Long
Sub Nextt()
Dim s As Shape
Set s = ActiveSheet.Shapes("TextBox 1")
If CStr(WhereAmI) = "" Then
WhereAmI = 1
s.TextFrame.Characters.Text = Range("A1").Text
Else
If WhereAmI = 9 Then Exit Sub
WhereAmI = WhereAmI + 1
s.TextFrame.Characters.Text = Cells(WhereAmI, 1).Text
End If
End Sub
Sub Prevv()
Dim s As Shape
Set s = ActiveSheet.Shapes("TextBox 1")
If CStr(WhereAmI) = "" Then
WhereAmI = 2
s.TextFrame.Characters.Text = Range("A2").Text
Else
If WhereAmI = 1 Then Exit Sub
WhereAmI = WhereAmI - 1
s.TextFrame.Characters.Text = Cells(WhereAmI, 1).Text
End If
End Sub
Then assign Nextt() to the "Next" button and assign Prevv() to the "Previous" button:
From the above, if you click Next, gamma will be in the box. If you click Previous, alpha will be in the box.
EDIT#1:
I use the Public variable to keep track of which of the items is currently in the TextBox............that way the subs can get to the next or previous value.
All three Shapes (textbox and two buttons) are easily available from AutoShapes:
In my version of Excel, that menu is in the Insert tab. When you first start out, there will be nothing in the TextBox, that is the reason for the CStr() test.
EDIT#2:
To handle the case of having the initial value of WhereAmI being 0, use this version of Prevv():
Sub Prevv()
Dim s As Shape
Set s = ActiveSheet.Shapes("TextBox 1")
If CStr(WhereAmI) = "" Then
WhereAmI = 2
s.TextFrame.Characters.Text = Range("A2").Text
Else
If WhereAmI = 1 Then Exit Sub
If WhereAmI = 0 Then WhereAmI = 2
WhereAmI = WhereAmI - 1
s.TextFrame.Characters.Text = Cells(WhereAmI, 1).Text
End If
End Sub

Excel/VBA Macros assistance

I am having a bit of trouble with some code and was wondering if someone could maybe assist. Basically I have 2 errors which I can't work out myself (too inexperienced with VBA, unfortunately)
Brief overview:
This macro is designed to generate a new workbook with copies of selected sheets from a "source" workbook in order to present to clients as a report batch. Essentially - we have master workbook "A" which may have 50 tabs or so, and we want to quickly select a couple of sheets to "copy" into a new workbook to save and send to a client. The code is a bit of a mess but I am not really sure what is going on/what I can remove etc.
Problems:
When you run the attached code/macro in Excel, it does everything it is supposed to do, however, it ALSO copies the sheet from which you run the macro. (i.e. I might be on sheet 1 in the Workbook. Run the macro to generate reports, checkbox menu appears and I select sheets 2, 5 & 9 - it will then copy into a new Workbook sheets 2, 5 & 9 AND sheet 1. But I never selected sheet 1 from the checkbox menu...)
Once this code has finished running, I am unable to save the Excel file. It just crashes and says "Microsoft Excel has stopped working" and then the file dies and I have to close Excel and recover etc. etc. I combined 2 pieces of code to get this working and I imagine I may be missing something crucial which is causing the problem. We have another piece of code to print sheets out in a similar way to this, and if I run this I am able to save with no problems.
Code:
I have included all the Visual Basic code (i.e. for the generate reports & print sheets macros).
I really don't have any experience with VBA so I hope someone will be able to assist! Thanks in advance :)
Sub PrintSelectedSheets()
Dim i As Integer
Dim TopPos As Integer
Dim SheetCount As Integer
Dim Printdlg As DialogSheet
Dim CurrentSheet As Worksheet, wsStartSheet As Worksheet
Dim CB As CheckBox
Application.ScreenUpdating = False
'Check for protected workbook
If ActiveWorkbook.ProtectStructure Then
MsgBox "Workbook is protected.", vbCritical
Exit Sub
End If
'Add a temporary dialog sheet
Set CurrentSheet = ActiveSheet
Set wsStartSheet = ActiveSheet
Set Printdlg = ActiveWorkbook.DialogSheets.Add
SheetCount = 0
'Add the checkboxes
TopPos = 40
For i = 1 To ActiveWorkbook.Worksheets.Count
Set CurrentSheet = ActiveWorkbook.Worksheets(i)
'Skip empty sheets and hidden sheets
If Application.CountA(CurrentSheet.Cells) <> 0 And _
CurrentSheet.Visible Then
SheetCount = SheetCount + 1
Printdlg.CheckBoxes.Add 78, TopPos, 150, 16.5
Printdlg.CheckBoxes(SheetCount).Text = _
CurrentSheet.Name
TopPos = TopPos + 13
End If
Next i
'Move the OK and Cancel buttons
Printdlg.Buttons.Left = 240
'Set dialog height, width, and caption
With Printdlg.DialogFrame
.Height = Application.Max _
(68, Printdlg.DialogFrame.Top + TopPos - 34)
.Width = 230
.Caption = "Select sheets to print"
End With
'Change tab order of OK and Cancel buttons
'so the 1st option button will have the focus
Printdlg.Buttons("Button 2").BringToFront
Printdlg.Buttons("Button 3").BringToFront
'Display the dialog box
CurrentSheet.Activate
wsStartSheet.Activate
Application.ScreenUpdating = True
If SheetCount <> 0 Then
'the following code will print the selected sheets as multiple print jobs.
'continuous page numbers will therefore not be printed
If Printdlg.Show Then
For Each CB In Printdlg.CheckBoxes
If CB.Value = xlOn Then
Worksheets(CB.Caption).Activate
ActiveSheet.PrintOut
'ActiveSheet.PrintPreview 'for debugging
End If
Next CB
'the following code will print the selected sheets as a single print job.
'This will allow the sheets to be printed with continuous page numbers.
'If Printdlg.Show Then
'For Each CB In Printdlg.CheckBoxes
'If CB.Value = xlOn Then
'Worksheets(CB.Caption).Select Replace:=False
'End If
'Next CB
'ActiveWindow.SelectedSheets.PrintOut copies:=1
'ActiveSheet.Select
Else
MsgBox "No worksheets selected"
End If
'End If
End If
'Delete temporary dialog sheet (without a warning)
Application.DisplayAlerts = False
Printdlg.Delete
'Reactivate original sheet
CurrentSheet.Activate
wsStartSheet.Activate
End Sub
Sub GenerateClientExcelReports()
'1. Declare variables
Dim i As Integer
Dim SheetCount As Integer
Dim TopPos As Integer
Dim lngCheckBoxes As Long, y As Long
Dim intTopPos As Integer, intSheetCount As Integer
Dim intHor As Integer 'this will be for the horizontal position of the items
Dim intWidth As Integer 'this will be for the overall width of the dialog box
Dim intLBLeft As Integer, intLBTop As Integer, intLBHeight As Integer
Dim Printdlg As DialogSheet
Dim CurrentSheet As Worksheet, wsStartSheet As Worksheet
Dim CB As CheckBox
'Dim wb As Workbook
'Dim wbNew As Workbook
'Set wb = ThisWorkbook
'Workbooks.Add ' Open a new workbook
'Set wbNew = ActiveWorkbook
On Error Resume Next
Application.ScreenUpdating = False
'2. Check for protected workbook
If ActiveWorkbook.ProtectStructure Then
MsgBox "Workbook is protected.", vbCritical
Exit Sub
End If
'3. Add a temporary dialog sheet
Set CurrentSheet = ActiveSheet
Set wsStartSheet = ActiveSheet
Set Printdlg = ActiveWorkbook.DialogSheets.Add
SheetCount = 0
'4. Add the checkboxes
TopPos = 40
For i = 1 To ActiveWorkbook.Worksheets.Count
Set CurrentSheet = ActiveWorkbook.Worksheets(i)
'5. Skip empty sheets and hidden sheets
If Application.CountA(CurrentSheet.Cells) <> 0 And _
CurrentSheet.Visible Then
SheetCount = SheetCount + 1
Printdlg.CheckBoxes.Add 78, TopPos, 150, 16.5
Printdlg.CheckBoxes(SheetCount).Text = _
CurrentSheet.Name
TopPos = TopPos + 13
End If
Next i
'6. Move the OK and Cancel buttons
Printdlg.Buttons.Left = 240
'7. Set dialog height, width, and caption
With Printdlg.DialogFrame
.Height = Application.Max _
(68, Printdlg.DialogFrame.Top + TopPos - 34)
.Width = 230
.Caption = "Select sheets to generate"
End With
'8. Change tab order of OK and Cancel buttons
' so the 1st option button will have the focus
Printdlg.Buttons("Button 2").BringToFront
Printdlg.Buttons("Button 3").BringToFront
'9. Display the dialog box
CurrentSheet.Activate
wsStartSheet.Activate
Application.ScreenUpdating = True
If SheetCount <> 0 Then
If Printdlg.Show Then
For Each CB In Printdlg.CheckBoxes
If CB.Value = xlOn Then
Worksheets(CB.Caption).Select Replace:=False
'For y = 1 To ActiveWorkbook.Worksheets.Count
'If WorksheetFunction.IsNumber _
'(InStr(1, "ActiveWorkbook.Sheets(y)", "Contents")) = True Then
'CB.y = xlOn
'End If
End If
Next
ActiveWindow.SelectedSheets.Copy
Else
MsgBox "No worksheets selected"
End If
End If
'Delete temporary dialog sheet (without a warning)
'Application.DisplayAlerts = False
'Printdlg.Delete
'Reactivate original sheet
'CurrentSheet.Activate
'wsStartSheet.Activate
'10. Delete temporary dialog sheet (without a warning)
Application.DisplayAlerts = False
Printdlg.Delete
'11. Reactivate original sheet
CurrentSheet.Activate
wsStartSheet.Activate
Application.DisplayAlerts = True
End Sub
Sub SelectAllCheckBox()
Dim CB As CheckBox
For Each CB In ActiveSheet.CheckBoxes
If CB.Name <> ActiveSheet.CheckBoxes(1).Text Then
CB.Value = ActiveSheet.CheckBoxes(1).Value
End If
Next CB
'ActiveSheet.CheckBoxes("Check Box 1").Value
End Sub
as for problem n°1
add a declaration of a boolean variable
Dim firstSelected As Boolean
and then modify the For Each CB In Printdlg.CheckBoxes loop block code as follows
If CB.Value = xlOn Then
If firstSelected Then
Worksheets(CB.Caption).Select Replace:=False
Else
Worksheets(CB.Caption).Select
firstSelected = True
End If
'For y = 1 To ActiveWorkbook.Worksheets.Count
'If WorksheetFunction.IsNumber _
'(InStr(1, "ActiveWorkbook.Sheets(y)", "Contents")) = True Then
'CB.y = xlOn
'End If
End If
since there's always an ActiveWorksheet when macro starts and thus if you only use Worksheets(CB.Caption).Select Replace:=False statement you keep adding it to the via Printdlg selected sheets.

vba excel combo box in userform

Basically the module Onboarding is asking the path of the tracker i want to update. I am updating details in the
sheet1 of the tracker.
I am setting the values of fields in userform 'OnboardingForm' to blank(so that the values entered last time to the
form is not visible when I am opening the form this time.
Now I am opening the form 'OnboardingForm' and entering values in the subsequent fields.
I have put a check button in my userform 'OnboardingForm' which is invisible to the front end user.
Now in the tracker there is a sheet named 'Project Tracks' which has information of all current projects
Once the submit button is clicked the control will go to the tracker's 'Project Tracks' sheet. It will validate the
track entered in the userform 'OnboardingForm' with the tracks present in the tracker's 'Project Tracks' sheet. Once found the other details against that particular track will get fetched to the tracker's sheet1(this I have done so that I will not have to enter values manually to the userform 'OnboardingForm' so that the form looks simple). There are no chances of the track not
matching.
Now one command button new track has been put in my current userform 'OnboardingForm'. Once clicked this will take the control to
the userform2 'ProjectTracksForm'.This is basically put so that if I am adding a new track, the form takes the detail and enters in the
tracker's 'Project Tracks' sheet.
Question 1> My current userform's Track button is a combo box. How do I add values in the dropdown from the tracker's
'Project Tracker' sheet to the dropdown.
Question 2> Once I add a new track in userform2 'ProjectTracksForm',submit and then when I come back to my current
userform 'OnboardingForm' that added track should be shown in the dropdown of Track combo box.
Please find below my piece of code.
This is my module for onboarding
Public Sub OnBoarding()
On Error GoTo ErrorHandler
Dim Owb As Object
Dim ran As Range
strTalentTrackerPath = shTracker.Cells(2, 2).Value
'Default the form values to null
With OnboardingForm
.combTrackofWork.Value = ""
.txtFirstName.Text = ""
.txtLastName.Text = ""
.combResCat.Value = ""
.combBFTE.Value = ""
.combLevel.Value = ""
.combLocType = ""
.txtAccessInfo.Text = ""
End With
OnboardingForm.Show
SetFocus.combTrackofWork
With OnboardingForm
'Details to be entered in the form'
strTOW = Trim$(.combTrackofWork.Value)
strFN = Trim$(.txtFirstName.Text)
strLN = Trim$(.txtLastName.Text)
strResCat = Trim$(.combResCat.Value)
strBilFTE = Trim$(.combBFTE.Value)
strLevel = Trim$(.combLevel.Value)
strLocType = (.combLocType.Value)
strAccessInfo = (.txtAccessInfo.Text)
End With
If OnboardingForm.chkOKButtonClick = True Then
Set oExcel = New Excel.Application
strMyFolder = strTalentTrackerPath
Set Owb = oExcel.Workbooks.Open(strMyFolder)
IntRowCount = Owb.Sheets(1).UsedRange.Rows.Count
With Owb.Sheets(1)
With Owb.Sheets("Project Tracks")
IntTrackRowCount = .UsedRange.Rows.Count
For IntCurrentRow = 1 To IntTrackRowCount
If .Cells(IntCurrentRow, 1) = strTOW Then
Owb.Sheets(1).Cells(IntRowCount + 1, OnboardingFormcolumn.colTrackofWork) _
= .Cells(IntCurrentRow, ProjectTrackscolumn.colTrack)
Owb.Sheets(1).Cells(IntRowCount + 1, OnboardingFormcolumn.colBPO) = .Cells _
(IntCurrentRow, ProjectTrackscolumn.colBPO)
Owb.Sheets(1).Cells(IntRowCount + 1, OnboardingFormcolumn.colCostCenter) _
= .Cells(IntCurrentRow, ProjectTrackscolumn.colCostCenter)
Owb.Sheets(1).Cells(IntRowCount + 1, OnboardingFormcolumn.colGroup) _
= .Cells(IntCurrentRow, ProjectTrackscolumn.colGroup)
Exit For
End If
Next
End With
End With
.Cells(IntRowCount + 1, OnboardingFormcolumn.colTrackofWork) = strTOW
.Cells(IntRowCount + 1, OnboardingFormcolumn.colFirstName) = strFN
.Cells(IntRowCount + 1, OnboardingFormcolumn.colLastName) = strLN
.Cells(IntRowCount + 1, OnboardingFormcolumn.colResourceCategory) = strResCat
.Cells(IntRowCount + 1, OnboardingFormcolumn.colBilledFTE) = strBilFTE
.Cells(IntRowCount + 1, OnboardingFormcolumn.colLevel) = strLevel
.Cells(IntRowCount + 1, OnboardingFormcolumn.colLocationType) = strLocType
.Cells(IntRowCount + 1, OnboardingFormcolumn.colAccessInformation) = strAccessInfo
Owb.Close True
Set Owb = Nothing
Set oExcel = Nothing
Else
Exit Sub
End If
Exit Sub
ErrorHandler:
If Owb Is Nothing Then
Else
Owb.Close False
End If
If oExcel Is Nothing Then
Else
Set oExcel = Nothing
End If
MsgBox "Unhandled Error. Please Report" & vbCrLf & "Error Description: " & _
Err.Description, vbExclamation
End Sub
This is for cancel button of Onboarding Form
Private Sub cmdbtn_Cancel_Click()
OnboardingForm.Hide
MsgBox ("No data entered")
End Sub
This is for OnboardingForm submit button
Private Sub cmdbtn_Submit_Click()
If Trim(OnboardingForm.combTrackOfWork.Value) = "" Then
OnboardingForm.combTOW.SetFocus
MsgBox ("Track of Work cannot be blank")
Exit Sub
End If
If Trim(OnboardingForm.txtFirstName.Value) = "" Then
OnboardingForm.txtFN.SetFocus
MsgBox ("First name cannot be blank")
Exit Sub
End If
If Trim(OnboardingForm.txtLastName.Value) = "" Then
OnboardingForm.txtLN.SetFocus
MsgBox ("Last name cannot be blank")
Exit Sub
End If
End Sub
Module for Project Tracks
Public Sub prjctTracks()
On Error GoTo ErrorHandler
Dim Owb As Object
strTalentTrackerPath = shTracker.Cells(2, 2).Value
With ProjectTracksForm
.txtTOW = ""
.txtBPO = ""
.txtCOCE = ""
.txtSOW = ""
.txtGroup = ""
End With
ProjectTracksForm.Show
With ProjectTracksForm
strTOW = Trim$(.txtTOW.Text)
strBPO = Trim$(.txtBPO.Text)
strCOCE = Trim$(.txtCOCE.Text)
strSOW = Trim$(.txtSOW.Value)
strGroup = Trim$(.txtGroup.Value)
End With
ProjectTracksForm.Hide
If ProjectTracksForm.chkbtn_OKclick = True Then
Set oExcel = New Excel.Application
strMyFolder = strTalentTrackerPath
Set Owb = oExcel.Workbooks.Open(strMyFolder)
With Owb.Sheets("Project Tracks")
intUsedRowCount = .UsedRange.Rows.Count
.Cells(intUsedRowCount + 1, Trackscolumn.colTrack) = strTOW
.Cells(intUsedRowCount + 1, Trackscolumn.colBPO) = strBPO
.Cells(intUsedRowCount + 1, Trackscolumn.colCostCenter) = strCOCE
.Cells(intUsedRowCount + 1, Trackscolumn.colSOW) = strSOW
.Cells(intUsedRowCount + 1, Trackscolumn.colGroup) = strGroup
End With
Owb.Close True
Set Owb = Nothing
Set oExcel = Nothing
Else
Exit Sub
End If
Exit Sub
ErrorHandler:
If Owb Is Nothing Then
Else
Owb.Close False
End If
If oExcel Is Nothing Then
Else
Set oExcel = Nothing
End If
MsgBox "Unhandled Error. Please Report" & vbCrLf & "Error Description: " & _
Err.Description, vbExclamation
End Sub
Question 1> My current userform's Track button is a combo box. How do
I add values in the dropdown from the tracker's 'Project Tracker'
sheet to the dropdown.
I am calling the combobox "ComboBox1" in this example
The Range to place in the combobox would look like this...
The code to populate the combobox would be in the Userform Module.
Private Sub UserForm_Initialize()
Dim LstRw As Long
Dim Rng As Range
Dim ws As Worksheet
Set ws = Sheets("Project Tracker")
With ws
LstRw = .Cells(.Rows.Count, 1).End(xlUp).Row
Set Rng = .Range("A2:A" & LstRw)
End With
ComboBox1.List = Rng.Value
End Sub
Question 2> Once I add a new track in userform2
'ProjectTracksForm',submit and then when I come back to my current
userform 'OnboardingForm' that added track should be shown in the
dropdown of Track combo box
When you activate your userform again, you can clear the combobox and repopulate it with the new list.
Private Sub UserForm_Activate()
Dim LstRw As Long
Dim Rng As Range
Dim ws As Worksheet
Set ws = Sheets("Project Tracker")
With ws
LstRw = .Cells(.Rows.Count, 1).End(xlUp).Row
Set Rng = .Range("A2:A" & LstRw)
End With
ComboBox1.Clear
ComboBox1.List = Rng.Value
End Sub
I assume that somewhere you would have a code that will add a new item to the List in sheet("Project Tracker"),
Something like:
Private Sub CommandButton1_Click()
'THIS IS IN THE OTHER USERFORM
'add item to first blank cell in column A sheets("Project Tracker")
Dim sh As Worksheet
Dim LstRws As Long
Set sh = Sheets("Project Tracker")
With sh
LstRws = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
.Cells(LstRws, 1) = "SomeThingNew" 'whatever you are adding to the list
End With
End Sub
The code will add something new to the list in your worksheet.
When you show the form again, the new item will be in the combobox.
You can either use a Button, Combobox event, textbox event, to add the item to the new list.

How to select specific form control checkboxes in Excel?

I am working in Excel 2010.
I have set up 10 form control checkboxes in my worksheet, and I want to automatically select a certain set of the checkboxes. All previous posts that I have seen on this topic cover selecting all checkboxes or unselecting all checkboxes.
Here is the VBA code from a previous post for unselecting all checkboxes:
Sub clearcheck()
Dim sh As Worksheet For Each sh In Sheets
On Error Resume Next
sh.CheckBoxes.Value = False
On Error GoTo 0 Next sh
End Sub
Here is the updated code based on this chain, but it is still running into a syntactical issue as well as an unidentified sub:
Sub highengagedonline()
Dim cb As CheckBox, sht As Worksheet
Set sht = Worksheets("Graph")
For Each cb In sht.CheckBoxes
If cb.Name = "Check Box 35" or _
cb.Name = "Check Box 36" or _
cb.Name = "Check Box 37" or _
cb.Name = "Check Box 38" or _
cb.Name = "Check Box 39" Then
cb.Value = 1
Else: cb.Value = 0
End If
Next cb
End Sub
Try something along the lines of:
Sub ClearCheck()
Dim cb As CheckBox, sht As Worksheet
Set sht = Worksheets("Sheet1")
For Each cb In sht.CheckBoxes
If cb.Name = "Check Box 1" Then
cb.Value = 1
Else if cb.Name = "Check Box 2" Then
cb.Value = 0
End If
Next cb
End Sub