Erase Previously selected data - vba

I am currently working on a drawing generating code for AutoCAD, in order for the drawing to be generated certain options have to be chosen , and when a wrong option is chosen the person can be able to click on back to go and rectify the option. Here is my code below, the problem is that the code does not erase the previously selected data when "back" is clicked, for example, if I choose "SBPP" the click enter and it takes me to "Louvres" option, then I want to go back and change from "SBPP" to "STD Piping", the previously selected "SBPP" must be erased :
Sub DWG ()
Pump: ans = InputBox("1 = STD Piping" & vbCrLf & _
"2 = Omit Pump" & vbCrLf & _
"3 = SBPP", "Pump Piping")
Select Case ans
Case "1":
: Set layerObj = ThisDrawing.Layers.Add("PUMP_PIPING_" & Size)
layerObj.LayerOn = True
Case "2":
: Set layerObj = ThisDrawing.Layers.Add("OMIT_PUMP_" & Size)
layerObj.LayerOn = True
Case "3":
: Set layerObj = ThisDrawing.Layers.Add("STBP_" & Size)
layerObj.LayerOn = True
Case Else: MsgBox "Wrong Input Dude.", vbCritical, MSG: Exit Sub
End Select
'______________________________________________________________________________
'Option for Louvres
Louver: ans = InputBox("1 = STD Louvers" & vbCrLf & _
"2 = IND louvers" & vbCrLf & _
"3 = Back ", "Pump Piping")
Select Case ans
Case "1":
: Set layerObj = ThisDrawing.Layers.Add("LOUVRES_STD")
layerObj.LayerOn = True
Case "2":
: Set layerObj = ThisDrawing.Layers.Add("LOUVRES_INDUS")
layerObj.LayerOn = True
Case "3":
If ans = 3 Then
GoTo Pump
End If
Case Else: MsgBox "Wrong Input Dude.", vbCritical, MSG: Exit Sub
End Select
End Sub
How can I modify this code so that when "back" is clicked it erases previously selected data?

This is a flow logic problem. You must use cycles to accomplish your target. "Undoing" your previous options was not defined by you, I'm guessing:
Sub DWG()
Dim ans1 As String, ans2 As String, err_msg As String
Do 'This cycle will begin and repeat when [Back] is choosen
Select Case ans1 'Undo previous operation
Case 1
ThisDrawing.Layers("PUMP_PIPING_" & size).Delete
Case "2"
ThisDrawing.Layers.Add("OMIT_PUMP_" & size).Delete
Case "3"
ThisDrawing.Layers.Add("STBP_" & size).Delete
End Select
err_msg = ""
Do 'This cycle will repeat until first answer is accepted
ans1 = InputBox(err_msg & _
"1 = STD Piping" & vbCrLf & _
"2 = Omit Pump" & vbCrLf & _
"3 = SBPP", "Pump Piping")
Select Case ans1
Case "1"
Set layerObj = ThisDrawing.Layers.Add("PUMP_PIPING_" & size)
layerObj.LayerOn = True
Case "2"
Set layerObj = ThisDrawing.Layers.Add("OMIT_PUMP_" & size)
layerObj.LayerOn = True
Case "3"
Set layerObj = ThisDrawing.Layers.Add("STBP_" & size)
layerObj.LayerOn = True
Case "" '[Cancel] button
Exit Sub
Case Else
err_msg = "Wrong Input Dude." & vbCrLf & vbCrLf
ans1 = ""
End Select
Loop While ans1 = ""
err_msg = ""
Do
ans2 = InputBox(err_msg & _
"1 = STD Louvers" & vbCrLf & _
"2 = IND louvers" & vbCrLf & _
"3 = Back ", "Pump Piping")
Select Case ans2
Case "1"
Set layerObj = ThisDrawing.Layers.Add("LOUVRES_STD")
layerObj.LayerOn = True
Case "2"
Set layerObj = ThisDrawing.Layers.Add("LOUVRES_INDUS")
layerObj.LayerOn = True
Case "3"
'Do nothing, loop control
Case "" '[Cancel] button
Exit Sub
Case Else
err_msg = "Wrong Input Dude." & vbCrLf & vbCrLf
ans2 = ""
End Select
Loop While ans2 = ""
Loop While ans2 = "3"
End Sub
Also made some changes:
Handle [Cancel] button;
Merged error messages in input box, so user doesn't have to press a lot a buttons when a mistake is done;
Made a more traditional code formatting
Part II - "Ask before doing" alternative
Sub DWG()
Dim ans1, ans2
ans1 = Choose(Val(InputBox("1 = STD Piping" & vbCrLf & "2 = Omit Pump" & vbCrLf & "3 = SBPP", "Pump Piping")), "PUMP_PIPING_", "PUMP_PIPING_", "PUMP_PIPING_")
If IsNull(ans1) Then MsgBox "Wrong Input Dude.": Exit Sub
ans2 = Choose(Val(InputBox("1 = STD Louvers" & vbCrLf & "2 = IND louvers")), "LOUVRES_STD", "LOUVRES_INDUS")
If IsNull(ans2) Then MsgBox "Wrong Input Dude.": Exit Sub
ThisDrawing.Layers.Add(ans1 & Size).LayerOn = True
ThisDrawing.Layers.Add(ans2).LayerOn = True
End Sub

Related

Content Control not recognizing content

