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