Whats wrong with this! Please HELP!

spyrit

Newcomer
Joined
Oct 17, 2003
Messages
18
Hi

Please help I want to be able to enter a line of text into a text box in the format

Surname Firstname SUBJECT1......SUBJECT5 DOB

I need to enter it in this format with 5 subjects containing 3 characters each.

Now each line will always have a surname and firstname but the number of subjects can vary. The DOB may or may not be at the end of the line.

It then needs to be rearranged in the format

Firstname Surname DOB SUBJECT1.....SUBJECT5

I have done this so far but it wont work!!! Please help

Visual Basic:
   words = Split(TextBox1.Text, " ")

        If Microsoft.VisualBasic.Right(TextBox1.Text, 2) = number And Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 And Len(words(6)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(7) + " " + words(2) + " " + words(3) + " " + words(4) + " " + words(5) + " " + words(6)
        ElseIf Microsoft.VisualBasic.Right(TextBox1.Text, 2) = number And Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(6) + " " + words(2) + " " + words(3) + " " + words(4) + " " + words(5)
        ElseIf Microsoft.VisualBasic.Right(TextBox1.Text, 2) = number And Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(5) + " " + words(2) + " " + words(3) + " " + words(4)
        ElseIf Microsoft.VisualBasic.Right(TextBox1.Text, 2) = number And Len(words(2)) = 3 And Len(words(3)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(4) + " " + words(2) + " " + words(3)
        ElseIf Microsoft.VisualBasic.Right(TextBox1.Text, 2) = number And Len(words(2)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(3) + " " + words(2)


        ElseIf Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 And Len(words(6)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(6) + " " + words(2) + " " + words(3) + " " + words(4) + " " + words(5)
        ElseIf Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(5) + " " + words(2) + " " + words(3) + " " + words(4)
        ElseIf Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(4) + " " + words(2) + " " + words(3)
        ElseIf Len(words(2)) = 3 And Len(words(3)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(3) + " " + words(2)
        ElseIf Len(words(2)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(2)
        End If

Please help me.

I need to know whats wrong. Please Please Please.
 
Does it have to be in a single textbox? Could you not impose some order i.e. Surname, Firstname, DOB, subject ...... ?

If not if may be easier to split the text into an array then work on the individual items.

Visual Basic:
dim vals() as string
vals = TextBox2.text.split(" ")
'vals will now contain an array of strings with val(0) being Surname and vals(1) being Firstname.
 
No I couldn't do that because the number of subjects changes.

So it wou;dn't work would it because it could be 8 'words' long or it could be as low as 3 'words' long.
 
Please help as I am new to VB.

But I can't see how it would. Please explain.

I wrote a split by space but i don't think it will work for any amount of words.

If I do,

Visual Basic:
 words = split(TextBox1.Text, " ")

and then array. Because it needs rearranging in an order The DOB is optional and the Subjects vary between 1 and 5 not 1 and 5 char actual 1 - 5 subjects.
 
I'm kind of bored today....

Visual Basic:
'
        Dim words() As String = Split(TextBox1.Text, " ")
        Dim x As Integer = 0
        Dim strDOB As String = String.Empty
        Dim strFName As String = String.Empty
        Dim strSName As String = String.Empty


        If words.Length > 2 Then
            TextBox2.Text = ""

            strSName = words(0)
            strFName = words(1)

            If words.Length > 3 Then
                If words(words.Length - 1).Length > 3 Then strDOB = words(words.Length - 1)
            End If

            For x = 2 To words.Length - 1
                If words(x).Length = 3 Then
                    TextBox2.Text &= " " & words(x)
                End If
            Next
            TextBox2.Text = TextBox2.Text.Trim

            If strDOB <> String.Empty Then TextBox2.Text = strDOB & " " & TextBox2.Text
            TextBox2.Text = strFName & " " & strSName & " " & TextBox2.Text
        Else
            MessageBox.Show("Bad Data")
        End If
 
Hi

That is GREAT!!!!!. Thanks alot.

Could you just do one more thing for me please. Could you explain the code. i.e. annotate it so I know what it is all about please.

Thanks
 
I changed how some of it works, to make it friendlier.

Note, this code makes assumptions (which we all know what that can mean):
1. Firstname and Surname WON'T have spaces in them. If they do, then you would have to split on something else, or find a different way to do it.
2. All subjects are exactly three characters.
3. The DOB (if it exists at the end) is NOT three characters.

Visual Basic:
'
         'Get the words in a string array
        Dim words() As String = Split(TextBox1.Text, " ")

        '"For" loop counter
        Dim x As Integer = 0

        'To hold Firstname and Surname
        Dim strFName As String = String.Empty
        Dim strSName As String = String.Empty

        'If we have more than one item in "words()"
        If words.Length > 1 Then

            'Clear "TextBox2"
            TextBox2.Text = String.Empty

            'Hold the Surname and the Firstname.
            strSName = words(0)
            strFName = words(1)

            'If we have more than two items in "words()" then...
            If words.Length > 2 Then

                'For each item in "words()" starting with the 3rd word...
                'Note: arrays are 0 based, so position 2 is actually the 3rd
                'word, and "words.Length - 1" is the last item.)
                For x = 2 To words.Length - 1

                    'If the length of the word is exactly three then it is a subject...
                    If words(x).Length = 3 Then

                        'Add "[space] & [word]" to TextBox2
                        TextBox2.Text &= " " & words(x)

                    End If

                Next

                'Because the "For" loop above will always add "[space] & [word]" we have
                'an extra space at the front.  Use .Trim to remove spaces from the 
                'front and back of TextBox2.
                TextBox2.Text = TextBox2.Text.Trim

                'If the last word's length is NOT 3 assume it is the DOB...
                If words(words.Length - 1).Length <> 3 Then

                    'Add "[last word] & [space]" to the front of TextBox2
                    TextBox2.Text = words(words.Length - 1) & " " & TextBox2.Text

                End If

            End If

            'Add the Firstname and Surname to the front of "TextBox2"
            TextBox2.Text = strFName & " " & strSName & " " & TextBox2.Text
        Else

            'We didn't have more than one item in "words()" so the data must be bad.
            MessageBox.Show("Bad Data")

        End If
 
Thats perfect but...

How could I then do it so it takes the length of firstname takes that away from 15 and adds the remainder as that number of spaces.

The same for surname.

Also It needs to add 2 spaces to the end of DOB.

How could I do this.

Thanks
 
Change:
Visual Basic:
strFName = words(1)
to
Visual Basic:
strFName = words(1).PadRight(15, " ")

Change:
Visual Basic:
TextBox2.Text = words(words.Length - 1) & " " & TextBox2.Text
to
Visual Basic:
TextBox2.Text = words(words.Length - 1) & "  " & TextBox2.Text

Note:
It only gets the DOB if it finds a word that is not three characters at the end of the word list. If you need the DOB position in TextBox2 to always be the same length regardless of it's existence in the word list, then you would hold it in a variable, and pad it when you added it to TextBox2.
 
Thanks

Also do you know what could be wrong in this just for interest.

Visual Basic:
words = Split(TextBox1.Text, " ")

        If Microsoft.VisualBasic.Right(TextBox1.Text, 8) Then

        ElseIf Microsoft.VisualBasic.Right(TextBox1.Text, 8) And Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 And Len(words(6)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(7) + " " + words(2) + " " + words(3) + " " + words(4) + " " + words(5) + " " + words(6)
        ElseIf Microsoft.VisualBasic.Right(TextBox1.Text, 8) And Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(6) + " " + words(2) + " " + words(3) + " " + words(4) + " " + words(5)
        ElseIf Microsoft.VisualBasic.Right(TextBox1.Text, 8) And Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(5) + " " + words(2) + " " + words(3) + " " + words(4)
        ElseIf Microsoft.VisualBasic.Right(TextBox1.Text, 8) And Len(words(2)) = 3 And Len(words(3)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(4) + " " + words(2) + " " + words(3)
        ElseIf Microsoft.VisualBasic.Right(TextBox1.Text, 8) And Len(words(2)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(3) + " " + words(2)

        ElseIf Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 And Len(words(6)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(6) + " " + words(2) + " " + words(3) + " " + words(4) + " " + words(5)
        ElseIf Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(5) + " " + words(2) + " " + words(3) + " " + words(4)
        ElseIf Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(4) + " " + words(2) + " " + words(3)
        ElseIf Len(words(2)) = 3 And Len(words(3)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(3) + " " + words(2)
        ElseIf Len(words(2)) = 3 Then
            TextBox2.Text = words(1) + " " + words(0) + " " + words(2)
        End If
 
Also in that code you gave me. How can I add 9 spaces to the end of the surname in output if there is no date of birth

Please Reply


Thanks for all your help

Regards
 
I see things that are wrong with it, but I can't see an easy way to get it to work:

1. You can't access items in an array that don't exist. This would return an error if there aren't seven or more items in the array:
Visual Basic:
Len(words(6)) = 3
(That is the main problem with it programmatically, because to keep it in the same multiple "If" structure you would have to evaluate if each item exists before testing for the length.)


2. "If" "Then" statments require something that can be evaluated as True or False. I don't know what this should do:
Visual Basic:
If Microsoft.VisualBasic.Right(TextBox1.Text, 8) Then
"Microsoft.VisualBasic.Right(TextBox1.Text, 8)" doesn't return True or False, it returns the first eight characters of TextBox1.Text.

3. You aren't declaring "words" ("Dim words() As String"?)

4. The code doesn’t account for the last word to be a non three character DOB.
 
spyrit said:
Also in that code you gave me. How can I add 9 spaces to the end of the surname in output if there is no date of birth

Please Reply


Thanks for all your help

Regards

So.....I take it you are working with field size.

Can you give me an example of what you want the following inputs to look like after processing (with space padding):

"sName sName abc def ghi jkl mno"

"sName fName abc def ghi jkl mno 11282003"


(What if the name is longer than the field?)

"sNameNameNameName fNameNameNameName abc def ghi jkl mno"

"sNameNameNameName fNameNameNameName abc def ghi jkl mno 11282003"
 
Basically It needs to be....

firstname 1-15
surname 1-15
DOB 1-10
SUBJECT1 1-4
" " 1-4
" " 1-4
" " 1-4
" " 1-4

I have edited you code up to the point that it needs ten more spaces after surname to account for the DOB not being there and outputting it under correct headings in the output file.

I hope you can help.

Regards

spyrit
 
Also do you think you could really help with making my other code work because I feel I've failed if I can't. I understand what you mean when you say it doesn't return true or false but how can I check to see if the last char is a number to do the if then statement. I need a line that checks the end char and returns true or flase to do the rest of the code.

I understand about dim the words() as string

Also I don't really understand the other thing you said about arrays because If the correct IF STATEMENT is in place will it not just go to the second line.

Could I not do it like

Visual Basic:
 If the last char is numeric Then
Count number of words
If number of words is 3 Then
...
If 4 Then
...
If 5 Then
....
If 6 Then
...
If 7 Then
...

Else (IF IT ISN't NUMERIC THEN)
If 3 Then
...
If 4 Then
...
If 5 Then
....
If 6 Then
...

Please reply
 
Visual Basic:
'
        Dim words() As String
        words = Split(TextBox1.Text, " ")

        'If the last eight chars is numeric...
        If IsNumeric(Microsoft.VisualBasic.Right(TextBox1.Text, 8)) = True Then

            'If the length of "words()" is eight...
            If words.Length = 8 Then
                'If each of the words except the last are three chars long...
                If Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 And Len(words(6)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(7) + " " + words(2) + " " + words(3) + " " + words(4) + " " + words(5) + " " + words(6)
                End If
            ElseIf words.Length = 7 Then
                If Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(6) + " " + words(2) + " " + words(3) + " " + words(4) + " " + words(5)
                End If
            ElseIf words.Length = 6 Then
                If Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(5) + " " + words(2) + " " + words(3) + " " + words(4)
                End If
            ElseIf words.Length = 5 Then
                If Len(words(2)) = 3 And Len(words(3)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(4) + " " + words(3) + " " + words(2)
                End If
            ElseIf words.Length = 4 Then
                If Len(words(2)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(3) + " " + words(2)
                End If
            ElseIf words.Length = 3 Then
                If Len(words(2)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(2)
                End If
            End If


        Else
            'No date on the end...

            'If the length of "words()" is seven (one less because no date)...
            If words.Length = 7 Then
                'If each of the words are three chars long...
                If Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 And Len(words(5)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(2) + " " + words(3) + " " + words(4) + " " + words(5) + " " + words(6)
                End If
            ElseIf words.Length = 6 Then
                If Len(words(2)) = 3 And Len(words(3)) = 3 And Len(words(4)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(2) + " " + words(3) + " " + words(4) + " " + words(5)
                End If
            ElseIf words.Length = 5 Then
                If Len(words(2)) = 3 And Len(words(3)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(2) + " " + words(3) + " " + words(4)
                End If
            ElseIf words.Length = 4 Then
                If Len(words(2)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(2) + " " + words(3)
                End If
            ElseIf words.Length = 3 Then
                If Len(words(2)) = 3 Then
                    TextBox2.Text = words(1) + " " + words(0) + " " + words(2)
                End If
            End If

            End If
'
 
Thanks for the reply,

For some reason the above code won't work that you posted, Do you know why? Did it work on yours?

Please get back to me.

Regards

spyrit
 
how about using a Select statement... god I hated long if...then's! and some modular programing... I replaced your monstorous if...then with a select and two function which are a heck of alot easier to read:

Visual Basic:
Select Case words.Length
	Case 8:
		If LenSame(words, new Long(){2, 3, 4, 5, 6}, 3) Then
                    TextBox2.Text = BuildWords(words, new Long(){1, 0, 7, 2, 3, 4, 5, 6});
                End If
	Case 7:
		If LenSame(words, new Long(){2, 3, 4, 5}, 3) Then
                    TextBox2.Text = BuildWords(words, new Long(){1, 0, 6, 2, 3, 4, 5});
                End If
	Case 6:
		If LenSame(words, new Long(){2, 3, 4}, 3) Then
                    TextBox2.Text = BuildWords(words, new Long(){1, 0, 5, 2, 3, 4});
                End If
	Case 5:
		If LenSame(words, new Long(){2, 3}, 3) Then
                    TextBox2.Text = BuildWords(words, new Long(){1, 0, 4, 3, 2});
                End If
	Case 4:
		If LenSame(words, new Long(){2}, 3) Then
                    TextBox2.Text = BuildWords(words, new Long(){1, 0, 3, 2});
                End If
	Case 3:
		If LenSame(words, new Long(){2}, 3) Then
                    TextBox2.Text = BuildWords(words, new Long(){1, 0, 2});
                End If
End Select
Private Function BuildWords(ByVal WordArray() As String, ByVal args() As Long) As String
        
	Dim ReturnString As String
        Dim i As Long
        For Each i In args
            ReturnString += WordArray(i - 1)
        Next
        Return ReturnString
End Function	
Private Function LenSame(ByVal WordArray() As String, ByVal args() As Long, ByVal TargetLen As Long) as Boolean
	Dim i As Long
	Dim noMatch As Boolean
	For Each i in args
		If WordArray(i - 1).Length != TargetLen
			noMatch = True
			break
		End If
	Next i
	Return !noMatch
End Function

Maybe not your preferance but in my experiance it's easier like this.
 
Back
Top