I was hoping someone could help me work out why the the 'F' value in my code below continues to include my error label in the ErrorMessage String when the Count value is 5?
In the document, the content control contains text just like all the other controls (which work perfectly) but this content Control text value is not being recognised in the VBA code to map error labels.
Have tried just replacing the control and checking the properties match. Debug messages suggest the the value is just being set to the default Content Control Value of "Click or Tap here to input text".
Private Sub Create_Click()
Dim oCC As ContentControl
Dim oCC2 As ContentControl
Dim Mandatory(9) As String
Dim ErrorMessage As String
Dim ErrorCount As Integer
Dim ErrorLabel(9) As String
Dim objDoc As Document
Dim strFilename As String
Dim strFileString As String
Dim Number As String
Mandatory(0) = "A"
Mandatory(1) = "B"
Mandatory(2) = "C"
Mandatory(3) = "D"
Mandatory(4) = "E"
Mandatory(5) = "F"
Mandatory(6) = "G"
Mandatory(7) = "H"
Mandatory(8) = "I"
ErrorLabel(0) = "A Label"
ErrorLabel(1) = "B Label"
ErrorLabel(2) = "C Label"
ErrorLabel(3) = "D Label"
ErrorLabel(4) = "E Label"
ErrorLabel(5) = "F Label"
ErrorLabel(6) = "G Label"
ErrorLabel(7) = "H Label"
ErrorLabel(8) = "I Label"
ErrorMessage = ""
ErrorMessage = "The following mandatory fields are missing: "
For Count = 0 To 8
Set oCC = ActiveDocument.SelectContentControlsByTitle(Mandatory(Count)).Item(1)
MsgBox (oCC.Range.Text)
If Count = 0 Then
Number = ActiveDocument.SelectContentControlsByTitle(Mandatory(Count)).Item(1).Range.Text
End If
If oCC.Range.Text = "Click or tap here to enter text." Or oCC.Range.Text = "0.00" Then
ErrorMessage = ErrorMessage & vbCrLf & vbCrLf & "- " & ErrorLabel(Count)
MsgBox (oCC.Range.Text)
ErrorCount = ErrorCount + 1
End If
Next Count
If ErrorCount > 0 Then
MsgBox (ErrorMessage)
Else
strFileString = Number
MsgBox (strFileString)
strFilename = "Some Text Here" & " - " & strFileString & ".pdf"
With ActiveDocument
NewPath = .Path & "\" & strFilename
.SaveAs2 FileName:=NewPath, FileFormat:=wdFormatPDF
.ExportAsFixedFormat OutputFileName:=strFilename, ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=True, OptimizeFor:=wdExportOptimizeForPrint, _
Range:=wdExportAllDocument, Item:=wdExportDocumentContent
End With
End If
End Sub
Check there are no other content controls with the same title in the document.
I couldn't test your code for lack of data but from your description I guess that the ErrorMessage must be reset with each loop since it will be changed when used and would naturally retain the modified version thereafter.
Except for what follows the loop, I looked closely at your code in order to understand it. Perhaps, the changes I made will be of some use to you.
Option Explicit
Private Sub Create_Click()
Dim Doc As Document
Dim Mandatory() As String
Dim ErrorMessage As String
Dim ErrorCount As Integer
Dim strFilename As String
Dim strFileString As String ' this appears identical with 'Number'
Dim Number As String
Dim Count As Integer ' loop counter
Set Doc = ActiveDocument
Mandatory = Split("A B C D E F G H I")
Number = Doc.SelectContentControlsByTitle(Mandatory(0))(1).Range.Text
For Count = 1 To UBound(Mandatory) + 1
ErrorMessage = "The following mandatory fields are missing: "
With Doc.SelectContentControlsByTitle(Mandatory(Count))(1).Range
MsgBox "Number = " & Number & vbCr & .Text
If .Text = "Click or tap here to enter text." Or _
.Text = "0.00" Then
ErrorMessage = ErrorMessage & vbCrLf & vbCrLf & "- " & Mandatory(Count) & " Label"
MsgBox (.Text)
ErrorCount = ErrorCount + 1
End If
End With
If Count = 1 Then Exit For
Next Count
If ErrorCount > 0 Then
MsgBox (ErrorMessage)
Else
strFileString = Number
MsgBox (strFileString)
strFilename = "Some Text Here" & " - " & strFileString & ".pdf"
With Doc
NewPath = .Path & "\" & strFilename
.SaveAs2 FileName:=NewPath, FileFormat:=wdFormatPDF
.ExportAsFixedFormat OutputFileName:=strFilename, _
ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=True, _
OptimizeFor:=wdExportOptimizeForPrint, _
Range:=wdExportAllDocument, _
Item:=wdExportDocumentContent
End With
End If
End Sub
You can have VBA add the useful (some would say necessary) Option Explicit to all new code modules automatically. Select Tools > Options in the VBE window and check "Require Variable Declaration" on the Editor tab.

List FormatConditions of all controls on an Access form

