2017-03-28 7 views
0

私は検索しましたが、私の複製を見つける場所の隣の列に指定した値を印刷する方法がわかりません。私が以前から持っていたのは、異なる範囲を最初に指定した後、シートXのシートYに重複があるかどうかを調べるコードです。シートLeはこの週情報であり、シートは最後の週情報です。別のワークシートで重複をチェックしてから値をプリントします

IF指定された範囲に重複があります。私の送付状に印刷したいと思います。

私が探している条件は、シート(Be)のシート(B)の列Bにある同じ値を見つけることができる場合、列Fのテキストが変更されているかどうかを確認することです。そうであれば、それはシート(Le)=配達の列Aに印刷される。そうでなければ届かない。

次に、列Mの日付が同じかどうかをチェックします。そうでなければ、シート(Le)上の列AにReplannedを印刷する。

短く シート上のセルのIF値、シート(Le)=シート内の値(B)、シート(Be) シート上の列Aの値Le = "納品済み"または "

をカラムMのセルの値が、シートが列Aに、値(BE)列Mのセルの値、シート(LE)<>場合、シート(LE)は=

"再計画" 場合

これは私のデータは、この

Col B Col F Col M 
PZ2408 X30 2017-02-13 
PZ2345 X30 2017-02-23 
PZ2463 X30 2017-02-25 
PZ2513 X13 2017-02-05 
PZ2533 X13 2017-02-10 
PZ2561 X60 2017-02-17 
のように見える(BE)私のデータシートについて シート(ル)

Col B Col F Col M 
PZ2408 X13 2017-02-13 
PZ2345 X30 2017-02-23 
PZ2463 X45 2017-02-25 
PZ2513 X13 2017-02-10 
PZ2533 X70 2017-02-05 
PZ2561 X60 2017-02-20 

、どのように見えるかです

コードが動作し、私の脳はしないん、私はそれは例えば表示したいと思い

シート(ル)

col A   Col B Col F Col M 
    Delivered  PZ2408 X13 2017-02-13 
Not Delivered  PZ2345 X30 2017-02-23 
    Delivered  PZ2463 X45 2017-02-25 
    replanned  PZ2513 X13 2017-02-10 
    Delivered  PZ2533 X70 2017-02-05 
    replanned  PZ2561 X60 2017-02-20 

Bascilly私、配信配信および再計画はない文をそのコースをした後、うまくいかない。

私の一日を節約できますか?ここ

Sub checkASMT() 
Dim rng1 As Range 
Dim rng2 As Range 
Dim lastRowSource As Long 
Dim lastRowTarget As Long 
Dim row As Long 
Dim ASMT As String 

'Looping trough Range 
With ThisWorkbook.Worksheets("Le") 

    lastRowTarget = .Range("B" & .Rows.Count).End(xlUp).row 
    For i = 29 To lastRowTarget 
     ASMT = .Range("b" & i).value 
     'Define range and see if we can find duplicates 
     With ThisWorkbook.Worksheets("Be") 
      lastRowSource = .Range("B" & .Rows.Count).End(xlUp).row 
      Set rng1 = .Range("B3", "B" & lastRowSource) 

      row = findValueInRangeReturnRow(rng1, ASMT) 


      'Check FAX 
      If compareAEO(i, row, "FAX") = True Then 
       'Debug.Print compareASMT(i, row, "FAX") 
       Worksheets("Le").Cells(i, ASMT).value = "Not Delivered" 

       Else 

       .Worksheets("Le").Cells(i, ASMT).value = "delivered" 

       'Check if dax are correct 
       If compareAEO(i, row, "DAX") = False Then 
       .Worksheets("Le").ASMT.Offset(0, 1).value = "Replan" 


      End If 



     End With 
    Next i 

End With 


End Sub 

は私の最初の機能

Function findValueInRangeReturnRow(rng As Range, value As Variant) As Long 

     Set c = rng.Find(value, LookIn:=xlValues) 

     If Not c Is Nothing Then 

      findValueInRangeReturnRow = c.row 

     End If 

End Function 

重複が指定した範囲内で発見されたかどうかをチェックする私の第二の機能です。

Function compareAEO(rad1 As Variant, rad2 As Variant, typeCOMPARE As String) As Boolean 

Dim col1 As String 
Dim col2 As String 

    Select Case typeCOMPARE 
    Case "FAX" 
     col1 = "F" 
     col2 = "F" 

    Case "DAX" 
     col1 = "M" 
     col2 = "M" 

    End Select 

    If ThisWorkbook.Worksheets("Le").Range(col1 & rad1).value = ThisWorkbook.Worksheets("Be").Range(col2 & rad2).value Then 

    compareAEO = True 
    Else 

    compareAEO = False 
