我正在尝试编写一个宏来调和两个交易报告,方法是在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
答案 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循环。