Я пишу функцию, которая принимает в качестве входной строки начальную строку, завершающую строку, столбец и строковое значение. Затем функция запрашивает базу данных со строковым значением, чтобы получить список результатов, соответствующих запросу. Оттуда в каждой строке от начала до конца будет добавлен комбинированный блок и заполнены результирующими данными запроса.Либо BOF, либо EOF истинно и не удается получить свойство OLEObjects
Когда я пытаюсь запустить этот код, он терпит неудачу одним из двух способов. Вот мои ошибки:
Run-Time error '1021: Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
или
Unable to get OLEObjects property of worksheet class.
Это иногда работает в первой колонке добавленных комбо, чтобы только не на полпути через секунду.
Вызов функции:
For i = 0 To numMembers - 1
For j = 0 To UBound(toolNames) - 1
Call AddCombos(5 + j * 5, 9 + j * 5, 5 + i * 5, Cells(5 + j * 5, 1).value)
Next j
Next i
Добавить Комбо Функция:
Function AddCombos(ByVal startRow As Integer, ByVal LastRow As Integer, ByVal columnNum As Integer, ByVal Tool As String)
Dim MyLeft As Double
Dim MyTop As Double
Dim MyHeight As Double
Dim MyWidth As Double
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim curcombo As Object
Dim StrDBPath As String
strSQL = "SELECT qryCurrent.txtLevel AS [Current], [qrylstNames-LPMi].strFullName as [Full Name], tblWCMTools.txtWCMTool" & vbNewLine & _
"FROM (((tblPeopleWCMSkillsByYear" & vbNewLine & _
"LEFT JOIN tblSkillLevels AS qryCurrent ON tblPeopleWCMSkillsByYear.bytCurrentID = qryCurrent.atnSkillLevelID)" & vbNewLine & _
"INNER JOIN [qrylstNames-LPMi] ON tblPeopleWCMSkillsByYear.intPeopleID = [qrylstNames-LPMi].atnPeopleRecID)" & vbNewLine & _
"INNER JOIN tblWCMTools ON tblPeopleWCMSkillsByYear.intWCMSkillID = tblWCMTools.atnWCMToolID)" & vbNewLine & _
"WHERE (((tblPeopleWCMSkillsByYear.bytYearID)=Year(Date())-2012) AND qryCurrent.txtLevel >='4' AND tblWCMTools.txtWCMTool = '" & Tool & "') ORDER BY strFullName;"
'database path
StrDBPath = "C:\Users\T6050R0\Desktop\WCMDB_be.accdb"
'open database
cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;" & _
"Data Source=" & StrDBPath & ";" & _
"Jet OLEDB:Engine Type=5;" & _
"Persist Security Info=False;"
rst.Open strSQL, cnn, adOpenStatic
'Iterate through each row
For i = startRow To LastRow
'If it's empty, than add a checkbox
If IsEmpty(Cells(i, columnNum)) Then
If (Cells(i, columnNum).ColumnWidth <> 20) Then
Cells(i, columnNum).ColumnWidth = 20
End If
'set position of checkbox (compared with cell that will be linked)
MyLeft = Cells(i, columnNum).Left
MyTop = Cells(i, columnNum).Top + 2.75
'set size of checkbox (compared with cell that will be linked)
MyHeight = Cells(i, columnNum).Height - 5
MyWidth = Cells(i, columnNum).Width
'add checkbox
Set curcombo = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=True, _
DisplayAsIcon:=False, Left:=MyLeft, Top:=MyTop, Width:=MyWidth, Height _
:=MyHeight + 1.5)
'Add a blank option first
curcombo.Object.AddItem ""
With Worksheets("Sheet1").OLEObjects(curcombo.Name)
.LinkedCell = Cells(i, columnNum).Address
'Move to first record in set
If (i > startRow) Then
MsgBox "yay"
rst.MoveFirst
End If
'add choices to dropdown
For k = 1 To rst.RecordCount
If rst.EOF Then
GoTo EndForLoop
End If
.Object.AddItem rst![Full Name]
If Not rst.EOF Then
rst.MoveNext
Else
GoTo EndForLoop
End If
Next k
EndForLoop:
End With
End If
Next i
End Function
Укажите, какие строки кода вызывают ошибки. – MatthewD
@MatthewD В нем не указано ни строк, выделенных после слова. –
Несколько вещей, которые я вижу - во-первых, это использование vbNewLine в вашей строке SQL и отсутствие пробела в конце каждой строки. Например, я бы изменил строку FROM в вашем SQL на «FROM» (((tblPeopleWCMSkillsByYear «& _») - обратите внимание на пробел в конце, а не на vbNewLine. Вторая вещь, которую я вижу, - это вы не проверяете, записи возвращаются - после строки 'rst.Open' добавить чек -' IF NOT rst.BOF и NOT rst.EOF THEN .... продолжить с остальной частью кода END IF'. Третий элемент - '1-й .RecordCount 'не всегда возвращает правильный счет. Используйте цикл 'DO WHILE NOT rst.EOF'. –