2012-01-24 9 views
2

したがって、私はまだVBAで非常に初心者であることを前に説明します。私はこのコードを私ができることと誇りに思った最高のものにタイプしました。私はいくつかの追加機能を追加することにしました。私が望んだ最後の機能は、エラーがあったときに特定の情報をキャプチャして、メッセージボックスに表示することでした。Excel VBAエラー処理がそのジョブを実行していない

コードは何:

私は2つのワークブックを持っています。 Wkbook1は多数のデータ要素で満たされ、Wkbook2はマスターリストである。コードはwkbook1の最初の行を検索し、Wkbook2でそのフレーズを検索してから、その左に頭文字を付けます。時々、繰り返しの要素があり、私の "DO LOOP"がそれを処理します。私の問題は、すべての要素がマスタリストに存在するわけではなく、どの要素がマスタリストにないのかを知る必要があるということです。

マスタリストの要素を見つけることができなかったためにエラーメッセージが表示された場合、エラーハンドラに移動してメッセージの変数にelmentを格納して、後でメッセージに使用できるようにしましたボックス。

他のデータ要素ワークブックでテストしましたが、0または1の要素が見つからない場合は動作しますが、マスターリストに1つ以上のelemetsが見つからない場合は、実行時エラー91 2番目の要素が見つかりません。私のコードには多くの批判があると確信していますので、簡単に私に教えてください。これは初めての配列使用です。

コード:

Option Explicit 

Sub M2_Name_Finder() 

Dim x As String 
Dim y As Integer 
Dim z As Integer 
Dim c As Integer 
Dim m As Integer 
Dim name As String 
Dim rngCopy As Range 
Dim numRows As Long 
Dim rAddress As String 
Dim found(50) As String 
Dim previous As String 
Dim missingFields As String 
Dim message As String 

name = "JJP" 

Windows("Wbook1").Activate 
Range("D3").Select 

Set rngCopy = ActiveCell.CurrentRegion 
numRows = rngCopy.Rows.Count 

For z = 1 To numRows 

    Windows("Wkbook1").Activate 
    Range("D3").Select 
    ActiveCell.Offset(y, 0).Select 
    x = ActiveCell.Value 

    If x = vbNullString Or x = " " Then 
    GoTo Done 
    End If 

    If x = previous Then 
    GoTo Here 
    End If 

    previous = ActiveCell.Value 
    Windows("Wkbook2").Activate 
    Columns("D:D").Select 

    On Error GoTo Missing: 
    Selection.Find(what:=x, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
    :=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase _ 
    :=False, SearchFormat:=False).Activate 

    found(c) = ActiveCell.Address 
    rAddress = ActiveCell.Address 

    If ActiveCell.Value <> Empty Or ActiveCell.Value <> 0 Then 

    Do 
     ActiveCell.Select 
     ActiveCell.Offset(0, -3).Value = name 
     c = c + 1 
     Cells.FindNext(After:=ActiveCell).Activate 
     found(c) = ActiveCell.Address 
    Loop While found(c) <> rAddress 

    End If 

    Here: 
    c = 0 
    y = y + 1 

Next z 

Missing: 
message = message & x 
m = m + 1 
GoTo Here: 

Done: MsgBox "Not found: " & message & vbLf, vbInformation 

End Sub 
+0

これは素晴らしい話ですが、あなたの質問は何ですか? – JohnFx

+0

Ha。そうです、私はもう少し明確になったはずです。私の質問は、エラーをどのように処理するのですか? 1つ以上のデータ要素がない場合は機能しません。マスターリストにないデータ要素をキャプチャする必要があり、プログラムが完了した後にメッセージボックスに表示する必要があります。これは、データ要素が1つしか見つからない場合にこれを行います。なぜ1つ以上のエラーが発生するのかわからない...ヘルプ? – Leon

+1

チップピアソンは、VBAでのエラー処理に関する素晴らしい記事をhttp://www.cpearson.com/Excel/ErrorHandling.htm – Jesse

答えて

4

はい、私はあなたの機能について変更を示唆しているものがたくさんあります。今のところ私はあなたが持っている特定の問題に触れるだけですが。 :-)

問題は、エラー処理を初めて入力するときに、GoToを使用して通常のコードに戻ったときに、エラーハンドラを残していないということです。したがって、2回目にエラーが発生すると、エラーハンドラからユーザーに通知されます。代わりにResumeを使用する必要があります。 Resumeは、エラーを処理して通常のコード実行に戻ったことをシステムに通知します。

Missing: 
    message = message & x 
    m = m + 1 
    Resume Here: 
+0

gotoはすべてのエラーが同じ場所から来たものと仮定していることは言及していません。 – JohnFx

+0

意味があります。どうもありがとう! – Leon

4

エラー処理が含まれていると私は認めます。私はmischab1の答えを批判しません。

しかし、あなたが予想しているエラーをキャッチするためにエラー処理を使用することは認めていません。予期しないことのためにそこにある。次のコードは、はるかに優れています:

Dim Rng As Range 
: 
: 
Set Rng = .... Find .... 
If Rng Is Nothing Then 
    ' The Find has failed to locate the required string 
    ' Include code for this situation 
Else 
    ' The Find has found the required string 
    ' Include code for this situation 
End If 

あなたはまだ予期しないためのあなたのエラールーチンを持っていますが、このコードでそれが失敗した検索の日常的な状況のために使用されていません。

あなたは私たちにあなたに穏やかになるように頼み、あなたの願いを尊敬していますが、私は1つの問題を提起します。

ワークブックとワークシートを切り替えてselectとactivateを使用すると、画面が継続的に再描画されるためコードがスローダウンします。最後に先頭と

Application.ScreenUpdating = True 

Application.ScreenUpdating = False 

:あなたは含めることにより、速度を上げることができます。

ブックを切り替えるとまだフラッシュがありますが、ほとんどの画面操作は行われません。

ただし、SelectおよびActivateも削除する方が良いでしょう。最後の1か2つの質問と回答を見てください。多くの場合(おそらくほとんど)は何も関心がありませんが、質問の多くは初心者からのものです。いくつかの回答には、複数のワークシートやワークブックを扱い、一方から他方へデータをコピーするための優れたコードが含まれています。私はこれらの答えを研究することがあなたの研究時間をすぐに返済すると信じています。

ハッピープログラミング!

+0

入力いただきありがとうございます。私は自分自身を教えて、私が行くように学んでいます。ヒントありがとう! – Leon

+3

あなたは大歓迎です。私たちは一度すべて初心者でした。私はプログラミングは運転のようだと思う。我々は、最初のレッスンの最後に、ギアスティック、ホイール、インジケーター、および3つのペダルを同時に制御できないことを知っています。しかし数ヶ月後、私たちは大騒ぎが何であるかを覚えていない。プログラミングについて学ぶべきことはいつももっとありますが、あなたの快適ゾーンはますます大きくなります。 –

関連する問題