このマクロでは、特定の日付(前日)に影響を受けた当社のすべての顧客口座を、当社の銀行口座明細書から報告されたすべての支払いと比較しています。私はVLookupを使用して、銀行報告書の列にある各顧客の金額を比較し、逆に銀行の記録を顧客口座に比較します。値を要約するために配列オブジェクトをどのように比較しますか?
VLookup - ErrorHandler:とErrorHandler2 :)でエラーが報告されたものを取り、その値を保存するように動的配列を変更します(GPMissing1()をCustomer Name、GPMissing2()をCustomer Amounts最終的には)
Sub GPWireDifference()
Dim GPMissing1() As String, GPMissing2() As Double, GPCount As Integer
GPMissingString = ""
Cells.EntireColumn.AutoFit
Range("B:E").NumberFormat = "$#,##0.00"
Range("D2").Activate
On Error GoTo ErrorHandler:
Do Until ActiveCell.Offset(0, -3).Value = ""
ActiveCell.Value = Application.WorksheetFunction. _
IfError(Application.WorksheetFunction. _
VLookup(ActiveCell.Offset(0, -2), Range("C:C"), 1, False), 0)
ActiveCell.Offset(1, 0).Activate
If ActiveCell.Row = 300 Then
Exit Sub
End If
Loop
ErrorHandler:
If Not ActiveCell.Offset(0, -3).Value = "" Then
GoTo ErrorHandler2:
End If
ErrorHandler2:
If Not ActiveCell.Offset(0, -3).Value = "" Then
ReDim Preserve GPMissing1(GPCount)
ReDim Preserve GPMissing2(GPCount)
GPMissing1(GPCount) = ActiveCell.Offset(0, -3).Value
GPMissing2(GPCount) = ActiveCell.Offset(0, -2).Value
GPCount = GPCount + 1
Resume Next
End If
For x = 0 To GPCount - 1
If x > 0 Then
GPMissingString = GPMissingString & vbCr & GPMissing1(x) & " - " & GPMissing2(x)
Else
GPMissingString = GPMissing1(x) & " - " & GPMissing2(x)
End If
Next
Cells.EntireColumn.AutoFit
If GPCount > 0 Then MsgBox GPMissingString
End Sub
、それが影響を受けているが、銀行取引明細書には反映されていないすべてのアカウントのユーザーに警告するメッセージボックスを表示します。
例メッセージ:
In Great Plains But Not In Bank Statement:
Rod Powers - $196.40 'Array Object 0 - Array Object 0
Rod Powers - $394.40 'Array Object 1 - Array Object 1
Tod Dindino - $1,190.40 'Array Object 2 - Array Object 2
Rod Powers - $2,752.80 'Array Object 3 - Array Object 3
Tod Dindino - $12,518.75 'Array Object 4 - Array Object 4
これらは、2つの別個の配列で、まだ各アレイ位置がどのように表示する各メッセージを要約することができるであろう、他の配列にそのそれぞれの値と一致するので:
In Great Plains But Not In Bank Statement:
Rod Powers - $3,343.60
Tod Dindino - $13,709.15
(私たちは顧客の注文に銀行の電線を受け取りましたが、顧客が複数の注文を反映するために1本の電線を送ってくることがあります)この合計によって、1行ごとの値ではなく1つの顧客名の合計できます/
SOLUTION:ここではシートがどのように見えるかの例です)明らかに欠損値として返す彼の電線対彼の3回の個々の注文に対して、彼の単線にをロッド・パワーズの合計を比較しますFIXED:
私はマットの助けを借りて、動的配列の使用を排除し、それを辞書に切り替えました。これにより、すべての繰り返し名の合計を作成し、さらに銀行報告書の任意の値と比較することができました。
Sub GPWireDifference()
Dim values As Dictionary
Set values = New Dictionary
Dim lookup As String
Dim amount As Currency
lastRow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
GPMissingString = ""
Cells.EntireColumn.AutoFit
Range("B:E").NumberFormat = "$#,##0.00"
Range("D2").Activate
On Error GoTo ErrorHandler:
Do Until ActiveCell.Offset(0, -3).Value = ""
ActiveCell.Value = Application.WorksheetFunction. _
IfError(Application.WorksheetFunction. _
VLookup(ActiveCell.Offset(0, -2), Range("C:C"), 1, False), 0)
ActiveCell.Offset(1, 0).Activate
Loop
ErrorHandler:
If Not ActiveCell.Offset(0, -3).Value = "" Then
GoTo ErrorHandler2:
End If
ErrorHandler2:
If Not ActiveCell.Offset(0, -3).Value = "" Then
lookup = ActiveCell.Offset(0, -3).Value
amount = ActiveCell.Offset(0, -2).Value
If values.Exists(lookup) Then
values(lookup) = values(lookup) + amount
Else
values.Add lookup, amount
End If
Resume Next
End If
For x = 0 To values.Count - 1
If x > 0 Then
GPMissingString = GPMissingString & vbCr & values.Keys(x) & " - " & _
Format(values.Items(x), "$#,##0.00")values.Items(x)
Else
GPMissingString = values.Keys(x) & " - " & _
Format(values.Items(x), "$#,##0.00")values.Items(x)
End If
Next
Cells.EntireColumn.AutoFit
If values.Count > 0 Then MsgBox GPMissingString
End Sub
ありがとうございました!私は何年にもわたってどれくらいのスピードで私を助けてくれたのですか?
一致が見つかった場合に値を追加するには、 'Collections'と' .Exists'を参照してください。 –
@ScottHoltzman私は約4日前に研究を始めたばかりのVBAに慣れていませんが、以前のJavaの経験からsytax構造を理解しています。それで、コレクションは本質的にダイナミックアレイを確立していますか?あるいは、これらを記述するデータシートがありますか? (私は仕事中ですので、いくつかのフォーラムは残念ながらブロックされています) – Munkeeface
[this](https://msdn.microsoft.com/en-us/library/f26wd2e5(v = vs.100).aspx)が役に立ったかどうかを確認する –