Arrays 贸易调节宏观

Arrays 贸易调节宏观,arrays,vba,excel,Arrays,Vba,Excel,我正试图编写一个宏,通过在表1中列出的、表2中缺少的交易上加上黄色填充,来协调两个交易报告,反之亦然。我是VBA的初学者,一直在学习。基本上,我所采用的方法是迭代Sheet1上的每一行,为要比较的每个主要字段(TradeDate、Ticker和Quantity)创建一个数组。这些数组包含与在Sheet2中找到的Sheet1中的字段的每个匹配的行号。一旦创建了数组,我想比较这些数组,并检查每个数组中是否包含相同的行号。如果是这样的话,该计划应该继续进行下一个交易。否则,该行应在活页1上用黄色填充物

我正试图编写一个宏,通过在表1中列出的、表2中缺少的交易上加上黄色填充,来协调两个交易报告,反之亦然。我是VBA的初学者,一直在学习。基本上,我所采用的方法是迭代Sheet1上的每一行,为要比较的每个主要字段(TradeDate、Ticker和Quantity)创建一个数组。这些数组包含与在Sheet2中找到的Sheet1中的字段的每个匹配的行号。一旦创建了数组,我想比较这些数组,并检查每个数组中是否包含相同的行号。如果是这样的话,该计划应该继续进行下一个交易。否则,该行应在活页1上用黄色填充物标记。我不断收到类型不匹配的运行时错误,有没有输入原因

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

所以你的代码有很多问题。有些是风格,有些是语法

首先,您拥有的每个地方:

Application.Match(...)
它需要在应用程序和Match之间具有WorksheetFunction,以便读取:

Application.WorksheetFunction.Match(...)

第二,尽量避免在循环中标注变量。没有必要这样做,如果您想在每个循环之后重置变量,那么在末尾添加var=0之类的内容

将DateValue和DateArray移出For循环。在LastRow(2)之后调整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()方法。与直接引用所需的图纸相比,它既慢又笨重

i、 而不是这样做

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变量,您可以在If-Else语句中的最高For循环之外将它们调暗一次,然后将它们重新用于较低For循环

从您的叙述来看,使用本地工作表公式似乎是更好的解决方案。如果您有两个交易列表,您是否希望每个列表在相同的位置(即行)有相同的记录?您在哪一行得到类型不匹配?您是否尝试过使用调试模式并在代码中插入断点?@deventrowbridge抱歉,我没有将行号复制到代码中。类型不匹配出现在这一行:DateArray(0)=Application.Match(DateValue,Range(“E2:E”&LastRow2),0)我几乎不知道我在做什么,所以您的更正是一个巨大的帮助。非常感谢你@萨玛:没问题。您应该尝试阅读样式指南并尝试在线编程课程,例如CodeAcademy我做了您建议的更改,但现在我在'LastRow(1)=Sheet1.UsedRange.Rows.Count'上遇到一个变量定义的错误,我是否遗漏了什么?