Я пытаюсь по-новому взглянуть на довольно открытый тест, который я создаю в Excel. В настоящее время VBA будет проходить через мою исходную таблицу (см. QuestionCount, getLastAnsRow и lastrow) и будет фокусироваться только на этих ячейках. Затем я пытаюсь передать эти значения в подпрограмму checkAnswers, чтобы он прошел через этот диапазон, проверил ответы на листе 2, а затем вывел 1 или 0. Я чувствую, что делаю что-то очевидное, но я измотан и потерян.
Option Explicit
Sub Q1()
Dim i As Integer
Dim ws1 As Worksheet
Dim answerRows(0 To 500) As Variant
Dim ansRowEnd As Long
Set ws1 = Worksheets("PracticalAlpha")
With ws1
For i = 0 To questionCount(ws1, answerRows) - 1
ansRowEnd = getLastAnsRow(ws1, answerRows(i))
Call checkAnswers(ws1, answerRows(i) + 1, ansRowEnd)
Next
End With
End Sub
checkAnswers
Public Sub checkAnswers(ws As Worksheet, ansRowStart As Long, ansRowEnd As Long)
Dim i As Integer
Dim j As Integer
Dim counter As Integer
Dim keyWords As Variant
Dim phrase As Variant
Dim phraseCount As Integer
ReDim check1(ansRowStart To ansRowEnd) As Boolean
Call questionCount
If ansRowStart > ansRowEnd Then ansRowStart = ansRowEnd
With ws
For i = ansRowStart To ansRowEnd
For j = ansRowStart To ansRowEnd
If .Cells(ansRowStart - 1, 1).Value <> "phrase test" And Not IsNumeric(.Cells(ansRowStart - 1, 1).Value) Then
If (.Cells(i + counter, 2) = Sheet2.Cells(j + counter,2))Then
check1(i) = True
Exit For
Else: check1(i) = False
End If
'counter = counter + 1
Next
Next
j = 0
For i = LBound(check1) To UBound(check1)
If check1(i) = True Then j = j + 1
Next
If j = questionCount Then
.Cells(ansRowStart, 6) = 1
Else: .Cells(ansRowStart, 6) = 0
ElseIf .Cells(ansRowStart, 1).Value = "phrase test" Then
keyWords = Split(Sheet2.Cells(ansRowStart, 2).Value, "' '")
For Each phrase In keyWords
keyWords(phraseCount) = LCase(Replace(keyWords(phraseCount), "'", ""))
If InStr(.Cells(ansRowStart, 2).Value, keyWords(phraseCount)) = 0 Then
.Cells(ansRowStart, 6) = 0
Exit Sub
End If
phraseCount = phraseCount + 1
Next phrase
.Cells(ansRowStart, 6) = 1
End If
End With
End Sub
getLastAnsRow
Private Function getLastAnsRow(ws As Worksheet, num As Variant)
Dim i As Integer
For i = num To 500
If ws.Cells(i, 2).Value = "*****" Then
getLastAnsRow = i - 1
If getLastAnsRow < i Then getLastAnsRow = i
Exit Function
End If
Next i
End Function
lastrow
Public Function lastrow(ws As Worksheet, colNum As Integer) As Long
Dim i As Long
Dim emptyCount As Long
With ws
For i = 1 To 10000
If .Cells(i, 2).Value = "" Then
emptyCount = emptyCount + 1
Else
emptyCount = 0
End If
If emptyCount = 100 Then
lastrow = i - emptyCount
Exit Function
End If
Next i
End With
End Function
questionCount
Private Function questionCount(ws As Worksheet, answerRows As Variant) As Long
Dim i As Long
Dim j As Integer
For i = 1 To lastrow(ws, 1)
If IsNumeric(ws.Cells(i, 1).Value) And ws.Cells(i, 1).Value <> "" Then
questionCount = questionCount + 1
answerRows(j) = i + 1
j = j + 1
End If
Next i
End Function