VBA возвращает неправильный набор записей - PullRequest
0 голосов
/ 05 октября 2018

У меня есть макрос VBA, который объединяет результаты, если есть несколько результатов в день.Он извлекает данные из электронной таблицы Excel в виде ADODB.Recordset.Макрос находит строки для манипуляции и заполняет значения в новом столбце, начиная с 1, и увеличивается по мере необходимости.

    Set preprocessRng = Range(Cells(2, 28), Cells(30093, 28))

    For i = 1 To 98
        resultConCat = ""
        sql = "SELECT [Result] FROM [output$A1:BA30093] WHERE PreProcess = CInt(" & i & ");"

        rs.Open sql, dbs, adOpenStatic, adLockOptimistic
        With rs
            If Not .BOF And Not .EOF Then
                .MoveLast
                .MoveFirst

                While (Not .EOF)
                    If resultConCat = "" Then
                        resultConCat = rs.Fields(0).Value
                    Else
                        resultConCat = resultConCat & " / " & rs.Fields(0).Value
                    End If
                    .MoveNext
                Wend

                Set firstCell = preprocessRng.Find(CInt(i))
                Set aCell = preprocessRng.Find(CInt(i))

                Do While Not aCell Is Nothing
                    Cells(aCell.Row, 27).Value = CStr(resultConCat)
                    Set aCell = preprocessRng.FindNext(After:=aCell)
                    If aCell.Address = firstCell.Address Then Exit Do
                Loop

            End If
        .Close
        End With
    Next i

Проблема в том, что есть результаты, где PreProcess = 1, но этот запрос возвращает 0 строк.Когда sql =, где PreProcess = 2, возвращенный набор результатов находится там, где PreProcess фактически равен 1. Этот шаблон продолжается до тех пор, пока PreProcess = 60, где возвращенный набор записей фактически не будет, где PreProcess = 59 и 60. Затем, начиная с 61, возвращается правильный набор записей.,

Фактические результаты против.Желаемые результаты

Если макрос выполняется повторно с тем же набором данных, проблем нет.С тех пор я решил эту проблему, запустив PreProcess со 100 и увеличив его оттуда.

    Set preprocessRng = Range(Cells(2, 28), Cells(30093, 28))

    For i = 1 To 98
        resultConCat = ""
        sql = "SELECT [Result] FROM [output$A1:BA30093] WHERE PreProcess = CInt(" & i + 100 & ");" 'modified

        rs.Open sql, dbs, adOpenStatic, adLockOptimistic
        With rs
            If Not .BOF And Not .EOF Then
                .MoveLast
                .MoveFirst

                While (Not .EOF)
                    If resultConCat = "" Then
                        resultConCat = rs.Fields(0).Value
                    Else
                        resultConCat = resultConCat & " / " & rs.Fields(0).Value
                    End If
                    .MoveNext
                Wend

                Set firstCell = preprocessRng.Find(CInt(i + 100)) 'modified
                Set aCell = preprocessRng.Find(CInt(i + 100)) 'modified

                Do While Not aCell Is Nothing
                    Cells(aCell.Row, 27).Value = CStr(resultConCat)
                    Set aCell = preprocessRng.FindNext(After:=aCell)
                    If aCell.Address = firstCell.Address Then Exit Do
                Loop

            End If
        .Close
        End With
    Next i

У меня есть обходной путь, но я все еще задаюсь вопросом, почему это происходит?Я исчерпал все это и не нашел ничего похожего на эту проблему.Комментарии и предложения приветствуются.

...