2017-01-19 2 views
1

この問題を解決する方法を概念化するのに問題があります。シート1の有効な値の相互参照に基づいて、シート1、列Fの無効な値を除外します。シート1の値をフィルタリングするためのクロスリファレンスとして別のワークシートを使用

Excelでフィルタを使用した経験はありませんが、これは良い機会です。

シート1には複数の試行(列c)があり、各試行にはこれらのスクリーンショットに示すように複数の有効な値があります。

シート1. sheet 1

シート以外に、私は、私は辞書オブジェクトを作成し、シート1の列Cを使用して考えていたと不慣れいフィルタリング機能を使用してから2 sheet 2

、またはシート2の列Aをキーとして使用していますが、シート2のすべてのセルとシート1の列Fを繰り返す大きな長いネストループを使用せずに、プログラムが複数の値をチェックする方法がわかりません。

基本的なタス私が達成したいkのことである: For trial #, sheet 1, if column F =/= (a value in row #, sheet 2), then delete row.

更新:

Sub RemoveNonMatch() 

    Dim rngDel As Range, rw As Range 

    For Each rw In ThisWorkbook.Sheets("full test").Range("B7:Q" & lastrow).Rows 
     If Not IsMatch(rw.Cells(3).Value, rw.Cells(6).Value) Then 
      If Not rngDel Is Nothing Then 
       Set rngDel = Application.Union(rngDel, rw) 
      Else 
       Set rngDel = rw 
      End If 
     End If 
    Next rw 
    'remove any non-matches 
    If Not rngDel Is Nothing Then rngDel.Delete 
End Sub 


Function IsMatch(TrialNum, AreaNum) As Boolean 
    Dim t, a, rv 
    rv = False 
    With ThisWorkbook.Sheets("AOI crossref") 
     'try to find TrialNum in the first column 
     t = Application.Match(TrialNum, .Columns(1), 0) 
     If Not IsError(t) Then 
      'try to find AreaNum in the m'th row 
      a = Application.Match(AreaNum, .Rows(t), 0) 
      If Not IsError(a) Then rv = True 'match! 
     End If 
    End With 
    IsMatch = rv 
End Function 

Here is a sample of the data I am using. 私はライン「それぞれの」にランタイム1004 appicationまたはオブジェクト定義のエラーを返します。このコードは、試してみました

+0

(1)あなたが定義されていない 'ラそれを値する。 (2)ColBからColQまでの範囲を定義しているので、 'rw.Cells(3)'は「試行名」(ColC)ではなく「イベント名」(colD)です。エリア –

+0

ファイルの「固定」バージョンについても同じ問題があります。https://dl.dropboxusercontent.com/u/15526711/full%20test%20TW.xlsm BTWファイルを共有して特定の質問 - この方法では、ファイルにマクロを有効にすることを決定する前に、複数のモジュールを確認する必要はありません。多くの人がコードを持つファイルをダウンロードすることさえありません。 –

+0

@TimWilliamsは、あなたが提案した内容を修正して実行していたので、修正を投稿してうれしく思いましたが、列BをDから削除していました。コードを見ると、範囲やラストローをどう定義したのでしょうか。とにかく、マクロファイルについてのヘッドアップに感謝します。私はAOI crossrefシートにいくつかのコンテンツを追加しましたが、これは良いようです。ありがとうございました。 – shecodes

答えて

1

未テスト:

Sub RemoveNonMatch() 

    Dim rngDel As Range, rw As Range 

    For Each rw In ThisWorkbook.Sheets("Sheet2").Range("A2I100").Rows 'or whatever... 
     If Not IsMatch(rw.Cells(3).Value, rw.Cells(6).Value) Then 
      If Not rngDel Is Nothing Then 
       Set rngDel = Application.Union(rngDel, rw) 
      Else 
       Set rngDel = rw 
      End If 
     End If 
    Next rw 
    'remove any non-matches 
    If Not rngDel Is Nothing Then rngDel.Delete 
End Sub 


Function IsMatch(TrialNum, AreaNum) As Boolean 
    Dim t, a, rv 
    rv = False 
    With ThisWorkbook.Sheets("Sheet2") 
     'try to find TrialNum in the first column 
     t = Application.Match(TrialNum, .Columns(1), 0) 
     If Not IsError(t) Then 
      'try to find AreaNum in the m'th row 
      a = Application.Match(AreaNum, .Rows(t), 0) 
      If Not IsError(a) Then rv = True 'match! 
     End If 
    End With 
    IsMatch = rv 
End Function 
+0

ありがとう、ティム。私はこのコードを使って、サブのシート名を '(" full test ")Rangeに変更しようとしました(B7:T"&lastrow) 'と関数のシートを' 'AOI crossref ''にしました。 'For Each rw'行にランタイムエラー1004を与えています。 – shecodes

+0

その行の最後に.Rowsを追加するのを忘れました(編集を参照)。その修正で試してみてください。それで問題が解決しない場合は、いくつかのサンプルデータを共有できれば、私はテスト/デバッグします。 –

+0

私は試したコードで質問を編集し、サンプルデータのリンクを提供しました。 .rowsのことはうまくいかなかった。 – shecodes

関連する問題