2016-06-14 5 views
-1

私は、Sheet1に記載されているトレードに黄色の塗りつぶしを付けることによって2つのトレードレポートを調整し、その逆も同様にするマクロを作成しようとしています。私はVBAの初心者であり、私は一緒に勉強しています。基本的には、私が取ってきたアプローチは、Sheet1の各行を繰り返して、比較対象の各主要フィールド(TradeDate、Ticker、およびQuantity)の配列を作成することでした。これらの配列には、Sheet2にあるSheet1のフィールドと一致するすべての行番号が含まれています。配列が作成されたら、配列を比較して同じ行番号が含まれているかどうかを確認したいと思います。そうであれば、プログラムは次の取引に移行する必要があります。そうでなければ、その行はSheet1に黄色の塗りつぶしでマークする必要があります。私はタイプミスマッチのランタイムエラーを取得し続けています。トレード・リコンシリエーション・マクロ

Sub Reconciliation() 

Sheets("Sheet1").Select 

Dim LastRow As Long 
Dim LastRow2 As Long 
Dim rowCounter As Long 
Dim isZero As Long 

LastRow = ActiveSheet.UsedRange.Rows.Count 
With Sheets("Sheet2").Select 
    LastRow2 = ActiveSheet.UsedRange.Rows.Count 
End With 
isZero = 1 

'Loops through every row on Sheet 1 
For rowCounter = 2 To LastRow 
    Dim DateValue As String 
    DateValue = ActiveSheet.Cells(8, rowCounter) 

    'Search Sheet2 for TradeDate and add matched rows to DateArray 
    Dim DateArray() As Long 
    ReDim DateArray(0 To LastRow2) 


    Sheets("Sheet2").Select 
    If Application.WorksheetFunction.CountIf(Range("E2:E" & LastRow2), DateValue) > 0 Then 
     isZero = isZero * 0 

    Else 
     DateArray(0) = Application.Match(DateValue, Range("E2:E" & LastRow2), 0) 

     Dim i As Integer 
     Dim x As Integer 

     x = 1 
     For i = 1 To LastRow2 
     If Application.Match(DateValue, Range("E" & DateArray(x - 1) & ":E" & LastRow2), 0) = "IsError" Then 
      Exit For 
     Else 
      DateArray(x) = Application.Match(DateValue, Range("E" & DateArray(x - 1) & ":E" & LastRow2), 0) 
      x = x + 1 
     End If 
     Next i 

    End If 

    Dim tickerValue As String 

    tickerValue = ActiveSheet.Cells(4, rowCounter) 

    Dim TickerArray() As Long 
    ReDim TickerArray(0 To LastRow2) 

    Sheets("Sheet2").Select 
    If Application.Match(tickerValue, Range("D2:D" & LastRow2), 0) = "IsError" Then 
     isZero = isZero * 0 
    Else 

     TickerArray(0) = Application.Match(tickerValue, Range("D2:D" & LastRow2), 0) 

     Dim i1 As Integer 
     Dim x1 As Integer 

     x = 2 
     For i1 = 1 To LastRow2 
      If Application.Match(tickerValue, Range("D" & TickerArray(x1 - 1) & ":D" & LastRow2), 0) = "IsError" Then 
       Exit For 
      Else 
       ReDim Preserve TickerArray(0 To x1) 
       TickerArray(x1) = Application.Match(tickerValue, Range("D" & TickerArray(x1 - 1) & ":D" & LastRow2), 0) 

       x1 = x1 + 1 
      End If 
     Next i1 
    End If 

    Dim quantityValue As Long 

    quantityValue = ActiveSheet.Cells(3, rowCounter) 

    Dim QuantityArray() As Long 
    ReDim QuantityArray(0 To LastRow2) 

    Sheets("Sheet2").Select 
    If Application.Match(quantityValue, Range("E2:E" & LastRow2), 0) = "N/A" Then 
     isZero = isZero * 0 
    Else 

     QuantityArray(0) = Application.Match(quantityValue, Range("E2:E" & LastRow2), 0) 

     Dim i2 As Integer 
     Dim x2 As Integer 

     x2 = 2 
     For i2 = 1 To LastRow2 
      If Application.Match(quantityValue, Range("E" & QuantityArray(x2 - 1) & ":E" & LastRow2), 0) = "IsError" Then 
       Exit For 
      Else 
       ReDim Preserve QuantityArray(0 To x2) 
       QuantityArray(x2) = Application.Match(quantityValue, Range("E" & QuantityArray(x2 - 1) & ":E" & LastRow2), 0) 

       x2 = x2 + 1 
      End If 
     Next i2 

    End If 







