SQL Server データベースにクエリを実行し、さまざまなシートに結果を入力するスプレッドシート ツールに取り組んでいます。データベース資格情報を入力するためのシンプルな GUI (書式設定されたセル) と、接続をテストする Excel フォーム ボタンをユーザーに提供します。ボタンが押され、接続文字列が正しく形成されたら、ステータス インジケーターの色を赤から緑に変更してこれを識別します。Worksheet_Change 関数を使用して資格情報を保持するセルの範囲にチェックを追加しました。これにより、セルのいずれかが変更された場合にステータスが緑から赤に戻ります。
問題は、ユーザーが接続文字列の一部 (おそらく最後のフィールド) を入力し、最初に Enter キーを押したり移動したりせずに [接続のテスト] ボタンを押していることです。実際に値をセルに書き込みます。「テスト接続」マクロ (ボタンにリンク) が最初に呼び出され、ステータス インジケーターが緑色に切り替わります (資格情報が正しいと仮定) が、ボタン マクロが実行されるまで Worksheet_Change メソッドは呼び出されません。その結果、データベース接続が正常に確立されているにもかかわらず、ステータス インジケータが緑から赤に点滅します。
現在のセルからフォーカスを手動で切り替えるなどのことを試しました。フォーム ボタンから「TestConnection」関数を呼び出す前に。しかし、これまでのところ何も機能していません。
編集:いくつかのコード...
Private Sub Worksheet_Change(ByVal Target As Range)
Call SetGlobals
'Check if database criteria has changed
If Not Intersect(Target, Target.Worksheet.Range(DB_CELL_RANGE)) Is Nothing Then
Call UpdateDBStatus(1)
End If
End Sub
'Connect to database using Main sheet credentials
Function TestConnection()
'Connection vars
Set cnn = New ADODB.Connection
'Open the connection.
On Error GoTo ConnectError
cnn.Open GetConnectionString()
'Update dependencies
'On Error GoTo FilterError
Call UpdateFilter("select ********", "F", "F")
Call UpdateFilter("select *******", "E", "E")
Call UpdateDBStatus(2)
MsgBox "Connected successfully to '" & DBASE & "' on machine '" & SERVER & "'"
'Cleanup
cnn.Close
Set cnn = Nothing
Exit Function
ConnectError:
Call UpdateDBStatus(1)
MsgBox "Could not establish a connection."
Exit Function
FilterError:
MsgBox "Filter Update Failure."
Exit Function
End Function
'Set the status of the database connection and mark the result
Public Function UpdateDBStatus(Status As Integer)
If Status = 1 Then
Sheets("Main").Range(DB_STATUS_CELL).Value = "Not Connected"
Sheets("Main").Range(DB_STATUS_CELL).Interior.ColorIndex = 3
DB_STATUS = False
Else
Sheets("Main").Range(DB_STATUS_CELL).Value = "Connected"
Sheets("Main").Range(DB_STATUS_CELL).Interior.ColorIndex = 4
DB_STATUS = True
End If
End Function
基本的に、誰かが現在 DB_CELL_RANGE 内のセルを編集していて、'Test Connection' ボタンを押した場合、'TestConnection' を呼び出す前に Worksheet_Change を完了させたいと考えています。