Is it possible to list the conditional formatting of all controls on a form? I'd like to be able to list out all existing conditions so that I can generate code to add/remove the existing conditions. I have inherited some complex forms and want to know what I'm dealing with and then generate some code to toggle the conditional formatting in areas where it is slowing down navigating a continuous form.
This Excel VBA example shows a similar format I'd like to have for Access.
https://stackoverflow.com/a/52204597/1898524
Only textboxes and comboboxes have Conditional Formatting.
There is no single property that can be listed to show a control's conditional formatting rule(s). Each rule has attributes that can be listed. Example of listing for a single specific control:
Private Sub Command25_Click()
Dim x As Integer
With Me.tbxRate
For x = 0 To .FormatConditions.Count - 1
Debug.Print .FormatConditions(x).BackColor
Debug.Print .FormatConditions(x).Expression1
Debug.Print .FormatConditions(x).FontBold
Next
End With
End Sub
The output for this example:
2366701
20
False
These are attributes for a rule that sets backcolor to red when field value is greater than 20.
Yes, code can loop through controls on form, test for textbox and combobox types, determine if there are CF rules and output attributes.
With some inspiration from #June7's example and some code from an article I found by Garry Robinson, I wrote a procedure that answers my question.
Here's the output in the Immediate window. This is ready to be pasted into a module. The design time property values are shown as a comment.
txtRowColor.FormatConditions.Delete
txtRowColor.FormatConditions.Add acExpression, acBetween, "[txtCurrent_Equipment_List_ID]=[txtEquipment_List_ID]"
With txtRowColor.FormatConditions.Item(txtRowColor.FormatConditions.Count-1)
.Enabled = True ' txtRowColor.Enabled=False
.ForeColor = 0 ' txtRowColor.ForeColor=-2147483640
.BackColor = 10092543 ' txtRowColor.BackColor=11850710
End With
You can test this sub from a click event on an open form. I was getting some false positives when checking the Boolean .Enabled property, even when I store the values into Boolean variables first. I don't know why and am researching it, but that is beyond the scope of this question.
Public Sub ListConditionalFormats(frmForm As Form)
' Show all the Textbox and Combobox controls on the passed form object (assuming the form is open).
' Output the FormatCondtion properties to the immediate window in a format that is
' suitable to be copied into VBA to recreate the conditional formatting.
' The design property value is shown as a comment on each condition property row.
Dim ctl As Control
Dim i As Integer
Dim bolControlEnabled As Boolean
Dim bolFormatEnabled As Boolean
On Error GoTo ErrorHandler
For Each ctl In frmForm.Controls
If TypeOf ctl Is TextBox Or TypeOf ctl Is ComboBox Then
With ctl
If .FormatConditions.Count > 0 Then
'Debug.Print vbCr & "' " & ctl.Name, "Count = " & .FormatConditions.Count
For i = 0 To .FormatConditions.Count - 1
' Generate code that can recreate each FormatCondition
Debug.Print ctl.Name & ".FormatConditions.Delete"
Debug.Print ctl.Name & ".FormatConditions.Add " & DecodeType(.FormatConditions(i).Type) _
& ", " & DecodeOp(.FormatConditions(i).Operator) _
& ", """ & Replace(.FormatConditions(i).Expression1, """", """""") & """" _
& IIf(Len(.FormatConditions(i).Expression2) > 0, ", " & .FormatConditions(i).Expression2, "")
Debug.Print "With " & ctl.Name & ".FormatConditions.Item(" & ctl.Name & ".FormatConditions.Count-1)"
bolControlEnabled = ctl.Enabled
bolFormatEnabled = .FormatConditions(i).Enabled
'Debug.Print bolControlEnabled <> bolFormatEnabled, bolControlEnabled, bolFormatEnabled
If bolControlEnabled <> bolFormatEnabled Then ' <- This sometimes fails. BS 2/9/2020
'If ctl.Enabled <> .FormatConditions(i).Enabled Then ' <- This sometimes fails. BS 2/9/2020
Debug.Print vbTab & ".Enabled = " & .FormatConditions(i).Enabled; Tab(40); "' " & ctl.Name & ".Enabled=" & ctl.Enabled
End If
If ctl.ForeColor <> .FormatConditions(i).ForeColor Then
Debug.Print vbTab & ".ForeColor = " & .FormatConditions(i).ForeColor; Tab(40); "' " & ctl.Name & ".ForeColor=" & ctl.ForeColor
End If
If ctl.BackColor <> .FormatConditions(i).BackColor Then
Debug.Print vbTab & ".BackColor = " & .FormatConditions(i).BackColor; Tab(40); "' " & ctl.Name & ".BackColor=" & ctl.BackColor
End If
If ctl.FontBold <> .FormatConditions(i).FontBold Then
Debug.Print vbTab & ".FontBold = " & .FormatConditions(i).FontBold; Tab(40); "' " & ctl.Name & ".FontBold=" & ctl.FontBold
End If
If ctl.FontItalic <> .FormatConditions(i).FontItalic Then
Debug.Print vbTab & ".FontItalic = " & .FormatConditions(i).FontItalic; Tab(40); "' " & ctl.Name & ".FontItalic=" & ctl.FontItalic
End If
If ctl.FontUnderline <> .FormatConditions(i).FontUnderline Then
Debug.Print vbTab & ".FontUnderline = " & .FormatConditions(i).FontUnderline; Tab(40); "' " & ctl.Name & ".FontUnderline=" & ctl.FontUnderline
End If
If .FormatConditions(i).Type = 3 Then ' acDataBar
Debug.Print vbTab & ".LongestBarLimit = " & .FormatConditions(i).LongestBarLimit
Debug.Print vbTab & ".LongestBarValue = " & .FormatConditions(i).LongestBarValue
Debug.Print vbTab & ".ShortestBarLimit = " & .FormatConditions(i).ShortestBarLimit
Debug.Print vbTab & ".ShortestBarValue = " & .FormatConditions(i).ShortestBarValue
Debug.Print vbTab & ".ShowBarOnly = " & .FormatConditions(i).ShowBarOnly
End If
Debug.Print "End With" & vbCr
Next
End If
End With
End If
Next
Beep
Exit_Sub:
Exit Sub
ErrorHandler:
MsgBox "Error #" & Err.Number & " - " & Err.Description & vbCrLf & "in procedure ListConditionalFormats" _
& IIf(Erl > 0, vbCrLf & "Line #: " & Erl, "")
GoTo Exit_Sub
Resume Next
Resume
End Sub
Function DecodeType(TypeProp As Integer) As String
' You heed this are there are 4 different ways to setup a CondtionalFormat
' https://vb123.com/listing-conditional-formats
Select Case TypeProp
Case 0
DecodeType = "acFieldValue"
Case 1
DecodeType = "acExpression"
Case 2
DecodeType = "acFieldHasFocus"
Case 3
DecodeType = "acDataBar"
End Select
End Function
Function DecodeOp(OpProp As Integer) As String
' You need this becuase equations can comprise of = > <> between
' https://vb123.com/listing-conditional-formats
Select Case OpProp
Case 0
DecodeOp = "acBetween"
Case 1
DecodeOp = "acNotBetween"
Case 2
DecodeOp = "acEqual"
Case 3
DecodeOp = "acNotEqual"
Case 4
DecodeOp = "acGreaterThan"
Case 5
DecodeOp = "acLessThan"
Case 6
DecodeOp = "acGreaterThanOrEqual"
Case 7
DecodeOp = "acLessThanOrEqual"
End Select
End Function

Automatically Enter Answer on InputBox

Hi How would I run a macro on excel that automatically inserts and "enters" the answer on the inputbox on AutoCad without having to manually do it myself. How would I have to modify my code below:
Sub DWG ()
Pump: ans = InputBox("1 = STD Piping" & vbCrLf & _
"2 = Omit Pump" & vbCrLf & _
"3 = SBPP", "Pump Piping")
Select Case ans
Case "1":
: Set layerObj = ThisDrawing.Layers.Add("PUMP_PIPING_" & Size)
layerObj.LayerOn = True
Case "2":
: Set layerObj = ThisDrawing.Layers.Add("OMIT_PUMP_" & Size)
layerObj.LayerOn = True
Case "3":
: Set layerObj = ThisDrawing.Layers.Add("STBP_" & Size)
layerObj.LayerOn = True
Case Else: MsgBox "Wrong Input Dude.", vbCritical, MSG: Exit Sub
End Select
You cannot "enter" a Inputbox automatically in an easy way - and even if it would be possible I think you shouldn't - your code will get a nightmare.
You could pass the "made" choice as an optional parameter to your routine and show the InputBox only if the parameter was omitted:
Sub DWG(Optional answer As String = "")
If answer = "" Then
answer = InputBox("1 = STD Piping" & vbCrLf & _
"2 = Omit Pump" & vbCrLf & _
"3 = SBPP", "Pump Piping")
End If
select case answer
....
end sub
However that will not save you from going thru all your code.

Returning prompt value

Hi i'm working on a code that will return a prompt value of each case to a cell ("A1") but I can't seem to get it right, for example if I choose "case 1", I want the value on cell "A1" to be "1 - FCI18-0", is there a way to do this?. Here is my code below :
Sub TestFunction()
ans = InputBox("1 = FCI18-0" & vbCrLf & _
"2 = FCI18-1" & vbCrLf & _
"3 = FCI18-2" & vbCrLf & _
"4 = FCI18-3", "Model")
Sheets("Sheet1").Range("a1").Value = InputBoxPrompt
End Sub
Please help
How about:
Sub TestFunction()
'Declare variables
Dim test(3) As String
Dim i as long
'Set array with cases. Advantage of this set up is flexibility. In a later stage you can
'make a function that reads cases from a table in a (hidden) sheet into this array.
'This way you don't need to add new cases to your code,
'but you can add them in your excel sheet instead.
test(0) = "FCI18-0"
test(1) = "FCI18-1"
test(2) = "FCI18-2"
test(3) = "FCI18-3"
'read the input given by the user. You might want to add some checks here
i = InputBox ("Which case?")
Sheets("Sheet1").Range("a1").Value = test(i-1)
End Sub
Use Select Case
Sub TestFunction()
ans = InputBox("1 = FCI18-0" & vbCrLf & _
"2 = FCI18-1" & vbCrLf & _
"3 = FCI18-2" & vbCrLf & _
"4 = FCI18-3", "Model")
Select Case ans
Case 1: Sheets("Sheet1").Range("a1").Value = "1 = FCI18-0"
Case 2: Sheets("Sheet1").Range("a1").Value = "2 = FCI18-1"
Case 3: Sheets("Sheet1").Range("a1").Value = "3 = FCI18-2"
Case 4: Sheets("Sheet1").Range("a1").Value = "4 = FCI18-3"
End Select
End Sub

VBA DO Loops Issue

I am trying to create a pop up question in powerpoint VBA, so far so good. But below code doesn’t seem to work. Idea is that you get a popup box with value to enter between 100 - 200 (inclusive). But must enter a value between or can accept failed as input. The inputbox cannot be cancelled or null/empty responses. The inner loop (loop 1) seems to work ok, but if I enter 150 it doesn't terminate the loop 2 instead keeps going unless type failed but it stops with any text rather than only "failed".
Sub OnSlideShowPageChange(ByVal SSW As SlideShowWindow)
'Declare Variables
Dim xType, xLimitHi, xLimitLo, xPrompt As String
Dim InputvarTemp As String
Dim msgResult As Integer
xLimitHi = 200
xLimitLo = 100
xPrompt = "Enter Value between 100 and 200 (Inclusive)"
Do 'loop 2 check within limit or failed
msgResult = vbNo
Do 'loop 1 check Empty / Null or Cancelled input
InputvarTemp = InputBox(xPrompt, xPrompt)
If StrPtr(InputvarTemp) = 0 Then ' Check if cancelled is pressed
MsgBox "Invalid Input - Cannot be cancelled", 16, "Invalid Input."
Else
If Len(InputvarTemp) = 0 Then ' Check Null response
MsgBox "Invalid Input - Cannot be Empty / Null ", 16, "Invalid Input."
Else
msgResult = MsgBox("You have Entered " & InputvarTemp, vbYesNo + vbDefaultButton2, "Check Value in between " & xLimitLo & " to " & xLimitHi & "(Inclusive)")
If CDec(InputvarTemp) < 100 Or CDec(InputvarTemp) > 200 Then ' Check within Limits
MsgBox "Invalid Input - Not Within Limit", 16, "Invalid Input."
End If
End If
End If
Loop Until Len(InputvarTemp) > 0 And msgResult = vbYes And StrPtr(InputvarTemp) = 1 And IsNull(InputvarTemp) = False 'loop 1 check Empty / Null or Cancelled input
Loop Until CDec(InputvarTemp) >= 100 And CDec(InputvarTemp) <= 200 Or InputvarTemp = "Failed" 'loop 2 check within limit
Select Case InputvarTemp
Case "Failed"
MsgBox "Test Criteria Failed, Contact Production Engineer", 16, "Failed Test Criteria."
Case Else
MsgBox "Test Criteria Passed", 16, "Passed Test Criteria."
End Select
End Sub
Can anyone point me to the problem? Many thanks in advance. This is a part of a bigger code project but this part is not working I have isolated this code in to a single file to run by itself to figure out the issue.
To better understand what's going on, you need to write your code in such a way that it does as little as possible; right now you have a single procedure that does so many things it's hard to tell exactly what's going wrong and where.
Write a function to confirm user's valid numeric input:
Private Function ConfirmUserInput(ByVal input As Integer) As Boolean
ConfirmUserInput = MsgBox("Confirm value: " & CStr(input) & "?", vbYesNo) = vbYes
End Function
Then write a function to deal with user's input:
Private Function IsValidUserInput(ByVal userInput As String,_
ByVal lowerLimit As Double, _
ByVal upperLimit As Double) _
As Boolean
Dim result As Boolean
Dim numericInput As Double
If StrPtr(userInput) = 0 Then
'msgbox / cannot cancel out
ElseIf userInput = vbNullString Then
'msgbox / invalid empty input
ElseIf Not IsNumeric(userInput) Then
'msgbox / must be a number
Else
numericInput = CDbl(userInput)
If numericInput < lowerLimit Or numericInput > upperLimit Then
'msgbox / must be within range
Else
result = ConfirmUserInput(numericInput)
End If
End If
IsValidUserInput = result
End Function
This function can probably be written in a better way, but nonetheless it will return False if any of the validation rules fail, or if user doesn't confirm their valid input. Now you're equipped for looping, and since all the complex logic is extracted into its own function, the loop body gets pretty easy to follow:
Private Function GetTestCriteria(ByVal lowerLimit As Double, _
ByVal upperLimit As Double) As Boolean
Const failed As String = "Failed"
Dim prompt As String
prompt = "Enter Value between " & lowerLimit & _
" and " & upperLimit & " (Inclusive)."
Dim userInput As String
Dim isValid As Boolean
Do
userInput = InputBox(prompt, prompt)
isValid = IsValidUserInput(userInput, lowerLimit, upperLimit) _
Or userInput = failed
Loop Until IsValid
GetTestCriteria = (userInput <> failed)
End Sub
The OnSlideShowPageChange procedure can now look like this:
Private Sub OnSlideShowPageChange(ByVal SSW As SlideShowWindow)
If GetTestCriteria(100, 200) Then
MsgBox "Test criteria passed."
Else
MsgBox "Test criteria failed, contact production engineer."
End If
End Sub
I haven't tested any of this code, but I'm sure debugging these more specialized functions will be easier than debugging your monolithic chunk of code; by extracting these functions, you untangle the logic, and I bet the above does exactly what you're trying to do. Also note:
Dim xType, xLimitHi, xLimitLo, xPrompt As String declares xPrompt as a String, and everything else as a Variant. I don't think that's your intent here.
Select Case is best used with Enum values; use If-ElseIf constructs otherwise.
Slight modifications, per below comment:
how do i capture the user input to do something like write to a file
Now if you wanted to do something with the valid user inputs, say, write them to a file, you'd need GetTestCriteria to return the input - but that function is already returning a Boolean. One solution could be to use an "out" parameter:
Private Function GetTestCriteria(ByVal lowerLimit As Double, _
ByVal upperLimit As Double, _
ByRef outResult As Double) As Boolean
Const failed As String = "Failed"
Dim prompt As String
prompt = "Enter Value between " & lowerLimit & _
" and " & upperLimit & " (Inclusive)."
Dim userInput As String
Dim isValid As Boolean
Do
userInput = InputBox(prompt, prompt)
isValid = IsValidUserInput(userInput, lowerLimit, upperLimit, outResult) _
Or userInput = failed
Loop Until IsValid
GetTestCriteria = (userInput <> failed)
End Sub
Private Function IsValidUserInput(ByVal userInput As String,_
ByVal lowerLimit As Double, _
ByVal upperLimit As Double, _
ByRef outResult As Double) _
As Boolean
Dim result As Boolean
Dim numericInput As Double
If StrPtr(userInput) = 0 Then
'msgbox / cannot cancel out
ElseIf userInput = vbNullString Then
'msgbox / invalid empty input
ElseIf Not IsNumeric(userInput) Then
'msgbox / must be a number
Else
numericInput = CDbl(userInput)
If numericInput < lowerLimit Or numericInput > upperLimit Then
'msgbox / must be within range
Else
result = ConfirmUserInput(numericInput)
outResult = numericInput
End If
End If
IsValidUserInput = result
End Function
And now you can call a method in OnSlideShowPageChange, to write the valid result to a file:
Private Sub OnSlideShowPageChange(ByVal SSW As SlideShowWindow)
Dim result As Double
If GetTestCriteria(100, 200, result) Then
MsgBox "Test criteria passed."
WriteResultToFile result
Else
MsgBox "Test criteria failed, contact production engineer."
End If
End Sub
If you run into issues implementing this WriteResultToFile procedure, and existing Stack Overflow questions don't have an answer for you (slightly unlikely), feel free to ask another question!
Retailcoder's answer as a general approach is top notch. I would like to draw attention specifically to the use of IsNumeric() which would solve most issues. Currently your code fails if any non-numeric string is entered.
Had a look at the code to try and see if I could at least answer what was happening to try and appease your curiosity. You mentioned that it looked like you couldn't leave your second loop. In practice I was unable to exit your first loop. I'm sure was due to the StrPtr(InputvarTemp) = 1. I didn't even know what that was until I looked it up. In short it is an undocumented feature that was used to check if Cancel was pushed / get the underlying memory address of variables (apparently).
Before the end of the first loop I put this in for debugging
MsgBox Len(InputvarTemp) & " " & msgResult & " " & StrPtr(InputvarTemp) & " " & IsNull(InputvarTemp)
When I type "150" in the InputBox the results of the message box are as follows. The third value represent the StrPtr(InputvarTemp)
3 6 246501864 FALSE
246501864 is greater than 1 which would cause the loop exit to fail. Again, retailcoder has an excellent answer and I will not reinvent his wheel.
with thanks to #retailcoder and #Matt below is the completed code for any to use, your help is truly appropriated
Capture user input to a file(s) from Powerpoint presentation, using a Config.ini to minimize everyday programming (or no programming code to a standard user)
> Code in Slide 1
Option Explicit
Option Compare Text
Public WithEvents PPTEvent As Application
Public TimeNow, ToDate As String
Public WorkOrder, Serial, UserName As String
Public ReportFile, TempReportFile, TimingFile As String
Sub OnSlideShowPageChange(ByVal SSW As SlideShowWindow)
'Declare Variables
Dim ShellRun As Long
Dim INIPath, StartTime, EndTime, TimeDifferance As String ' from Enviorment
Dim PCPver, ModuleName, PCPFileName, Timed, ResultsFolder, TrainingFolder, TimeingFolder, TrainedFolder, xType, xPrompt, xvarUnit, y As String 'From INI file
Dim xLimitHi, xLimitLo As Variant
Dim result As Double
Dim FailedResult As Double
Dim PCPverInput, inputvar, InputvarDate, InputvarTrueFalse, InputvarGeneral, InputvarLimit, InputvarTemp As String 'From User
Dim TrainingFile, SelfCheck, InvalidCharacter1, InvalidCharacter2 As String 'Variables for Filenames
Dim msgResult, msgResultTemp As Integer
Dim myVarPass As Boolean
Dim KeyAscii As Integer 'Try and Hook Esc key
Dim ppApp As Object
Const fsoForAppend = 8
'Declare and create a FileSystemObject.
Dim fso, ResutlsFSO, TrainingFSO, TimeingFSO As Object 'Need Microsoft Script Runtime in references
' Declare a TextStream.
Dim oFile, ResutlsStream, TrainingStream, TimeingStream As Object
'Assign Variables
INIPath = ActivePresentation.Path & "\" & "Config.ini"
'ShellRun = Shell(ActivePresentation.Path & "\" & "Esc.exe")
SelfCheck = ActivePresentation.Name
ToDate = Format(Date, "dd-mmm-yyyy")
TimeNow = Replace(Format(time, "hh:mm:ss"), ":", "-")
StartTime = Format(time, "hh:mm:ss")
'Retrive Folderpaths and create file names
ModuleName = GetINIString("PCPInfo", "ModuleName", INIPath)
Timed = GetINIString("Options", "Timed", INIPath)
Set ResutlsFSO = CreateObject("Scripting.FileSystemObject")
Set TrainingFSO = CreateObject("Scripting.FileSystemObject")
Set TimeingFSO = CreateObject("Scripting.FileSystemObject")
'Retrive PCP version from Ini file
PCPver = GetINIString("PCPInfo", "PCPver", INIPath)
PCPFileName = GetINIString("PCPInfo", "PCPFileName", INIPath)
ResultsFolder = GetINIString("Folders", "ResultsFolder", INIPath)
TrainingFolder = GetINIString("Folders", "TrainingFolder", INIPath)
TimeingFolder = GetINIString("Folders", "TimeingFolder", INIPath)
TrainedFolder = GetINIString("Folders", "TrainedFolder", INIPath)
Do
If (SelfCheck <> PCPFileName) Then
MsgBox "Invalid Config.ini File. Replace with Correct INI file to continue. ", 16, "Invalid Config.ini File."
End If
Loop Until (SelfCheck = PCPFileName)
'Collect PCP version, User Name, Work Order, Serial Number
If (SSW.View.CurrentShowPosition = 1) Then
'Retrive PCP Version from BOM - User Input
Do
Do
PCPverInput = InputBox("Enter PCP Number including Version", "Enter PCP Number including Version")
If (Len(PCPverInput) < 4) Then
MsgBox "Invalid Input - PCP version cannot be Empty / Null / cancelled", vbOKOnly, "Invalid Input"
End If
Loop Until (Len(PCPverInput) > 4)
'Check PCPversion against BOM
If (PCPver <> PCPverInput) Then
'Display Warning Messages
MsgBox "Incorrect PCP version. Contact Team Leader / Product Engineer. Cannot Continue the programm", 16, "Incorrect PCP version."
End If
Loop Until (PCPver = PCPverInput)
'Retrive UserName - User Input
Do
msgResult = 7
Do
UserName = InputBox("Enter / Scan Operator Name", "Enter / Scan Operator Name")
msgResult = MsgBox("You have Enterd Operator Name " & UserName, vbYesNo + vbDefaultButton2, "Operator Name")
If (Len(UserName) < 4) Then
MsgBox "Invalid Input - User / Operator Name cannot be Empty / Null / cancelled", 16, "Invalid Input"
End If
Loop Until (Len(UserName) > 4) And (msgResult = vbYes)
Loop Until (Len(UserName) > 4)
'Retrive Work Order
Do
msgResult = 7
Do
WorkOrder = InputBox("Enter / Scan Work Order", "Enter / Scan Work Order")
msgResult = MsgBox("You have Enterd Work Order " & WorkOrder, vbYesNo + vbDefaultButton2, "Work Order")
If (Len(WorkOrder) < 4) Then
MsgBox "Invalid Input - Work Order cannot be Empty / Null / cancelled. Minimum 5 Numbers", 16, "Invalid Input"
End If
Loop Until (Len(WorkOrder) > 4) And (msgResult = vbYes)
Loop Until (Len(WorkOrder) > 4)
'Retrive Serial Number
Do
msgResult = 7
Do
Serial = InputBox("Enter / Scan Serial Number", "Enter / Scan Serial Number")
msgResult = MsgBox("You have Enterd Serial Number " & Serial, vbYesNo + vbDefaultButton2, "Serial Number")
If (Len(Serial) < 1) Then
MsgBox "Invalid Input - Serial Number cannot be Empty / Null / cancelled. Use -NOSERIAL- if Not Applicable", 16, "Invalid Input"
End If
Loop Until (Len(Serial) > 1) And (msgResult = vbYes)
Loop Until (Len(Serial) > 1)
If (Len(Dir(ResultsFolder, vbDirectory)) = 0) Then
MkDir ResultsFolder
End If
If (Len(Dir(ResultsFolder & "\" & WorkOrder, vbDirectory)) = 0) Then
MkDir ResultsFolder & "\" & WorkOrder
End If
If (Len(Dir(ResultsFolder & "\" & WorkOrder & "\" & Serial, vbDirectory)) = 0) Then
MkDir ResultsFolder & "\" & WorkOrder & "\" & Serial
End If
ReportFile = ResultsFolder & "\" & WorkOrder & "\" & Serial & "\" & PCPver & "_" & ToDate & "_" & TimeNow & ".txt"
Set ResutlsStream = ResutlsFSO.CreateTextFile(ReportFile, True)
ResutlsStream.WriteLine PCPver & " " & ModuleName & " Build / Test Checklist"
ResutlsStream.WriteLine "===================================================================================================="
ResutlsStream.WriteLine ""
ResutlsStream.WriteLine "Work Order :" & WorkOrder
ResutlsStream.WriteLine "Serial Number (if Applicable) :" & Serial
ResutlsStream.WriteLine "Test / Assembly Operator (Full Name) :" & UserName
ResutlsStream.WriteLine "Date (dd-mmm-yyyy) :" & ToDate
ResutlsStream.WriteLine ""
ResutlsStream.Close
If (Len(Dir(TrainingFolder, vbDirectory)) = 0) Then
MkDir TrainingFolder
End If
If (Len(Dir(TrainingFolder & "\" & UserName, vbDirectory)) = 0) Then
MkDir TrainingFolder & "\" & UserName
End If
TrainingFile = TrainingFolder & "\" & UserName & "\" & PCPver & ".csv"
If (Len(Dir(TrainingFile)) = 0) Then
Set TrainingStream = TrainingFSO.CreateTextFile(TrainingFile, True)
TrainingStream.WriteLine UserName & "'s " & ModuleName & " " & PCPver & " Training File"
TrainingStream.WriteLine "===================================================================================================="
TrainingStream.WriteLine "Operator" & Chr(44) & "PCP Version" & Chr(44) & "W/O" & Chr(44) & "Serial" & Chr(44) & "Date" & Chr(44) & "Time"
TrainingStream.WriteLine "===================================================================================================="
Else
Set TrainingStream = TrainingFSO.OpenTextFile(TrainingFile, 8)
End If
TrainingStream.WriteLine UserName & Chr(44) & PCPver & Chr(44) & WorkOrder & Chr(44) & Serial & Chr(44) & ToDate & Chr(44) & Format(time, "HH:MM:SS AM/PM")
TempReportFile = ReportFile
End If
'Detect Slide Number and Retrive Relevant Question from INI File
y = SSW.View.CurrentShowPosition
If (Len(y) > 0) Then
xType = GetINIString(SSW.View.CurrentShowPosition, "PromptType", INIPath)
If (Len(xType) > 0) Then
Set ResutlsStream = ResutlsFSO.OpenTextFile(TempReportFile, 8)
Select Case xType
Case "Message"
xPrompt = GetINIString(SSW.View.CurrentShowPosition, "Prompt", INIPath)
MsgBox xPrompt, vbYes, xPrompt
Case "Date"
xPrompt = GetINIString(SSW.View.CurrentShowPosition, "Prompt", INIPath)
Do
msgResult = 7
Do
inputvar = InputBox(xPrompt, "Enter Date")
InputvarDate = inputvar
msgResult = MsgBox("You have Enterd " & Format(inputvar, "dd-Mmm-yyyy") & " to " & xPrompt, vbYesNo + vbDefaultButton2, "Check Date Input")
If (StrPtr(inputvar) = 0) Or (Len(inputvar) < 6) Then
MsgBox "Invalid Date Input - Cannot be Empty / Null / cancelled. Enter a Valid date, in dd-Mmm-yyyy format", 16, "Invalid Input."
End If
inputvar = Format(inputvar, "dd-Mmm-yyyy")
If (Not IsDate(inputvar)) Then
MsgBox "Enter a Valid date, in dd-Mmm-yyyy format", 16, "Invalid Date."
End If
Loop Until (IsDate(inputvar) = True) And (msgResult = vbYes) And (Len(InputvarDate) > 6)
Loop Until (IsDate(inputvar) = True) And (msgResult = vbYes)
ResutlsStream.WriteLine "Step " & SSW.View.CurrentShowPosition & ". " & xPrompt & Chr(9) & ":" & Chr(9) & inputvar & " " & xvarUnit
Case "TrueFalse"
xPrompt = GetINIString(SSW.View.CurrentShowPosition, "Prompt", INIPath)
Do
msgResult = 7
Do
inputvar = InputBox(xPrompt, "Enter True or False")
msgResult = MsgBox("You have Enterd " & inputvar & " to " & xPrompt, vbYesNo + vbDefaultButton2, "Check Your Input (True/False)")
If (StrPtr(inputvar) = 0) Or (Len(inputvar) < 0) Then
MsgBox "Invalid Input - Cannot be Empty / Null / cancelled", 16, "Invalid Input."
End If
If (inputvar <> "True") And (inputvar <> "False") Then
MsgBox "Invalid Input - Enter Either True or False", 16, "Invalid Input."
End If
Loop Until (Len(inputvar) > 0) And (inputvar = "True") Or (inputvar = "False") And (msgResult = vbYes)
Loop Until (Len(inputvar) > 0) And (inputvar = "True") Or (inputvar = "False") And (msgResult = vbYes)
If inputvar = True Then
ResutlsStream.WriteLine "Step " & SSW.View.CurrentShowPosition & ". " & xPrompt & Chr(9) & ":" & Chr(9) & inputvar
Else
MsgBox "Test criteria failed, contact production engineer."
ResutlsStream.WriteLine "Step " & SSW.View.CurrentShowPosition & ". " & xPrompt & Chr(9) & ":" & Chr(9) & inputvar & " " & xvarUnit & " Failed" & " ***NCR Required***"
End If
Case "General"
xPrompt = GetINIString(SSW.View.CurrentShowPosition, "Prompt", INIPath)
Do
msgResult = 7
Do
inputvar = InputBox(xPrompt, xPrompt)
msgResult = MsgBox("You have Enterd " & inputvar & " to " & xPrompt, vbYesNo + vbDefaultButton2, "Check Input")
If (StrPtr(inputvar) = 0) Or (Len(inputvar) < 0) Then
MsgBox "Invalid Input - Cannot be Empty / Null / cancelled", 16, "Invalid Input."
End If
Loop Until (Len(inputvar) > 0) And (msgResult = vbYes)
Loop Until (Len(inputvar) > 0) And (msgResult = vbYes)
ResutlsStream.WriteLine "Step " & SSW.View.CurrentShowPosition & ". " & xPrompt & Chr(9) & ":" & Chr(9) & inputvar & " " & xvarUnit
Case "Limit"
xLimitHi = GetINIString(SSW.View.CurrentShowPosition, "LimitHi", INIPath)
xLimitLo = GetINIString(SSW.View.CurrentShowPosition, "LimitLo", INIPath)
xPrompt = GetINIString(SSW.View.CurrentShowPosition, "Prompt", INIPath)
xvarUnit = GetINIString(SSW.View.CurrentShowPosition, "varUnit", INIPath)
If GetTestCriteria(xPrompt, xLimitLo, xLimitHi, xvarUnit, result) Then
ResutlsStream.WriteLine "Step " & SSW.View.CurrentShowPosition & ". " & xPrompt & Chr(9) & ":" & Chr(9) & result & " " & xvarUnit
Else
MsgBox "Test criteria failed, contact production engineer."
Do
msgResult = 7
Do
FailedResult = InputBox("Enter Values Failed in " & xPrompt, "Enter Failed Value")
msgResult = MsgBox("You have Enterd Failed Value of " & FailedResult, vbYesNo + vbDefaultButton2, "Check Failed Input")
If (StrPtr(FailedResult) = 0) Or (Len(FailedResult) = 0) Then
MsgBox "Invalid Input - Cannot be Empty / Null / cancelled", 16, "Invalid Input."
End If
Loop Until (Len(FailedResult) > 0) And (msgResult = vbYes)
Loop Until (Len(FailedResult) > 0) And (msgResult = vbYes)
ResutlsStream.WriteLine "Step " & SSW.View.CurrentShowPosition & ". " & xPrompt & Chr(9) & ":" & Chr(9) & FailedResult & " " & xvarUnit & " Failed" & " ***NCR Required***"
End If
ResutlsStream.Close
End Select
End If
End If
If (Timed = "ON") Then
If (Len(Dir(TimeingFolder, vbDirectory)) = 0) Then
MkDir TimeingFolder
End If
If (Len(Dir(TimeingFolder & "\" & PCPver, vbDirectory)) = 0) Then
MkDir TimeingFolder & "\" & PCPver
End If
TimingFile = TimeingFolder & "\" & PCPver & "\" & "Timing-" & WorkOrder & "-" & Serial & "-" & PCPver & "-" & ToDate & ".csv"
If (Len(Dir(TimingFile)) = 0) Then
Set TimeingStream = TimeingFSO.CreateTextFile(TimingFile, True)
TimeingStream.WriteLine UserName & "'s " & ModuleName & " " & PCPver & " Build Time File"
TimeingStream.WriteLine "===================================================================================================="
TimeingStream.WriteLine "Seq/Step" & Chr(44) & "Start Time" & Chr(44) & "End Time"
Else
Set TimeingStream = TimeingFSO.OpenTextFile(TimingFile, 8)
End If
EndTime = Format(time, "hh:mm:ss")
TimeingStream.WriteLine "No:" & SSW.View.CurrentShowPosition & Chr(44) & StartTime & Chr(44) & EndTime
TimeingStream.Close
End If
End Sub
Private Function ConfirmUserInput(ByVal inputvar As Double) As Boolean
ConfirmUserInput = MsgBox("Confirm value: " & CStr(inputvar) & "?", vbYesNo + vbDefaultButton2, "Confirm value") = vbYes
End Function
Private Function IsValidUserInput(ByVal userInput As String, ByVal xLimitLo As Double, ByVal xLimitHi As Double, ByRef outResult As Double) As Boolean
Dim result As Boolean
Dim numericInput As Double
If StrPtr(userInput) = 0 Then
MsgBox "Invalid Input - Entry cannot be cancelled", 16, "Invalid User Input"
ElseIf userInput = vbNullString Then
MsgBox "Invalid Input - Entry cannot be Empty / Null", 16, "Invalid User Input"
ElseIf Not IsNumeric(userInput) Then
MsgBox "Invalid Input - Numeric Input required", 16, "Invalid User Input"
Else
numericInput = CDbl(userInput)
If numericInput < xLimitLo Or numericInput > xLimitHi Then
MsgBox "Invalid Input - Not within Limits", 16, "Invalid User Input"
Else
result = ConfirmUserInput(numericInput)
outResult = numericInput
End If
End If
IsValidUserInput = result
End Function
Private Function GetTestCriteria(ByVal xPrompt As String, ByVal xLimitLo As Double, ByVal xLimitHi As Double, ByVal xvarUnit As String, ByRef outResult As Double) As Boolean
Const failed As String = "Failed"
Dim prompt As String
prompt = "Enter Value between " & xLimitLo & xvarUnit & " and " & xLimitHi & xvarUnit & "(Inclusive)"
Dim userInput As String
Dim isValid As Boolean
Do
userInput = InputBox(prompt, xPrompt)
isValid = IsValidUserInput(userInput, xLimitLo, xLimitHi, outResult) Or userInput = failed
Loop Until isValid
GetTestCriteria = (userInput <> failed)
End Function
Private Sub TextBox1_Change()
End Sub
Private Sub TextBox2_Change()
End Sub
Private Sub TextBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
End Sub
> Code in Module
Option Explicit
Option Compare Text
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
Private Const CONFIG_FILE = "Config.ini"
Public Function GetINIString(ByVal sApp As String, ByVal sKey As String, ByVal filepath As String) As String
Dim sBuf As String * 256
Dim lBuf As Long
lBuf = GetPrivateProfileString(sApp, sKey, "", sBuf, Len(sBuf), filepath)
GetINIString = Left$(sBuf, lBuf)
End Function
Public Function WriteINI(ByVal sApp As String, ByVal sKey As String, ByVal sValue As String) As String
WritePrivateProfileString sApp, sKey, sValue, "Config.ini"
End Function
Code in Config.ini
Config.ini to be remain in same folder as the .ppsm file
[PCPInfo]
;This will force the operator to check PCP version against BOM
;This is required as it is used to tie in the check list to the PCP
PCPver=12.3456.789.A01
;this is used as the heading for creating results files
ModuleName=NEW Validation Test Case
;this to check the correct PCP Power-point file is present with the ini file - if this is incorrect power point will not run
PCPFileName=12.3456.789.A01 NEW Validation Test Case.ppsm
[Options]
;Switch ON/OFF to collect timing data
Timed=ON
[Folders]
;If required creates last folder of the path
;folder where all check-lists/result files collected
ResultsFolder=C:\Reports\Validation
;folder where all training data collected
TrainingFolder=C:\Training Records
;folder where all timing data collected
TimeingFolder=C:\Times
;Check Who has completed training here - Not implemented
TrainedFolder=C:\TrainedOP
;Do not Use Slide No 1 - Use slide number in square brackets [x]
;First Slide collects Work Order, User name , Serial Number information
;PromptTypes Message,Date,TrueFalse,General,Limit *compulsory
;Type Message Displays Pop up message only , No Data Collection
;Type Date accepts dates in DD-MMM-YYYY format
;Type TrueFalse can be used for Passed failed, checks etc.
;Type General can be used for Part Serial numbers, batch dates
;Type Limit can be used for test parameters with a range,-
; - if not within the range "Failed" can be used to complete the step and return to a previous step
; LimitHi refers to Higher limit should be less than or equal to *compulsory for type Limit
; LimitLo Refers to Lower limit should be Greater than or equal to *compulsory for type Limit
;Prompt will pop-up the user input box wit the text as question/criteria *compulsory
;VarUnit Type of Unit Ohms,Psi,kPa etc.
[2]
PromptType=Message
LimitHi=
LimitLo=
Prompt=Revision Record
varUnit=
[4]
PromptType=Date
LimitHi=
LimitLo=
Prompt=Enter to days Date
varUnit=
[6]
PromptType=TrueFalse
LimitHi=
LimitLo=
Prompt=Enter True or False
varUnit=
[8]
PromptType=General
LimitHi=
LimitLo=
Prompt=Enter Any text
varUnit=
[10]
PromptType=Limit
LimitHi=200
LimitLo=100
Prompt=Enter Value within limits
varUnit=Bar
thanks again #retailcoder
best regards
Dumidu Roshan aka rellik - #rellik