2016-11-02 9 views
0

前回の支出レポートと最新の支出レポートを比較するマクロを作成しようとしています。マクロは、前のレポートの行からデータを引き出し、まったく同じデータを含む行を探して、両方の行を(以前のレポートと最新のレポートで)強調表示して一致があることを示します。これにより、現在のレポートと以前のレポートの両方で不一致が強調表示され、不一致が意図されているかどうか(ドキュメントでサポートされるかどうか)を確認します。次のようにRun-Timneエラー '1004':セルの強調表示範囲

私が書いたコードは次のとおりです。

Dim CPEAR As String 
Dim PPEAR As String 
Dim CL As Integer 
Dim PL As Integer 
Dim DL As Integer 

Sub KDPM() 
CPEAR = InputBox("Enter Current Pay Cycle (MM/DD/YYYY)", "Current Pay Cycle", , 50, 50) 
CPEAR = CDate(CPEAR) 
PPEAR = InputBox("Enter Previous Pay Cycle (MM/DD/YYYY)", "Previous Pay Cycle", , 50, 50) 
PPEAR = CDate(PPEAR) 


PL = 2 

Do While Worksheets("PreviousPEAR").Cells(PL, 2).Value = 1 
    If Worksheets("PreviousPEAR").Cells(PL, 6).Value = PPEAR Then 
     CL = 2 
     Do While Worksheets("CurrentPEAR").Cells(CL, 2).Value = 1 
      If Worksheets("CurrentPEAR").Cells(CL, 2).Interior.ColorIndex <> 6 Then 
       If Worksheets("PreviousPEAR").Cells(PL, 3).Value = Worksheets("CurrentPEAR").Cells(CL, 3) Then 
        If Worksheets("PreviousPEAR").Cells(PL, 4).Value = Worksheets("CurrentPEAR").Cells(CL, 4) Then 
         If Worksheets("PreviousPEAR").Cells(PL, 7).Value = Worksheets("CurrentPEAR").Cells(CL, 7) Then 
          If Worksheets("PreviousPEAR").Cells(PL, 12).Value = Worksheets("CurrentPEAR").Cells(CL, 12) Then 
           If Worksheets("PreviousPEAR").Cells(PL, 14).Value = Worksheets("CurrentPEAR").Cells(CL, 14) Then 
            Worksheets("CurrentPEAR").Range(Cells(CL, 1), Cells(CL, 21)).Interior.ColorIndex = 6 
            Worksheets("PreviousPEAR").Range(Cells(PL, 1), Cells(PL, 21)).Interior.ColorIndex = 6 
            Exit Do 
           End If 
          End If 
         End If 
        End If 
       End If 
      End If 

     CL = CL + 1 
     Loop 



    End If 
PL = PL + 1 
Loop 

End Sub 

私のデータの最初の4行を正常に動作するようだが、それはランタイムエラーに当たります。何か案は?

ご協力いただきありがとうございます。

Worksheets("PreviousPEAR").Range(Worksheets("PreviousPEAR").Cells(PL, 1), Worksheets("PreviousPEAR").Cells(PL, 21)).Interior.ColorIndex = 6 

これはあなたのすでにとunwieldlyれます:@BruceWayneはコメントで言及したようあなたが範囲を構築しているとき

+2

どの行がエラーをスローしますか? – user3598756

+2

'Cells()'の**すべての**インスタンスの前にワークシートを追加する必要があります。たとえば、 '.Interior.ColorIndex'行を確認してください。そこにワークシートを追加してください。 – BruceWayne

+0

[矢印コードを平らにする](https://blog.codinghorror.com/flattening-arrow-code/)<〜 –

答えて

1

は、あなたが完全にRangeCells、およびその他のグローバルオブジェクトへのあなたのすべての参照を修飾する必要があります長いコード行と複数のルックアップをWorksheetsコレクションに追加するため、ワークシートへの参照を取得したり、またはWithブロックに配置したりしてください。これは途方もなくパフォーマンスが向上します:

With Worksheets("PreviousPEAR") 
    .Range(.Cells(PL, 1), .Cells(PL, 21)).Interior.ColorIndex = 6 
End With 

を最後に、あなたは短絡に表現の束たい場合は、深くネストIf文の代わりにSelect Case False構造を使用することができます。

Select Case False 
    Case Test1 
    Case Test2 
    Case Test3 
    Case Test4 
    Case Else 
     Debug.Print "All conditions met" 
End Select 

あなたのループになるだろうもっと管理しやすいように見えます...

With Worksheets("PreviousPEAR") 
    Dim current As Worksheet 
    Set current = Worksheets("CurrentPEAR") 
    PL = 2 
    Do While .Cells(PL, 2).Value = 1 
     If .Cells(PL, 6).Value = PPEAR Then 
      CL = 2 
      Do While current.Cells(CL, 2).Value = 1 
       Select Case False 
        Case current.Cells(CL, 2).Interior.ColorIndex <> 6 
        Case .Cells(PL, 3).Value = current.Cells(CL, 3) 
        Case .Cells(PL, 4).Value = current.Cells(CL, 4) 
        Case .Cells(PL, 7).Value = current.Cells(CL, 7) 
        Case .Cells(PL, 12).Value = current.Cells(CL, 12) 
        Case .Cells(PL, 14).Value = current.Cells(CL, 14) 
        Case Else 
         current.Range(current.Cells(CL, 1), current.Cells(CL, 21)).Interior.ColorIndex = 6 
         .Range(.Cells(PL, 1), .Cells(PL, 21)).Interior.ColorIndex = 6 
         Exit Do 
       End Select 
      CL = CL + 1 
      Loop 
     End If 
    PL = PL + 1 
    Loop 
End With 
+0

は、 'Select Case'ブロックの' = 'を' <> 'と読んでください。 – user3598756

+1

@ user3598756 - いいえ。 'False'のケースを選択しているので、' True'の場合のみプロパゲートします。 – Comintern

+0

ああ、そうだよ、そうだよ! – user3598756

関連する問題