1

私はこのフォーラムを初めて使用するので、既に質問されていて見つけられなかった場合、または間違った場所に投稿している場合は申し訳ありません。

SQL からのデータに基づいてコンボボックスにデータを入力する、何年も使用してきたルーチンがあります。2 つのコンボボックスを含むスプレッドシートがあります。最初のコンボボックスは正常に機能し、SQL テーブルから直接フォルダ名のリストを表示します。2 番目のコンボボックスには、最初のコンボボックスで選択されたフォルダーに関連付けられているすべてのコントラクトが取り込まれます。ただし、コードを自動入力することはできません。コンボボックスを更新するには、最初にドロップダウンリストから項目を選択する必要があり、その後値が保持されません。以下にコードを貼り付けました。

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
4

2 に答える 2

0

私は最近この正確な問題を抱えていました。何が起こっているかというと、コンテンツの更新中に「Change」メソッドが頻繁に呼び出されます。例えば:

CB_Company.Clear

実際には、このメソッド全体が再度呼び出されます。ある時点で、Excel はこれらの処理を停止し、空白のボックスを残します。

このモジュールの上部にあるように、グローバル変数を単純に含める必要があります。

Public updatingContent As Boolean

次に、このサブの先頭に以下を含めます。

If updatingContent Then Exit Sub
updatingContent = True

これにより、コール チェーンが防止されます。

最後に、このハンドラーの最後に、以下を必ず含めてください。

updatingContent = False

メソッドをリセットします。


これらの変更を加えたコードを次に示します。

Public updatingContent As Boolean
Private Sub CB_Company_Change()

    If updatingContent Then Exit Sub
    updatingContent = True

    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

    updatingContent = False
End Sub
于 2013-10-14T14:58:38.597 に答える