VBAマクロを使用してデータベースにクエリを実行し、ブックのアクティブ化イベントを使用してブックを開いたときに使用可能なプロジェクトのリストを作成します。私は2つの別々のデータ検証リストに結合され、2つのセルに適用されるプロジェクト番号とプロジェクト名を持っています。ワークシート変更イベントは、これらのセルの変更をテストし、データ検証リストを配列に分割し、他の配列から対応するプロジェクト情報を選択します。たとえば、プロジェクト番号を選択すると、ワークシート変更イベントはプロジェクト番号配列内のプロジェクト番号の位置を見つけて、位置に基づいて名前配列からプロジェクトの名前を選択します。データの検証とワークシート変更イベント
ドロップダウンから値を選択すると完全に機能しますが、リスト外の値を入力すると問題が発生します。たとえば、空白のセルを入力すると、データの検証エラーが発生する可能性があります。また、一致を使用して配列に入力された値が見つかると、型が一致しないことがあります。型の不一致を処理するエラーハンドラがありますが、データ検証エラーが毎回トリガされるようにしたいと思います。別の問題は、イベントが無効になることがあることです。ユーザーはこれを元に戻す方法がないため、これははるかに深刻です。
これに加えて、私はどこでどのように起こっているのか把握できません。ブレークを使用してイベントを無効にする方法を複製することはできません。なぜなら、ブレークを無効にしてイベントを発生させるステップを複製するだけでエラーハンドラが発生するからです。ただし、ブレークが適用されないと、エラーハンドラがトリガされず、イベントが無効になることがあります。配列を解析する直前にイベントを無効にするので、ワークシートの変更はLoc=Application.Match(Target.Text, NumArr, 0) - 1
行で失敗すると思っていますが、エラーが発生しない理由はわかりません。少なくとも、エラー番号と説明を含むメッセージを受け取る必要があり、イベントを再び有効にする必要があります。
ワークシートの変更とデータ検証の相互作用についてアドバイスできますか?ここで電話番号は何ですか?その他のアドバイスは?私が行方不明のものは何ですか?
ETA:これをGoogleで検索しましたが、役に立たないものは見つかりませんでした。表示されるすべてのことは、データの検証をワークシートの変更、つまり相互作用や呼び出しの順序について行うことです。
ETA#2:下記の回答(Gary's Studentありがとう)の実験を試した後、少し奇妙になります。 「再試行」を選択して古いデフォルト値を選択すると、古い値が3回取得されます。私がdeleteを押すと、メッセージボックスにスペースが1つしかないが、メッセージボックスは1つしかない。その後、セルは空白のままです。 「再試行」をクリックしてスペースを受け入れることで、DVをループに入れることができます。キャンセルをクリックするまで、DVエラーが表示されます。それから私は、空のセルを再試行するたびに、一連の空のテキストメッセージボックスを取得します。リストされた値で開始し、バックスペースでセルをクリアし、「再試行」をクリックして別の値を選択しようとすると、ワークシートの変更イベントはインターセクトで3回失敗します。私は下の答えが何が起こっているのかをより明るくすると思うが、それはさらに多くの質問をもたらす。ここで
は私が持っているコードは次のとおりです。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NumArr() As String
Dim ProjArr() As String
Dim Loc As Integer
On Error GoTo ErrHandler:
If Target.Address = "$E$4" Then
'Disable events to prevent worksheet change trigger on cell upates
Application.EnableEvents = False
'Parse validation lists to arrays
NumArr = Split(Target.Validation.Formula1, ",")
ProjArr = Split(Target.Offset(1, 0).Validation.Formula1, ",")
'Change error handler
On Error GoTo SpaceHandler:
'Determine project number location in array
Loc = Application.Match(Target.Text, NumArr, 0) - 1
'Change error handler
On Error GoTo ErrHandler:
'Change cell value to corresponding project name based on array location
Target.Offset(1, 0) = ProjArr(Loc)
'Unlock cells to prepare for editing, reset any previously imported codes
Range("C8:G32").Locked = False
'Run revenue code import
RevenueCodeCollector.ImportRevenueCodes
'Re-enable events
Application.EnableEvents = True
End If
If Target.Address = "$E$5" Then
Application.EnableEvents = False
NumArr = Split(Target.Validation.Formula1, ",")
ProjArr = Split(Target.Offset(-1, 0).Validation.Formula1, ",")
Loc = Application.Match(Target.Text, NumArr, 0) - 1
Target.Offset(-1, 0) = ProjArr(Loc)
Range("C8:G32").Locked = False
RevenueCodeCollector.ImportRevenueCodes
Application.EnableEvents = True
End If
Exit Sub
ErrHandler:
MsgBox Err.Number & " " & Err.Description
Application.EnableEvents = True
Exit Sub
SpaceHandler:
MsgBox "Pick a project from the dropdown.", vbOKOnly, "Error"
Application.EnableEvents = True
End Sub
申し訳ありませんか? – BruceWayne
それは事です。私はエラーが発生しているのを見つけることができません。私がDVのデータを入力すると、 "Loc = Application.Match ..."という行がタイプミスマッチのために失敗します。しかし、それは私にトラブルを与えているそれの後にすべてがどのように処理されるかです。私の編集を参照してください... – asp8811