multiline text box to 2d array - arrays

How would I go about inserting the following input in to a 2d array or if required for the same effect a different kind of array.
abcd
efgh
ijkl
and when I click a button my array rotates 90 degrees to the right or left (if chosen) I've been thinking about it for about an hour I tried a few things but I'm totally new at VB.net
example using numbers instead:
1 2 3
4 5 6
7 8 9
rotated:
7 4 1
8 5 2
9 6 3
and so on

This might get you started You would want to dynamically set the upper bounds for the "rows" and "columns". This outputs it to a text box, but it would be easy enough to assign the variable to a new array.
Dim arr(3, 3) As String
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim i As Integer = 1
For row As Integer = 0 To 2
For col As Integer = 0 To 2
arr(row, col) = i
i += 1
Next
Next
End Sub
Public Sub showStraight()
TextBox1.Text = ""
For row As Integer = 0 To 2
Dim line As String = ""
For col As Integer = 0 To 2
line += arr(row, col)
Next
TextBox1.Text += line & vbNewLine
line = ""
Next
End Sub Public Sub showRotated()
TextBox1.Text = ""
For col As Integer = 0 To 2
Dim line As String = ""
For row As Integer = 2 To 0 Step -1
line += arr(row, col)
Next
TextBox1.Text += line & vbNewLine
line = ""
Next
End Sub

Related

Create more than one type of arrays of PictureBox

I'm trying to create more than one array of PictureBox.
The only thing I know is that I can use limited amount of arrays that was created in a code.
Dim CustomImage() As PictureBox = New PictureBox() {Array1, Array2,..and so on}
But what I'm trying to explain is how do you create those arrays something like this?
In this example, the user inputs number 6 and it shows 6 PictureBoxes.
Dim ArrayNumber as Integer = 6
Dim CustomImage() As PictureBox = New PictureBox() {some code that creates 6 arrays}
Just sample:
Dim myPictBox As PictureBox()
Private Const maxPBCount = 10
Private Sub CreateSomePictureBox(ByVal Count As Int16)
If Count > maxPBCount Then
Exit Sub
End If
Dim myPictBoxLength As Integer = 0
If myPictBox Is Nothing = False Then
myPictBoxLength = myPictBox.Length
End If
Do While myPictBoxLength > Count
myPictBox(myPictBoxLength - 1).Dispose()
myPictBoxLength -= 1
Loop
If Count <= 0 Then
myPictBox = Nothing
Exit Sub
End If
ReDim Preserve myPictBox(Count - 1)
'Arrange Position of PictureBox
MsgBox(myPictBoxLength)
Do While myPictBoxLength < Count
myPictBox(myPictBoxLength) = New PictureBox
myPictBox(myPictBoxLength).Height = 30
myPictBox(myPictBoxLength).Width = 30
myPictBox(myPictBoxLength).Location = New Point(35 * myPictBoxLength, 30)
Me.Controls.Add(myPictBox(myPictBoxLength))
myPictBox(myPictBoxLength).BackColor = Color.Red
myPictBox(myPictBoxLength).Show()
myPictBoxLength += 1
Loop
'Create Sub Procedure to Arrange The Picture Box Created
'ArrangePB()
End Sub
Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
CreateSomePictureBox(6)
End Sub

Array Fails to Change Value

I am trying to compare two different dynamic arrays in two different excel sheets I was able to assign value to the first but for the second one I am getting a run time error 9 subscript out of range
Sub sortandmark()
Dim x As Long, xg As Long
Dim Lfo() As String
Dim Greenlfo() As String
Dim i As Long, ig As Long
Dim j As Integer, jg As Long
Dim site As Long
'Get the main array
Windows("Test LFO sheet .xlsm").Activate
'x = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Rows.Count
ReDim Lfo(2 To 2, 3 To 5) As String
For i = 2 To 2
For j = 3 To 5
Lfo(i, j) = Cells(i, j).Value
Next j
Next i
Windows("LFO LIST FOR OCT test.xlsx").Activate
'Greenville array set up
Sheets("GRE").Select
xg = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Rows.Count
ReDim Greenlfo(2 To xg, 4 To 5)
For ig = 2 To xg
For jg = 3 To 4
Greenlfo(ig, jg) = ActiveSheet.Cells(ig, jg).Value ' Where the error occurs
Next jg
Next ig
'Testing and highlighting
If Lfo(i, 3) = Greenwood Then
Sheets("GRE").Select
End If
End Sub

visual basic array sorting from list box

Hello im having trouble with my code !
we are asked to organize a list of names from a text.txt file the make them show up into a lits box (got that part down :) ) . then from the list box we are asked to create an array and sort that array (using our own sorting method) and organize the names using a button in assending order and another button organizing the array in decending order. the results from the orders names should appear in another list box .
i have gotten only the last name in the list to show up in the second list box but my code has no errors it just wont order the names properly! Help!!!!!
here is my code :)
Public Class FileSort
Dim sr As IO.StreamReader = IO.File.OpenText("C:\Users\Inspiron 15\documents\visual studio 2010\Projects\assigment4 EL\assigment4 EL\names.txt")
Structure names
Dim c As Integer
Dim fullname As String
End Structure
Dim allNames(99) As names
Private Sub btnName_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnName.Click
Do While sr.Peek <> -1
Name = sr.ReadLine
LstNames.Items.Add(Name & " ")
Loop
sr.Close()
End Sub
Private Sub bubbelsort(ByRef names() As System.String, ByVal c As Integer)
c = 0
names(c) = sr.ReadLine()
c = c * 1
For c = 1 To 99 Step +1 '~~~ Addding (Z to A) to the the Listbox
lstOrderedNames.Items.Add(Name & "")'
Next
End Sub
Private Sub BtnAssend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAssend.Click
Dim names(99) As String
Dim c As Integer
c = 0
Dim A As Integer
A = 99
names(c) = sr.ToString
c = c + 1
For c = 1 To 99 Step +1 '~~~ Addding (Z to A) to the the Listbox
lstOrderedNames.Items.Add(Name & "")
Next
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnDessend.Click
Dim names(99) As String
Dim c As Integer
c = 0
Dim A As Integer
A = 99
names(c) = sr.ToString
names(A) = sr.ToString
A = A - 1
For A = 99 To 0 Step -1 '~~~ Addding (Z to A) to the the Listbox
lstOrderedNames.Items.Add(Name & "")
Next
End Sub
enter image description here
Since your problem is the sorting algorithm (if I understand this correctly).
At first we need an array.
Dim arr(ListBox1.Items.Count - 1) As String
For i As Integer = 0 To arr.Length - 1
arr(i) = CStr(ListBox1.Items(i))
Next
Next the sorting algorithm. Since you wanted to go with BubbleSort:
Private Sub StringBubbleSort(arr As String)
For i As Integer = 0 To arr.Length - 1
For j As Integer = 0 To arr.Length - 2 - i
If String.Compare(arr(j), arr(j + 1)) > 0 Then
Dim temp As String = arr(j)
arr(j) = arr(i)
arr(i) = temp
End If
Next
Next
End Sub
Then you use this function and copy the array to your second ListBox.
StringBubbleSort(arr)
ListBox2.Items.AddRange(arr)
String.Compare: https://msdn.microsoft.com/de-de/library/84787k22(v=vs.110).aspx
you could use linq
ListBox1.Items.Add("Battle")
ListBox1.Items.Add("Cattle")
ListBox1.Items.Add("apple")
ListBox2.DataSource = (From l In ListBox1.Items
Select l Order By l Ascending).ToList

Reduce amount of dimensions in an array

I have Range(one dimensional), that I want to summarize in one cell by concatenating all values. I thought that I could do just:
Dim Data_array()
Dim Source_Range as Range
Set Source_Range = Selection
Data_array() = Source_Range.Value2
Source_range.Offset( -1 ,0).Value = Join(Data_array, ", ")
This however returns error 5 because Data_array is a ( 1 To X, 1 To 1) array it has two dimensions, and Join on last line requires that you provide just one dimenstional array.
So my question would be is there a way to remove that "1 To 1" dimension?
If not how would you concatenate a one dimensional range in one cell.
Example
A
1
2 2
3 4
4 6
Desired Result
A
1 2, 4, 6
2 2
3 4
4 6
You were so close! The code below assumes you will select the cells below the empty target cell. I't is simply two tweaks from your original code:
Sub testing()
Dim Data_array()
Dim Source_Range As Range
Set Source_Range = Selection
Data_array() = WorksheetFunction.Transpose(Source_Range.Value2)
Source_Range.Offset(-1, 0).Resize(1, 1).Value = Join(Data_array, ", ")
End Sub
Below is an idea. NOTE: I'm not sure that the OFFSET part of your code does what you want it to do. Test the code, and let me know if so.
Dim Data_array()
Dim Source_Range As Range
Dim nIncrement As Integer
Set Source_Range = Selection
nIncrement = 1
ReDim Data_array(1 To Source_Range.Rows.Count)
For Each cel In Source_Range
Data_array(nIncrement) = cel.Value
nIncrement = nIncrement + 1
Next cel
Source_Range.Offset(-1, 0).Value = Join(Data_array, ", ")
For your data, I would not bother with a VBA array. Consider:
Public Function Konkat(rin As Range) As String
For Each r In rin
v = r.Value
If v <> "" Then
Konkat = Konkat & "," & v
End If
Next r
Konkat = Right(Konkat, Len(Konkat) - 1)
End Function
This is because in your code, data_Array is actually a two-dimensional array.
You can use the INDEX worksheet function to slice out a column or row.
Sub JoinRangeComma()
Dim vaData As Variant
Dim rSource As Range
Dim wf As WorksheetFunction
Set wf = Application.WorksheetFunction
Set rSource = Selection
vaData = rSource.Value2
rSource.Cells(1).Offset(-1, 0).Value = Join(wf.Index(wf.Transpose(vaData), 1, 0), ", ")
End Sub

