2016-05-02 9 views
1

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 
+0

申し訳ありませんか? – BruceWayne

+0

それは事です。私はエラーが発生しているのを見つけることができません。私がDVのデータを入力すると、 "Loc = Application.Match ..."という行がタイプミスマッチのために失敗します。しかし、それは私にトラブルを与えているそれの後にすべてがどのように処理されるかです。私の編集を参照してください... – asp8811

答えて

2

あなたは完全なホワイトペーパーをする時間を持っていない...........非常にオープンエンドの質問があり、ここにあります簡単な実験。

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim A1 As Range, rINT As Range 

    Set A1 = Range("A1") 
    Set rINT = Intersect(A1, Target) 
    If rINT Is Nothing Then Exit Sub 
    MsgBox A1.Value 
End Sub 

A1、Iセットアップ DVは、次のように:私は、イベントコードを使用私は、ドロップダウンを使用している場合

enter image description here

を、私は、入力された値を取得し、私もMsgBoxを得る。しかし、私は、セルをクリックして、いくつかのジャンクを入力するとされて何が起こるか:

  1. DVアラートが発生したと私は私が MsgBox出現、オリジナルの内容で、それぞれを取得し、[キャンセル]ボタン
  2. に触れます試みられたジャンクよりむしろ!!

私は、イベントが二回を上げている理由のセルが実際にはおろか、変更されませんので、イベントが発生した理由を絶対にないアイデアを持っていません!ほとんどの場合、迷惑エントリでイベントが発生するのは ですが、DVアラームが優先され、DVがエントリを逆にして別のイベントが発生し、最後に両方のイベントが処理されます。

うまくいけば、人私はチャイムになるよりも賢い。クエリへのREF、DVのための回避策で

+0

質問のオープンエンドのため申し訳ありません。何が起こっているのか分からないので、具体的に何を求めているのか考えられませんでした。この実験は多くのことを明確にしています。イベントの1つの失敗がイベントを無効にする原因ではなく、どちらのイベントの処理によっても何らかの形でマスクされているかどうかは疑問です。私は、Excelについてもっと深く知っている人なら、それに答える必要があると思います。再度、感謝します! – asp8811

0

と変更イベントが管理されています。あなたがそこにそれを置くが、エラーハンドラなしで、どのようなエラーがどの行で発生した場合に

Public strRange As String 
Public bCheck As Boolean 

Private Sub Worksheet_Change(ByVal Target As Range) 
If bCheck Then Exit Sub 

MsgBox "Correct Entry!" 

strRange = Target.Address 
bCheck = True 
End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
If Target.Address <> strRange Then bCheck = False 
End Sub 

http://forum.chandoo.org/threads/multiple-worksheet-change-event-with-data-validation.32750

関連する問題