Looping VBA Case Statement
-
01-07-2021 - |
Frage
Currently I have the same code in each Case statement and sometimes I have to repeat it 50 times, is there a way to simplify this: For each one I am having to create 40 frames each one names VarFrame1...VarFrame40 as well I am creating this code in Visual Basic 6.5 in Excel
For iVar = 1 To nrVars
Select Case iVar
Case 1
VarFrame1.Caption = varInfo(iVar).varName
VarFrame1.Top = lastRow
VarFrame1.Left = leftMargin
VarFrame1.Height = 12
VarFrame1.Visible = True
Case 2
VarFrame2.Caption = varInfo(iVar).varName
VarFrame2.Top = lastRow
VarFrame2.Left = leftMargin
VarFrame2.Height = 12
VarFrame2.Visible = True
.... to Case 50
End Select
lastRow = lastRow + 15
Dim res As Boolean
Select Case varInfo(iVar).varType
Case "RadioButton"
nrOptionButtonVals = nrOptionButtonVals + 1
res = SetUpOptionButtons(lastRow, iVar, nrOptionButtonVals, varInfo(iVar).varOptions, varInfo(iVar).varOptionText, False)
Case "RadioButtonOther"
nrOptionButtonVals = nrOptionButtonVals + 1
res = SetUpOptionButtons(lastRow, iVar, nrOptionButtonVals, varInfo(iVar).varOptions, varInfo(iVar).varOptionText, True)
Case "DropDown"
res = SetUpDropDown(lastRow, iVar, varInfo(iVar).varOptions, varInfo(iVar).varOptionText)
Case "CheckBox"
nrCBButtonVals = nrCBButtonVals + 1
res = SetUpCBButtons(lastRow, iVar, nrCBButtonVals, varInfo(iVar).varOptions, varInfo(iVar).varOptionText, False)
Case "CheckBoxOther"
nrCBButtonVals = nrCBButtonVals + 1
res = SetUpCBButtons(lastRow, iVar, nrCBButtonVals, varInfo(iVar).varOptions, varInfo(iVar).varOptionText, True)
Case "TextEntry"
res = SetUpTextEntry(lastRow, iVar, varInfo(iVar).varType, varInfo(iVar).varOptions, varInfo(iVar).varOptionText)
Case "DateEntry"
res = SetUpTextEntry(lastRow, iVar, varInfo(iVar).varType, varInfo(iVar).varOptions, varInfo(iVar).varOptionText)
Case "NumberEntry"
res = SetUpTextEntry(lastRow, iVar, varInfo(iVar).varType, varInfo(iVar).varOptions, varInfo(iVar).varOptionText)
End Select
lastRow = lastRow + 10
Next iVar
QuitButton.Top = lastRow
lastRow = lastRow + 30
PhraseDisplay.Height = lastRow + 50
DisplayCorrectedPhrase
SetUpForm = True
End Sub
Updated with Tim Williams Comments:
Public Function SetUpForm(ByRef thePhrase As String) As Boolean
Dim nrVars, iVar, lastRow As Integer
nrVars = Utilities.getNrPhraseVariables(thePhrase)
ReDim varInfo(0 To nrVars)
PhraseBoxOriginal.Text = thePhrase
For iVar = 1 To nrVars
varInfo(iVar).varName = Utilities.getPhraseVariable(thePhrase, iVar)
varInfo(iVar).varIndex = PhraseVars.getPhraseVarIndex(varInfo(iVar).varName)
varInfo(iVar).varType = PhraseVars.getTypeFromIndex(varInfo(iVar).varIndex)
varInfo(iVar).varOptions = PhraseVars.getOptionsFromIndex(varInfo(iVar).varIndex)
varInfo(iVar).varOptionText = PhraseVars.getOptionTextFromIndex(varInfo(iVar).varIndex)
varInfo(iVar).varValue = Utilities.getVarOption("", 0) ' Get the default option string
Next iVar
nrOptionButtonVals = 0
lastRow = 115
For iVar = 1 To nrVars
With Me.Controls("VarFrame" & iVar)
.Caption = varInfo(iVar).varName
.Top = lastRow
.Left = leftMargin
.Height = 12
.Visible = True
End With
Next iVar
lastRow = lastRow + 15
Dim res As Boolean
Select Case varInfo(iVar).varType
Case "RadioButton"
nrOptionButtonVals = nrOptionButtonVals + 1
res = SetUpOptionButtons(lastRow, iVar, nrOptionButtonVals, varInfo(iVar).varOptions, varInfo(iVar).varOptionText, False)
Case "RadioButtonOther"
nrOptionButtonVals = nrOptionButtonVals + 1
res = SetUpOptionButtons(lastRow, iVar, nrOptionButtonVals, varInfo(iVar).varOptions, varInfo(iVar).varOptionText, True)
Case "DropDown"
res = SetUpDropDown(lastRow, iVar, varInfo(iVar).varOptions, varInfo(iVar).varOptionText)
Case "CheckBox"
nrCBButtonVals = nrCBButtonVals + 1
res = SetUpCBButtons(lastRow, iVar, nrCBButtonVals, varInfo(iVar).varOptions, varInfo(iVar).varOptionText, False)
Case "CheckBoxOther"
nrCBButtonVals = nrCBButtonVals + 1
res = SetUpCBButtons(lastRow, iVar, nrCBButtonVals, varInfo(iVar).varOptions, varInfo(iVar).varOptionText, True)
Case "TextEntry"
res = SetUpTextEntry(lastRow, iVar, varInfo(iVar).varType, varInfo(iVar).varOptions, varInfo(iVar).varOptionText)
Case "DateEntry"
res = SetUpTextEntry(lastRow, iVar, varInfo(iVar).varType, varInfo(iVar).varOptions, varInfo(iVar).varOptionText)
Case "NumberEntry"
res = SetUpTextEntry(lastRow, iVar, varInfo(iVar).varType, varInfo(iVar).varOptions, varInfo(iVar).varOptionText)
End Select
lastRow = lastRow + 10
Next iVar
QuitButton.Top = lastRow
lastRow = lastRow + 30
PhraseDisplay.Height = lastRow + 50
DisplayCorrectedPhrase
SetUpForm = True
End Sub
Lösung
For iVar = 1 To nrVars
With Me.Controls("VarFrame" & iVar)
.Caption = varInfo(iVar).varName
.Top = lastRow
.Left = leftMargin
.Height = 12
.Visible = True
End With
Next iVar
Andere Tipps
A couple of options: 1. Use an array of controls added at runtime. 2. At startup add each of these controls to a list and then you just have to iterate over the list.
You'll want to have all your frames in one collection so you can iterate over them and initialize them with something like this:
Sub initFrame(ByRef frame as VarFrame)
frame.Caption = varInfo(iVar).varName
frame.Top = lastRow
frame.Left = leftMargin
frame.Height = 12
frame.Visible = True
End Sub
For Each element As VarFrame In frames
initFrame(element)
Next
That way if you are initializing many frames the same way you don't have to duplicate code.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow