Добавление нескольких столбцов из нескольких значений строки в массив пользовательского типа - PullRequest
0 голосов
/ 10 января 2019

У меня есть рабочий лист, который отслеживает результаты тестов учащихся и информацию о gpa. Макет рабочего листа выглядит следующим образом:

Идентификатор студента, Имя, Балл теста 1, Балл теста 2, Итоговый балл за экзамен, средний балл и итоговый балл. Есть 20 рядов.

Мне нужно получить студенческий билет, независимо от того, сдавали ли они итоговый экзамен, gpa и итоговый балл, и сохранить их в массиве нестандартного типа. Затем будет форма, в которой студент вводит свой идентификатор и извлекает соответствующие данные из массива.

Я поместил образец таблицы из двух строк и код VBA, который у меня есть.

Мой вопрос: как мне получить эти данные в массив?

Я совершенно сбит с толку ...

<div id="good_5932" align=center x:publishsource="Excel">

<table border=0 cellpadding=0 cellspacing=0 width=611 class=xl635932
 style='border-collapse:collapse;table-layout:fixed;width:458pt'>
 <col class=xl635932 width=74 style='mso-width-source:userset;mso-width- 
 alt:
 2645;width:56pt'>
 <col class=xl635932 width=100 style='mso-width-source:userset;mso-width- 
 alt:
 3555;width:75pt'>
 <col class=xl635932 width=76 style='mso-width-source:userset;mso-width- 
 alt:
 2702;width:57pt'>
 <col class=xl635932 width=77 style='mso-width-source:userset;mso-width- 
 alt:
 2730;width:58pt'>
 <col class=xl635932 width=152 style='mso-width-source:userset;mso-width- 
 alt:
 5404;width:114pt'>
 <col class=xl635932 width=66 style='width:49pt'>
 <col class=xl695932 width=66 style='width:49pt'>
 <tr height=37 style='height:27.6pt'>
  <td height=37 class=xl655932 width=74 
  style='height:27.6pt;width:56pt'>Student
  ID</td>
  <td class=xl655932 width=100 style='border-left:none;width:75pt'>Student 
  Name</td>
  <td class=xl665932 width=76 style='border-left:none;width:57pt'>Test 1 
  Score</td>
  <td class=xl665932 width=77 style='border-left:none;width:58pt'>Test 2 
  Score</td>
  <td class=xl665932 width=152 style='border- 
 left:none;width:114pt'>Comprehensive
  Final</td>
  <td class=xl665932 width=66 style='border-left:none;width:49pt'>Student 
  GPA</td>
  <td class=xl685932 width=66 style='border-left:none;width:49pt'>Final 
  Score</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>5</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Joe<span
  style='mso-spacerun:yes'> </span></td>
  <td class=xl645932 style='border-top:none;border-left:none'>78</td>
  <td class=xl675932 style='border-top:none;border-left:none'>12</td>
  <td class=xl645932 style='border-top:none;border-left:none'>87</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.5</td>
  <td class=xl675932 style='border-top:none;border-left:none'>96</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>7</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Hans</td>
  <td class=xl645932 style='border-top:none;border-left:none'>80</td>
  <td class=xl675932 style='border-top:none;border-left:none'>98</td>
  <td class=xl645932 style='border-top:none;border-left:none'>98</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.7</td>
  <td class=xl675932 style='border-top:none;border-left:none'>98</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>8</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Ferris</td>
  <td class=xl645932 style='border-top:none;border-left:none'>92</td>
  <td class=xl675932 style='border-top:none;border-left:none'>56</td>
  <td class=xl645932 style='border-top:none;border-left:none'>51</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3</td>
  <td class=xl675932 style='border-top:none;border-left:none'>66</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>10</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Mike</td>
  <td class=xl645932 style='border-top:none;border-left:none'>45</td>
  <td class=xl675932 style='border-top:none;border-left:none'>87</td>
  <td class=xl645932 style='border-top:none;border-left:none'>87</td>
  <td class=xl645932 style='border-top:none;border-left:none'>2.6</td>
  <td class=xl675932 style='border-top:none;border-left:none'>87</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>15</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Lauren</td>
  <td class=xl645932 style='border-top:none;border-left:none'>98</td>
  <td class=xl675932 style='border-top:none;border-left:none'>49</td>
  <td class=xl645932 style='border-top:none;border-left:none'>89</td>
  <td class=xl645932 style='border-top:none;border-left:none'>4</td>
  <td class=xl675932 style='border-top:none;border-left:none'>92</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
 top:none'>62</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Larry</td>
  <td class=xl645932 style='border-top:none;border-left:none'>75</td>
  <td class=xl675932 style='border-top:none;border-left:none'>85</td>
  <td class=xl645932 style='border-top:none;border-left:none'>65</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.9</td>
  <td class=xl675932 style='border-top:none;border-left:none'>75</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
 top:none'>68</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Tony</td>
  <td class=xl645932 style='border-top:none;border-left:none'>48</td>
  <td class=xl675932 style='border-top:none;border-left:none'>87</td>
  <td class=xl645932 style='border-top:none;border-left:none'>89</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.5</td>
  <td class=xl675932 style='border-top:none;border-left:none'>96</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
 top:none'>85</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Kevin</td>
  <td class=xl645932 style='border-top:none;border-left:none'>68</td>
  <td class=xl675932 style='border-top:none;border-left:none'>83</td>
  <td class=xl645932 style='border-top:none;border-left:none'>79</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.2</td>
  <td class=xl675932 style='border-top:none;border-left:none'>80</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>98</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Sam</td>
  <td class=xl645932 style='border-top:none;border-left:none'>59</td>
  <td class=xl675932 style='border-top:none;border-left:none'>62</td>
  <td class=xl645932 style='border-top:none;border-left:none'>98</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.6</td>
  <td class=xl675932 style='border-top:none;border-left:none'>87</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
 top:none'>101</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Zibin</td>
  <td class=xl645932 style='border-top:none;border-left:none'>63</td>
  <td class=xl675932 style='border-top:none;border-left:none'>68</td>
  <td class=xl645932 style='border-top:none;border-left:none'>95</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.5</td>
  <td class=xl675932 style='border-top:none;border-left:none'>88</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>105</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Ran</td>
  <td class=xl645932 style='border-top:none;border-left:none'>49</td>
  <td class=xl675932 style='border-top:none;border-left:none'>59</td>
  <td class=xl645932 style='border-top:none;border-left:none'>94</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.8</td>
  <td class=xl675932 style='border-top:none;border-left:none'>85</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>108</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Donia</td>
  <td class=xl645932 style='border-top:none;border-left:none'>87</td>
  <td class=xl675932 style='border-top:none;border-left:none'>12</td>
  <td class=xl645932 style='border-top:none;border-left:none'>92</td>
  <td class=xl645932 style='border-top:none;border-left:none'>2.9</td>
  <td class=xl675932 style='border-top:none;border-left:none'>104</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>109</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Kate</td>
  <td class=xl645932 style='border-top:none;border-left:none'>85</td>
  <td class=xl675932 style='border-top:none;border-left:none'>57</td>
  <td class=xl645932 style='border-top:none;border-left:none'>49</td>
  <td class=xl645932 style='border-top:none;border-left:none'>2.6</td>
  <td class=xl675932 style='border-top:none;border-left:none'>64</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>110</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Sahar</td>
  <td class=xl645932 style='border-top:none;border-left:none'>45</td>
  <td class=xl675932 style='border-top:none;border-left:none'>59</td>
  <td class=xl645932 style='border-top:none;border-left:none'>87</td>
  <td class=xl645932 style='border-top:none;border-left:none'>2.7</td>
  <td class=xl675932 style='border-top:none;border-left:none'>81</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>115</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Milos</td>
  <td class=xl645932 style='border-top:none;border-left:none'>21</td>
  <td class=xl675932 style='border-top:none;border-left:none'>49</td>
  <td class=xl645932 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.8</td>
  <td class=xl675932 style='border-top:none;border-left:none'>35</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>125</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Brian</td>
  <td class=xl645932 style='border-top:none;border-left:none'>49</td>
  <td class=xl675932 style='border-top:none;border-left:none'>98</td>
  <td class=xl645932 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.9</td>
  <td class=xl675932 style='border-top:none;border-left:none'>74</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
 top:none'>130</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Zane</td>
  <td class=xl645932 style='border-top:none;border-left:none'>34</td>
  <td class=xl675932 style='border-top:none;border-left:none'>38</td>
  <td class=xl645932 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.2</td>
  <td class=xl675932 style='border-top:none;border-left:none'>36</td>
 </tr>

 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>145</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Istiak</td>
  <td class=xl645932 style='border-top:none;border-left:none'>91</td>
  <td class=xl675932 style='border-top:none;border-left:none'>87</td>
  <td class=xl645932 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3.1</td>
  <td class=xl675932 style='border-top:none;border-left:none'>89</td>

 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>150</td>
  <td class=xl645932 style='border-top:none;border-left:none'>Kumari</td>
  <td class=xl645932 style='border-top:none;border-left:none'>100</td>
  <td class=xl675932 style='border-top:none;border-left:none'>78</td>
  <td class=xl645932 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl645932 style='border-top:none;border-left:none'>3</td>
  <td class=xl675932 style='border-top:none;border-left:none'>89</td>
 </tr>
 <tr height=19 style='height:14.4pt'>
  <td height=19 class=xl645932 style='height:14.4pt;border- 
  top:none'>186</td>
  <td class=xl645932 style='border-top:none;border-left:none'>John</td>
  <td class=xl645932 style='border-top:none;border-left:none'>19</td>
  <td class=xl675932 style='border-top:none;border-left:none'>76</td>
  <td class=xl645932 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl645932 style='border-top:none;border-left:none'>2.9</td>
  <td class=xl675932 style='border-top:none;border-left:none'>48</td>
 </tr>
 <![if supportMisalignedColumns]>
 <tr height=0 style='display:none'>
  <td width=74 style='width:56pt'></td>
  <td width=100 style='width:75pt'></td>
  <td width=76 style='width:57pt'></td>
  <td width=77 style='width:58pt'></td>
  <td width=152 style='width:114pt'></td>
  <td width=66 style='width:49pt'></td>
  <td width=66 style='width:49pt'></td>
 </tr>
 <![endif]>
</table>

</div>
Option Explicit

'***** MyType as an array
Public Type Student
StudentID As Integer ' Student ID
FinalScore As Integer ' Studnts final score
ComprehensiveTaker As Integer ' Comprehensivetaker
StudentGPA As Double ' Student's GPA
End Type

Public CEEStudent(20) As Student

Public Sub fillCEEStudent()

    Dim j As Long, i As Long, CEEStudent(20) As Student
            j = 0
            i = 3

          If j < 21 And i < 23 Then
            j = j
            i = i

            CEEStudent(j).StudentID = Sheets("Question1").Cells(i, 3).Value
            CEEStudent(j).ComprehensiveTaker = IIf(Sheets("Question1").Cells(i, 7).Value <> "", 1, 0)
            CEEStudent(j).StudentGPA = Sheets("Question1").Cells(i, 8).Value
            CEEStudent(j).FinalScore = Sheets("Question1").Cells(i, 9).Value
          Else:
            j = 0
            i = 3

         End If

    Dim formNum As Integer, formScore As Integer, formGPA As Double, formInput As String

    With VBAProject.UserForm1

        formInput = 5 'VBAProject.UserForm1.TextBox1.Value

        If IsNumeric(formInput) Then
            formNum = formInput
        Else
            formNum = 0
        End If

        If formInput <> "" And formNum > 0 Then
                If CEEStudent(j).StudentID > formNum Or CEEStudent(j).StudentID < formNum Then
                    VBAProject.UserForm1.TextBox2.Text = CStr(" ")
                    VBAProject.UserForm1.BackColor = vbRed
                    VBAProject.UserForm1.StudentID.BackColor = vbRed
                    VBAProject.UserForm1.TestScore.BackColor = vbRed
                    VBAProject.UserForm1.GPA.BackColor = vbRed
                    VBAProject.UserForm1.TextBox2.BackColor = vbRed
                    VBAProject.UserForm1.TextBox3.BackColor = vbRed
                Else:
                    VBAProject.UserForm1.TextBox2.Text = CStr(CEEStudent(j).FinalScore)
                    VBAProject.UserForm1.TextBox3.Text = CStr(CEEStudent(j).StudentGPA)
                End If
        Else:
            formScore = 0
        End If

        VBAProject.UserForm1.TextBox2.Text = CStr(formScore)
        VBAProject.UserForm1.TextBox3.Text = CStr(formGPA)

        If VBAProject.UserForm1.TextBox2.Text >= 95 Then
           VBAProject.UserForm1.BackColor = vbGreen
           VBAProject.UserForm1.TextBox2.BackColor = vbGreen
           VBAProject.UserForm1.TextBox3.BackColor = vbGreen


        If VBAProject.UserForm1.TextBox2.Text < 95 And VBAProject.UserForm1.TextBox3.Text > 3.5 Then
           VBAProject.UserForm1.BackColor = vbBlue
           VBAProject.UserForm1.TextBox2.BackColor = Gray
           VBAProject.UserForm1.TextBox3.BackColor = Gray
        Else:
           VBAProject.UserForm1.BackColor = Gray
           VBAProject.UserForm1.TextBox2.BackColor = Gray
           VBAProject.UserForm1.TextBox3.BackColor = Gray

        End If
    End If
  End With
End Sub

**** ***** EDIT 1019 * Я добавил HTML-код для фактической таблицы в приведенном выше фрагменте ... Таблица находится на листе с именем Question1 и начинается с C2, представляющего собой «Идентификатор студента», а затем C3, являющегося первой строкой учащихся.

Приведенный выше код компилируется и запускается, но не возвращает значения. Я добавил кнопку, чтобы открыть userForm1 на листе («Question2»), нажмите на нее, и форма откроется. введите номер 5 для идентификатора студента (который соответствует моей информации о студенте в первой строке), и он возвращает 0 для оценки и средний балл, когда он должен вернуть фактические цифры.

Итак, мы куда-то добираемся ....

Массив:

CEEStudent {

(0)StudentID : 5
   FinalScore : 96
   ComprehensiveTaker : 1
   StudentGPA : 3.6

(1)StudentID : 7
   FinalScore : 88
   ComprehensiveTaker : 1
   StudentGPA : 3.8

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вначале я не очень разбираюсь в материалах для публичных студентов и не думаю, что нужно делать то, что вам нужно. Пока вы знаете, как настроить пользовательскую форму (о которой я ничего не знаю) Следующий код должен делать то, что вам нужно.

sub macro()

Dim id as int, CEEEStudent() as variant, idRow as long, ws1 as Worksheet, ws2 as Worksheet

Set ws1 = ThisWorkbook.Worksheets("Question 1")
Set ws2 = ThisWorkbook.Worksheets("Sheet where data goes")

'insert code for a userform and store studentid = id here
id = ?


'this checks each row on the sheet and compares it to id, when it finds a match the row is stored to idRow
for x = 1 to Cells(Rows.Count, 1).End(xlUp).Row
    if id = ws1.cells(x, 1) Then
    idRow = x
    Else:
    End if
next x

'this stores the student's results to CEEEStudent(), each time a new student logs in it will overwrite the data from the previous student 
CEEEStudent(0) = ws1.Cells(idRow, 1).value
CEEEStudent(1) = ws1.Cells(idRow, 5).value
CEEEStudent(2) = ws1.Cells(idRow, 6).value
CEEEStudent(3) = ws1.Cells(idRow, 7).value

ws2.activate

'This sets the value and headers that the student will see.  Again this will be overwritten after every login.

ws2.Cells(1, 1).Value = "Student ID"
ws2.Cells(2, 1).Value = CEEEStudent(0)

ws2.Cells(1, 2).Value = "Final Exam"
ws2.Cells(2, 2).Value = CEEEStudent(1)

ws2.Cells(1, 3).Value = "GPA"
ws2.Cells(2, 3).Value = CEEEStudent(2)

ws2.Cells(1, 4).Value = "Final Score"
ws2.Cells(2, 4).Value = CEEEStudent(3)




end sub

РЕДАКТИРОВАТЬ 1

Public Type Student
StudentID As Integer ' Student ID
FinalScore As Integer ' Studnts final score
ComprehensiveTaker As Integer ' Comprehensivetaker
StudentGPA As Double ' Student's GPA
End Type

Public CEEStudent(20) As Student

public Sub test()

Cells(1, 1).Value = CEEStudent(20).StudentID 
Cells(1, 2).Value = CEEStudent(20).StudentGPA 
Cells(1, 3).Value = CEEStudent(20).ComprehensiveTaker 
Cells(1, 4).Value = CEEStudent(20).FinalScore                             

End sub
0 голосов
/ 10 января 2019

Примерно так должно работать:

Public CEEStudent() As Student


'***** MyType as an array
Public Sub fillCEEStudent()
    Dim j As Long, i As Long

    ReDim CEEStudent(20)

    With ThisWorkbook.Sheets("Question1")
        j = 0
        For i = 3 To 22
            'might need to tweak the column positions
            CEEStudent(j).StudentID = .Cells(i, "C").Value
            CEEStudent(j).StudentGPA = .Cells(i, "H").Value
            CEEStudent(j).ComprehensiveTaker = IIf(.Cells(i, "G").Value <> "", 1, 0)
            CEEStudent(j).FinalScore = .Cells(i, "I").Value
            j = j + 1
        Next i
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...