Next rowCounter 
End Sub 
+0

[条件付き書式設定](https://support.office.com/en-au/article/Use-a-formula-to-apply-conditional-formatting-fed60dfa-1d3f-4e13-9ecb-f1951ff89d7f)ネイティブのワークシートの式は、あなたの物語よりも優れたソリューションのようです。 2つの取引のリストがある場合は、各リストのレコードが同じ位置(つまり* rows *)になることを期待していますか? – Jeeped

+4

タイプミスマッチはどのラインですか?デバッグモードを使用してコードにブレークポイントを挿入しようとしましたか? –

+0

@DevinTrowbridge申し訳ありませんが、私はここにコードに行番号をコピーしませんでした。このタイプの不一致は次の行にあります:DateArray(0)= Application.Match(DateValue、Range( "E2:E"&LastRow2)、0) –

答えて

0

コードにはかなりの問題があります。スタイルの一部、構文の一部があります。

まずあなたが持っているすべての場所:それは読み込むよう

Application.Match(...) 

これは、アプリケーションとマッチの間でWorksheetFunctionを持っている必要があります:

Application.WorksheetFunction.Match(...) 

第二には、内部の寸法変数を避けるようにしてくださいあなたのループ。その必要はありません。各ループの後に変数をリセットしたい場合は、最後にvar = 0のようなものを追加してください。

DateValueとDateArrayをForループから移動します。 Dim DateArrayはLastRow(2)の後で一度だけ実行され、LastRow(2)は決して変更されません。

TickerArray、tickerValue、QuantityArray、およびquantityValueも同じです。


3番目の変数には、LastRow2という数値が入りません。これは、よりわかりやすい変数名または配列のどちらかを使用する必要がある場合です。代わりにLastRow2があなたの代わりに

isZero = 0 

isZero = isZero*0 

を使用している理由

Dim LastRow(1 to 2) as Long 
LastRow(1) = Sheet1.UsedRange.Rows.count 
LastRow(2) = Sheet2.UsedRange.Rows.count 

第四を使用する第五のため、select()メソッドを使用していません多く。ただ

LastRow(1) = Sheet1.UsedRange.Rows.count 
LastRow(2) = Sheet2.UsedRange.Rows.count 

に代わり、あなたが別の3を必要としない第六に、これを行う直接

をしたいシートを参照すなわちの代わりに、この

LastRow = ActiveSheet.UsedRange.Rows.count 
With Sheets("Sheet2").Select 
    LastRow2 = ActiveSheet.UsedRange.Rows.count 
End With 

を行うに比べて遅いと不格好xおよびi変数を使用している場合は、一番高いForループの外側でそれらを1回ディミングし、If-Elseステートメントの下位のForループに対してそれらを再利用することができます。

+0

私はあなたの訂正がすごく大きいので、助けて。どうもありがとうございます!! –

+0

@ A.Sarma問題ありません。スタイルガイドを読み、プログラミングに関するオンラインクラスを試してみてください。 codeacademy –

+0

私はあなたが提案した変更を加えましたが、今では変数 'LastRow(1)= Sheet1.UsedRange.Rows.Count'に何か不足していますか? –