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