End If 



End Function 
+0

あなたのデータ「構造」と希望の出力を示すのに役立ちます – user3598756

+0

あなたのコメントに関して私の投稿を編集しました!ありがとう! – DL1

+0

「良い」マクロを実行した後で、データの最終状態を追加することができます。 – user3598756

答えて

1

渡って動作させるために、あなたのニーズに合わせて、この式をこの数式を配置します。ループの外側で一番上に一度だけ取得する必要があります。あなたが設定した範囲と同じです。私はそれらをループの前の一番上に置くことがわかります。

ASMTを使用しているものは本当にわかりません。範囲(B "& I)の代わりにコーディングの一部として範囲として使用しようとしていたようです。 Leの "B"列の文字列を使ってBeの "B"列と比較しました。

私のために働く。あなたのニーズに合わせて変更する必要があります。あなたはすべての機能を必要とせず、達成したことはすべてこのサブルーチン内にあります。

Sub checkASMT() 
Dim rng1 As Range 
Dim rng2 As Range 
Dim lastRowLE As Long 
Dim lastRowBe As Long 
Dim row As Long 
Dim ASMT As String 
Dim LEws As Worksheet 
Dim tmpRng As Range 

    Set LEws = Worksheets("Le") 
    lastRowLE = Sheets("Le").Cells(ActiveSheet.Rows.Count, "B").End(xlUp).row 
    lastRowBe = Sheets("Be").Cells(ActiveSheet.Rows.Count, "B").End(xlUp).row 
    Set rng1 = Sheets("Be").Range("B3", "B" & lastRowBe) 


    For i = 29 To lastRowLE 
     Set tmpRng = Sheets("Le").Range("b" & i) 
     ASMT = tmpRng.Value 

     Set c = rng1.Find(ASMT, LookIn:=xlValues) 
     If Not c Is Nothing Then 
       row = c.row 
       If ThisWorkbook.Worksheets("Le").Range("F" & i).Value = ThisWorkbook.Worksheets("Be").Range("F" & row).Value Then 
'     Worksheets("Le").Cells(i, ASMT).Value = "Not Delivered" 
'     Did you intend to use ASMT as the column number? 
'     I'm going to hard code that as column 27 for my purposes. You can change it if you need to 
        LEws.Cells(i, 27).Value = "Not Delivered" ' column 27 is "AA" 
       Else 
        LEws.Cells(i, 27).Value = "Delivered" 
       End If 
       If ThisWorkbook.Worksheets("Le").Range("M" & i).Value = ThisWorkbook.Worksheets("Be").Range("M" & row).Value Then 
'     .Worksheets("Le").ASMT.Offset(0, 1).Value = "Replan" 
'      again I don't understand the reference to ASMT. That is a string value - unless it is a numeric value in the string 
'      I'm going to assume that you intended for "Replan" to go into column C on row i 
       Else 
        LEws.Range("C" & i).Value = "Replan" 
       End If 
     End If 
    Next i 



End Sub 
+0

ねえ! @ジョンムギンズUはVBA神です!大変感謝します。あなたは本当に良いプログラマになるためにVBAに取り組む方法をお勧めしますか? – DL1

+0

それを嫌にしてください。また、動作するルーチンが得られたら、特別なモジュールに保存して、将来のプロジェクトに挿入して手軽に利用することができます。最後に使用された行を見つけることは簡単なコードですが、30年のプログラミングの後も、毎回それを行う方法を調べる必要があります。それを私の特別なモジュールに入れておくことで、それを見つけるために遠くに行く必要はありません。 –

0

これを試してください。 BからGに1枚のシートにデータを置く(Le then Be)。列H

=IF(VLOOKUP(E2,B$2:D$7,2,FALSE)=F2,IF(G2<D2,"replanned","Not Delivered"),"delivered") 

微調整で、それはあなたが各ループで両方のページの最後の行を取得したシート

+0

ありがとうございます! @ user2648008私は1時間でオフィスにいるとすぐにチェックします:)私はとてもこの1つにこだわっています....うまくいけば、これはトリックをするでしょう。私の学習目的のために、annonはVBAでITを行う方法もありますか? – DL1

+0

これは正しい方向に私を得た。私はヘルパー列で作った2つの異なる数式で終わったし、それらの列から列にコピーするためのVBAコードを持っていた。 – DL1

関連する問題