Grade Array Averager troubles

I am currently in an IT curriculum in college. Advance Visual Basic 2010 is a requirement however, I am not a programmer. I have been struggling to find my way through VB but this last assignment has me stumped.I am able to get the first name into the array and the 5 grades for that name . At that point, the loop will continue to ask for the next name and that names 5 grades and so on until the 4th name and grades are entered and then it should display all 4 names and grade averages in the listbox.
Here is the assignment...
Write a program that will input four students’ names and average five test grades for each student. The program should have an array for the students name and then a two-dimensional array for all their grades.
Your program should ask for the students name and then five test scores for that student.
Create a method that does the averaging and pass the arrays to that method. That method can also output the student name and average in a list box.
Call a method to figure up the average once you get all the grades. Do not figure it up as you get the information!! You’ll get a big ole zero if you do! Then have that same method output the results into the list box:
After 4 days of struggling with this, here is what I have come up with so far. Any guidance is greatly appreciated. Thank you in advance.
Public Class Form1
Private Sub btnNames_Click(sender As System.Object, e As System.EventArgs) Handles btnNames.Click
Dim NamesList(3) As String
Dim GradeArray(4) As Integer
Dim x As Integer
Dim y As Integer
Dim Sum As Integer
Dim Avg As Integer
For y = 0 To NamesList(3)
NamesList(x) = InputBox("Enter student number " & y + 1 & "'s name:", "Enter a name")
Next
For y = 0 To GradeArray.Length - 1
GradeArray(y) = InputBox("Enter grade number " & y + 1 & " for " & NamesList(0) & " in the box:", "Enter the grades")
Next
For Each item In GradeArray
Sum = Sum + item
Next
Avg = Sum / 5
lstAverages.Text = Avg.ToString
End Sub
Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
Me.Close()
End Sub
End Class
I had nothing else better to do, so I took up giving it a try... Also this includes per as you stated: 4 students - 5 grades each, array for students names and a 2D array to hold all their grades. There's a method that passes these to it and performs the averaging of the students grades and then spits them to a listbox as requested ... Happy Coding!
P.S. I didn't do any error handling either, you may want to add that or at least implement something to handle such cases ...
Public Class Form1
Private arrStudents(3) As String 'Student's name array (4)
Private arrScores(3, 4) As Integer 'Students scores (5 each)
'Start getting the data we need
Private Sub btnGetStudents_Click(sender As Object, e As EventArgs) Handles btnGetStudents.Click
Dim strStudent As String = String.Empty
Dim intScore As Integer = 0
Dim intPlace As Integer = 0
'Get the students name...
For i As Integer = 0 To arrStudents.Length - 1
Do Until strStudent <> String.Empty
strStudent = InputBox("Please enter student's name: ", "Gather Student Grades")
Loop
arrStudents(i) = strStudent
'Reset our variable...
strStudent = String.Empty
'Get the students grades...
For s As Integer = 0 To arrScores.Length - 1
Do Until intScore > 0
intScore = CInt(InputBox("Please enter student's scores: ", "Gather Student Scores"))
Loop
If (intPlace = 4 AndAlso i = arrStudents.Length) Then
intPlace = 0
arrScores(i, s) = intScore
intScore = 0
ElseIf intPlace = 4 Then
intPlace = 0
arrScores(i, s) = intScore
intScore = 0
Exit For
Else
arrScores(i, intPlace) = intScore
intPlace += 1
End If
'Reset our variables...
intScore = 0
Next
Next
'Calculate and output the data to the listbox...
GetStudentAverages(arrStudents, arrScores)
End Sub
'Function to average per student grades and then display them all in the listbox...
Private Sub GetStudentAverages(ByVal arStudent As Array, ByVal arScore As Array)
Dim strStudentData As String = String.Empty
Dim intAverage As Integer = 0
Dim intPlace As Integer = 0
'Start averaging the students scores and then add them to the listbox...
For i As Integer = 0 To arStudent.Length - 1
For g As Integer = 0 To arScore.Length - 1
If intPlace = arStudent.Length Then
intAverage += arScore(i, intPlace)
Exit For
Else
intAverage += arScore(i, intPlace)
intPlace += 1
End If
Next
intAverage = CInt(intAverage / 5)
intPlace = 0
'Output the student information...
ListBox1.Items.Add("Student: " & arStudent(i).ToString & " Average: " & intAverage.ToString)
intAverage = 0
Next
End Sub
End Class

Resources