Я новичок в этом форуме, поэтому извиняюсь, если это уже было задано, и я его не нашел, или если я публикую не то место.Auto-Populating Combobox с данными SQL
У меня есть обычная программа, которую я использую в течение многих лет, которая заполняет combobox на основе данных из SQL. У меня есть расширенный лист с двумя comboboxes в нем, первый combobox отлично работает и дает список имен папок прямо из таблицы SQL. Второе поле со списком заполняется всеми контрактами, которые связаны с папкой, выбранной в первом поле со списком. Однако я не могу получить код для автоматического заполнения, чтобы обновить combobox, я должен сначала выбрать элемент из выпадающего списка, а затем значение не будет сохранено. Я вставил свой код ниже:
Private Sub CB_Company_Change()
With Application
.Calculation = xlManual
.EnableEvents = False
.ScreenUpdating = False
End With
Dim stSQL As String, sBook As String, rst As ADODB.Recordset, k As Integer, vaData As Variant
Dim objConn As ADODB.Connection
Dim ConnectionString As String
ConnectionString = "Provider=sqloledb.1;data source=sql-server;Initial catalog=sql-db;Integrated Security = SSPI;"
Set objConn = New ADODB.Connection
sBook = CB_Book.Value
CB_Company.Clear
stSQL = "EXEC('SELECT Name FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.ID = TABLE2.ID WHERE TABLE2.NAME = ''" & sBook & "'' ORDER BY TABLE1.NAME')"
With objConn
.CursorLocation = adUseClient
.Open ConnectionString
Set rst = .Execute(stSQL)
End With
With rst
Set .ActiveConnection = Nothing
k = .Fields.Count
vaData = .GetRows
End With
CB_Company.List = Application.Transpose(vaData)
objConn.Close
Set rst = Nothing
Set objConn = Nothing
bClear = True
With Application
.Calculation = xlAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
Любая помощь, почему это не может быть автоматически заселение при запуске будет оценена.
В соответствии с просьбой здесь код из первого выпадающего списка, который дает мне свою балансовую стоимость:
Option Explicit
Public bClear As Boolean
Private Sub CB_Book_Change()
With Application
.Calculation = xlManual
.EnableEvents = False
.ScreenUpdating = False
End With
Dim stSQL As String, rst As ADODB.Recordset, k As Integer, vaData As Variant
Dim objConn As ADODB.Connection
Dim ConnectionString As String
ConnectionString = "Provider=sqloledb.1;data source=SQL-SERVER;Initial catalog=SQL-DB;Integrated Security = SSPI;"
Set objConn = New ADODB.Connection
stSQL = "EXEC('SELECT NAME FROM TABLE2')"
With objConn
.CursorLocation = adUseClient
.Open ConnectionString
Set rst = .Execute(stSQL)
End With
With rst
Set .ActiveConnection = Nothing
k = .Fields.Count
vaData = .GetRows
End With
CB_Book.List = Application.Transpose(vaData)
objConn.Close
Set rst = Nothing
Set objConn = Nothing
bClear = True
With Application
.Calculation = xlAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
Где код, который заполняет второе поле со списком? Насколько я могу судить, эта процедура заполняет только «CB_Company». –
См. [Этот вопрос] (http://stackoverflow.com/questions/19276861/how-to-prevent-activex-events-firing-in-vba) - ваше событие снова и снова запускается, потому что сразу после того, CB_Company.Clear' снова вызывает этот метод. – enderland