Private Sub CommandButton1_Click()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim cntrl As String
Dim cl As String
cl = ComboBox2
cntrl = "UserForm." & UserForm.ActiveControl.Name & ".Text"
MsgBox cntrl
MsgBox cl
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\TMP\Project.mdb; Jet OLEDB:Database;"
cn.Open ConnectionString
'rs.Open "SELECT * FROM Itog WHERE id1='" & cl & "' AND id1 IS NOT NULL ORDER BY 1", cn, adOpenDynamic, adLockBatchOptimistic
rs.Open "SELECT * FROM Itog WHERE id1 like '" & cntrl & "' AND id1 IS NOT NULL ORDER BY 1", cn, adOpenDynamic, adLockBatchOptimistic
ActiveSheet.Range("B8").CopyFromRecordset rs
rs.Close
cn.Close
End Sub
Как правильно передать в запрос значение переменной? Строка работает
Код
rs.Open "SELECT * FROM Itog WHERE id1='" & cl & "' AND id1 IS NOT NULL ORDER BY 1", cn, adOpenDynamic, adLockBatchOptimistic
А эта строка не работает
Код
rs.Open "SELECT * FROM Itog WHERE id1 like '" & cntrl & "' AND id1 IS NOT NULL ORDER BY 1", cn, adOpenDynamic, adLockBatchOptimistic
Видимо, переменная передает в запрос не значение(которое надо сравнить), а просто текст переменной...
Alexban65, У вас вопрос не как передать значение в запрос , а как получить значение из элемента формы. cntrl = "UserForm." & UserForm.ActiveControl.Name & ".Text" присвоит переменной текстовое значением, например "UserForm.TextBox1.Text" которое конечно не равно ожидаемому вами значению текста в этом элементе.
Я ставлю combobox в запрос - работает. Combobox на форме содержит значение, которое и сравнивается в WHERE запроса. Когда я подключаю ActiveControl, который дает ссылку на combobox - оказалось, что конструкция не дает значение указанного combobox, в переменной получается просто текст а не значение combobox. Отдельно combobox значение дает, отдельно ActiveControl дает последний использованный combobox
Можно как то исхитриться и получить в переменную "cntrl" значение combobox на форме через ActiveControl??? Или это невозможно, и должны быть какие то обходные пути?
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
Alexban65, Только теперь название темы точно не соответствует вопросу. Предложите, модераторы заменят, да и код ваш с запросом совсем лишний. По самому вопросу, activecontrol в момент нажатия кнопки будет сама кнопка. Правильное название позволит привлеч внимание специалистам не по запросам SQL , а по обработке форм.
БМВ написал: Alexban65 , Только теперь название темы точно не соответствует вопросу. Предложите, модераторы заменят, да и код ваш с запросом совсем лишний.По самому вопросу, activecontrol в момент нажатия кнопки будет сама кнопка. Правильное название позволит привлеч внимание специалистам не по запросам SQL , а по обработке форм.
Спасибо за ответ. Я новичок на этом форуме, всего несколько дней. Даже не знаю как написать модератору об изменении темы...(( Думаю что теперь название темы "получить в переменную "cntrl" значение combobox на форме через ActiveControl???" было бы более правильным. Хотя наверняка можно сформулировать более точно и ясно - но уж как смог.
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
Alexban65, ActiveControl - у вас что? Это, при нажатии на кнопку, сама кнопка. Что вам нужно в итоге, сколько у Вас комбоксов и как они связаны с этой или многими кнопками?
Устал ждать.
Код
Private cbvalue As String
Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
cbvalue = ComboBox1.Value
End Sub
Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
cbvalue = ComboBox2.Value
End Sub
cbvalue - будет содержать значение комбобокса, последнего активного, перед жмаканием по кнопке.
БМВ написал: Alexban65 , ActiveControl - у вас что? Это, при нажатии на кнопку, сама кнопка. Что вам нужно в итоге, сколько у Вас комбоксов и как они связаны с этой или многими кнопками?
в свойствах кнопки установил TakeFocusOnClick=False, тогда ActiveControl сохранит ссылку на тот контрол, который был активным до нажатия кнопки. То есть по нажатию кнопки я получаю имя combobox, на котором фокус. Форма простая - 8 combobox и 2 кнопки(Результат и Выход). Сделал топором, перебрал все контролы, но работает
Код
Private Sub CommandButton2_Click()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
If ActiveControl.Name = "ComboBox8" Then
MsgBox ActiveControl.Name & "-x8"
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=С:\TMP\Project.mdb; Jet OLEDB:Database;"
cn.Open ConnectionString
rs.Open "SELECT * FROM Itog WHERE FactDateStart ='" & ComboBox8 & "' AND FactDateStart IS NOT NULL ORDER BY 1", cn, adOpenDynamic, adLockBatchOptimistic
ActiveSheet.Range("B8").CopyFromRecordset rs
rs.Close
cn.Close
End If
End Sub
Спасибо вам, БМВ, за беспокойство и поддержку...))
Цитата
ivanok_v2 написал: Alexban65 , замените наКод ? 1cntrl = UserForm.controls(UserForm.ActiveControl.Name).text Также поставте проверку на тип контрола, типа такогоКод ? 1If TypeOf ob Is MSForms.TextBox Then
Я уже говорил, что выпендреж вас до добра не доведет. В первом коде заменить ComboBox2 на ActiveControl, и все. Если на форме только комбо и кнопки, проверка типа смысла не имеет. А если тащить значение из ComboBox8, то какая разница, какой комбо активный?