Цикл по определенному диапазону содержимого vba с поиском конкретных значений, ошибок индекса - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь по-новому взглянуть на довольно открытый тест, который я создаю в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...