2017-09-05 18 views
0

少しの背景で、シート「データ」はマクロが配置されるはずのテーブルで構成されます。この表には、最初の列(列P)を実行している日付と、ヘッダーとしていくつかの名前があります。私の現在のマクロは、ループスルーしないように指定されたものを除いて、すべてのシートをループし、各シートでW7:W200の範囲の各セルをループします。次に、セルの右側の10個の値と、シート「データ」の列Pの日付とを照合します(その行をHdrRowとして設定します)。同時に、シート "Data"の列ヘッダーにその値を一致させるために、ループしているシートでA9の値を探します(そしてその列をHdrColとして設定します)。行と列(交差するセル)を見つけた後、マクロはループしているセルの値をその交差するセルにペーストします。Excel VBAは2つの列(ループなし)の基準に基づいて行番号を見つけます。

私はこの次の部分で問題があります。行を検索するための別の基準を追加したいと考えています。私はマクロが列Pに一致する日付を見つけるだけでなく、それがループしているシートのA1の値と一致する列Qの値も探します。その行をHdrRowとして設定します。可能であれば、このためにループを使用しないようにしてください。

Sub Values() 
    Dim HdrCol As Range 
    Dim Site As String 
    Dim SearchRange As Range 
    Dim HdrRow As Range 
    Dim FinDate As Date 
    Dim ws As Worksheet 
    Dim rng As Range 




    ' Fill in Actual Value 
    Sheets("Data").Range("W2:W100000").ClearContents 

    For Each ws In ActiveWorkbook.Worksheets 
     'Dont Copy Data from these worksheets 
     If ws.Name <> "Portfolio" And ws.Name <> "Master" And ws.Name <> "Template" _ 
      And ws.Name <> "Coal" And ws.Name <> "E&P" And ws.Name <> "Gen" _ 
      And ws.Name <> "Hydro" And ws.Name <> "LNG" And ws.Name <> "Midstream" _ 
      And ws.Name <> "Solar" And ws.Name <> "Transmission" _ 
      And ws.Name <> "Wind" And ws.Name <> "Data" Then 

      For Each cell In ws.Range("W7:W200") 

       If cell <> "   " Then 

        Site = ws.Range("A9").Value 
        FinDate = Right(cell, 10) 

        'Find column ref 
        Set HdrCol = Sheets("Data").Range("P1:W1").find(Site, lookat:=xlPart) 
        If Not HdrCol Is Nothing Then 
        End If 

        'Find row ref 
        Set SearchRange = Sheets("Data").Range("P1", Range("P100000").End(xlUp)) 
        Set HdrRow = SearchRange.find(FinDate, LookIn:=xlValues, lookat:=xlWhole) 


        Application.Goto Reference:=Cells(HdrRow.Row, HdrCol.Column) 

        If IsEmpty(Sheets("Data").Cells(HdrRow.Row, HdrCol.Column)) Then 
         cell.Copy Sheets("Data").Cells(HdrRow.Row, HdrCol.Column) 
        Else 
         cell.Copy Sheets("Data").Cells(HdrRow.Row, HdrCol.Column).End(xlDown).Offset(1, 0) 
        End If 
       End If 
      Next 
     End If 
    Next 
End Sub 

答えて

0

これを行うための非ループバージョンのための私の最初の考え(ループがはるかに簡単である)、(試合を使用することであろう)、あなたは複数の値を持っている場合はA = Qまたは同じ日付が使用される場合にかかわらず、問題が発生する可能性があります。それは読んで編集する方が簡単ですので、

Dim i,j as Integer 

i=Application.Match(RefCell1,LookUp1,0).Row 
j=Application.Match(RefCell2,LookUp2,0).Row 

If i=j Then 
    HdrRow=i 
    Else 
End If 

は、私は、特にIfステートメントの条件に一致シナリオを作っていないです。

このアプローチを使用すると、複数の同じ値を持つ問題が発生します。


別のアプローチがあればネストされた文で使用することです。最終的には

Dim i as integer 

i=Application.Match(RefCell1,LookUp1,0).Row 

If Application.IfError(i,0)>0 Then 
    If Cells(i,"Q").Value=Cells(RefCell1Row,"A").Value 
     HdrRow=i 
     Else 
    End If 
    Else 
End If 

を使用すると、1行あたりを評価することができますので、私はまだ上に構築思われる、ループをお勧めします2番目のアプローチ。


編集:リクエストごとにループを含める。

Dim i, j as Integer 

For i = 7 to 200 'Used the range you mentioned in your post, which I think is wrong for this example... these are row numbers for Data sheet 
    For j = 7 to 200 'Row numbers for reference sheets 
     If Sheet(ARRAY).Cells(j,"Q").Value=Sheets("Data").Cells(i,"A").Value Then 
      If Cells(j,"P").Value=Cells(i,"B").Value 'Not sure what column the date is in Data sheet 
       HdrRow=j 
       Else 
      End If 
      Else 
     End If 
    Next j 
Next i 

あなたのデータシート、およびあなたは配列に参照している各シートの両方の細胞を説明するために、二つのループしてしまいます。てんかんは本物だから、画面の更新を必ずオフにしてください!

+0

HdrRowが単なる数値であるこの方法を使用すると、HdrRow.Rowへの参照をすべてCells()内のHdrRowにすることができます。 – Cyril

+0

あなたは正しいです、私は最終的にループが最良の方法だと思います。あなたのソリューションにループを含めることができるでしょうか? – Edp

+0

@Edp Updated;うまくいけば、これはあなたがなる必要がある場所にあなたを取得します! – Cyril

関連する問題