2017-06-11 5 views
0

countifの基準が満たされたら、セルのアドレスまたは行を取得することについて助けを求めます。私はちょうど何かが簡単でないように感じる。ここで Count Countの後にセルのアドレス/行を返す

は、私がこれまで持っているものの塊です:コードで

Wb2.Activate 
    Wb2.Sheets.Add(After:=Wb2.Sheets(Wb2.Sheets.Count)).Name = "Report" 
    With Wb2.Sheets("From") 
     Set myRange = .Range("F2:G" & lastRow) 
    End With 

    With Wb2.Sheets("Weekly_Stat") 
     Set forComp = Wb2.Sheets("Weekly_Stat").Range("D2:E" & lastRow2) 
    End With 

    Sheets("From").Activate 

    For Each item In myRange.Rows 
     With item 
      .Select 
      myCount = item.Row 
      myBool = False 
      foundIt = Application.CountIfs(forComp.Columns(1), .Cells(1).Value, forComp.Columns(2), .Cells(2).Value) 
      If foundIt Then myBool = True 
       If myBool = True Then 
        myStr = forComp.Row 
        Wb2.Sheets("Report").Cells(myCount, 10).Value = "Found" 
        MsgBox myStr 
       Else 
        Wb2.Sheets("Report").Cells(myCount, 10).Value = "Not Found" 
       End If 
     End With 
    Next item 

、私はforCompで見つかった項目の行を取得しようとしていますが、私は無残失敗しています。

"Weekly_Stat"にある一致の行番号を取得する方法が不思議です。

現在、「From」シートのデータが「Weekly_Stat」に含まれているかどうかしか判断できません。新しい "レポート"シートに "Found"と "Not Found"の列を配置しました。私がやってみたかったことはある

  • チェックデータがWeekly_Statで発見された場合、レポート内の場所の結果(実行される)
  • データがWeekly_Statに存在していることを見つけた後、私は/アドレスを取得する必要があります行
  • 私は行/アドレスを使用して、同じ行の次の列から別のデータをWeekly_Statから取得します。

私のジレンマについて調べてみましたが、解決策を見つけることができませんでした。私はおそらく検索に間違ったキーワードを使用している可能性がありますので、これはすでに尋ねられている場合は事前に私の謝罪。どんな助けでも大歓迎です。どうもありがとう。

+0

:VBAを使用してプロセスを自動化するために、我々はこの(最初から最後の行にすべてのコードを置き換え、唯一lastRowが正しく計算されたことを想定)のようにそれを行うことができます2列一致の場合の番号。これを行う簡単な方法があります。 – Jeeped

答えて

0

あなたがしようとしていることを正確に見るのは難しいですが、1枚のシートの列に各値を入れ、その値が別のシートの列にあるかどうかを確認するようです。これが正しければ、私はあなたの方法論が最善の方法であるとは確信していません。

通常、1つの列を繰り返してから、各行をテストするために秒を繰り返します。これにより、見つかった行のインデックスが取得されます。はい、パラメータとしてRangeを受け取るExcel関数は内部的な繰り返しを実行しますが、特にVBAで開始する場合は、そのように検索を制御(およびデバッグ)するのは困難です。

セルの値を配列に読み込んでループする方がはるかに高速です(私の見解ではもっと簡単です)。あなたがそのルートをとることに興味があるなら、あなたのコードは以下のスケルトンコードのように見えるかもしれません。注:あなたのワークブック、シート、ニーズに合わせて、すべての範囲定義と修飾子を調整する必要があります。

特にデータが一意である場合は、タスクを達成するためにはさらに高速で複雑な方法がありますが、これは単純な配列ループを提供しています。

Dim fromVals As Variant, weekVals As Variant 
Dim reportVals() As Variant 
Dim r1 As Long, r2 As Long 
Dim found As Boolean 

'Read ranges into arrays for the two sheets. 
'Note: define your ranges to suit. 
With ThisWorkbook.Worksheets("From") 
    fromVals = .Range(.Cells(2, "F"), _ 
       .Cells(.Rows.Count, "F").End(xlUp)) _ 
       .Resize(, 2).Value2 
End With 

With ThisWorkbook.Worksheets("Weekly_Stat") 
    weekVals = .Range(.Cells(2, "D"), _ 
       .Cells(.Rows.Count, "D").End(xlUp)) _ 
       .Resize(, 2).Value2 
End With 

'Dimension the output array. 
'Note: example uses num of rows in "From" sheet and 2 columns. 
ReDim reportVals(1 To UBound(fromVals, 1), 1 To 2) 

'Loop through "From array2 to acquire each value. 
For r1 = 1 To UBound(fromVals, 1) 
    found = False 'sets the found flag each iteration 
    'Loop through "Week" array to look for match with "From" value. 
    For r2 = 1 To UBound(weekVals, 1) 
     If weekVals(r2, 1) = fromVals(r1, 1) Then 
      'We've found a match 
      reportVals(r1, 1) = "Found" 'writes found in same row index as "From" array 
      reportVals(r1, 2) = weekVals(r2, 2) 'writes value from "G" column of "week" array 
      found = True 
      Exit For 
     End If 
    Next 
    If Not found Then reportVals(r1, 1) = "Not found" 
Next 

'Writes report array to sheet. 
ThisWorkbook.Worksheets("Report").Cells(2, 10) _ 
    .Resize(UBound(reportVals, 1), UBound(reportVals, 2)) _ 
    .Value = reportVals 
+0

本当にありがとうございます。あなたは、Excelの機能を使って検索を操作するのは難しいということは間違いありません。私は検索のための可変配列を使用するあなたの考えが好きです。これは本当に役に立ちます。どうもありがとう! – Pinked

0

私たちが式を使用して、一致する行を検索した場合、我々は報告書の行2で、この配列数式を記述します。

=MATCH(1,(Weekly_Stat!D:D=From!F2)*(Weekly_Stat!E:E=From!G2),0) ' Ctrl+Shift+Enter 

そして、我々は、列を下に埋めます。あなたが行を返すようにしたいように見えます

With Wb2.Sheets.Add(After:=Wb2.Sheets(Wb2.Sheets.count)) 
    .name = "Report" 
    .Range("J2").FormulaArray = _ 
     "=MATCH(1,(Weekly_Stat!D:D=From!F2)*(Weekly_Stat!E:E=From!G2),0)" 
    .Range("J2:J" & lastrow).FillDown 
End With 
+0

アドバイスをありがとうございます。コードはきちんとしていて簡単です。 .FillDownについて知ってうれしく思います。本当に助けていただきありがとうございます! – Pinked

関連する問題