贸易对帐宏

时间:2016-06-14 18:20:12

标签: arrays excel vba excel-vba

我正在尝试编写一个宏来调和两个交易报告,方法是在Sheet1上列出的交易中对Sheet2中缺少的交易进行黄色填充,反之亦然。我是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

1 个答案:

答案 0 :(得分:0)

因此您的代码存在很多问题。其中一些是样式,一些是语法。

首先,每个地方都有:

Application.Match(...)

它需要在Application和Match之间有WorksheetFunction,所以它显示为:

Application.WorksheetFunction.Match(...)

其次尝试避免在循环中标注变量。没有必要,如果你想在每个循环后重置你的变量,那么最后添加类似var = 0的东西。

将DateValue和DateArray移出For循环。在LastRow(2)之后的一次Dim DateArray,因为那是你唯一的一次,LastRow(2)永远不会改变。

TickerArray,tickerValue,QuantityArray和quantityValue也是如此。

第三个避免带有数字的变量,即LastRow2。这是您需要使用更具描述性的变量名称或数组时。而不是LastRow2使用

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

第四个为什么使用

isZero = isZero*0

而不是

isZero = 0

第五,不要那么多使用select()方法。与仅直接引用您想要的工作表相比,它的速度慢而且笨重

即。而不是这样做

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

改为执行此操作

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

第六,你不需要三个独立的x和i变量,你可以在最高For循环之外对它们进行调暗,并在If-Else语句中将它们重新用于较低的For循环。