excel vba:下标超出范围

vba代码是:

Sub D() Dim a As String Dim wb As Workbook Dim file As Variant Dim arr1() As Variant Dim arr2() As Variant Dim arr3() As Variant Dim arr() As Variant Dim arr4() As Variant Dim arr5() As Variant Dim arr6() As Variant Dim t As Integer ActiveWorkbook.Activate ActiveSheet.Activate arr4 = Range("J2:J256") arr5 = Range("K2:K256") arr6 = Range("L2:L256") ActiveSheet.Activate For Row = 1 To UBound(arr4, 1) If arr4(Row, 10) = "IS" And arr5(Row, 11) = "IS" And arr6(Row, 12) = "IS" Then Cells(Row + 1, 13) = "UPDATE AB SET S=" & Cells(Row + 1, 6) & "WHERE C=" & Cells(Row + 1, 3) & ";" End If Next Row End Sub 

我得到错误作为下标超出范围在arr4(行,10)=当debugging。可以帮助纠正错误,使代码可能能够正常工作。

我认为问题在于你对数组的理解。 您正在使用数组的绝对单元格引用(这是相对的)。 数组的第一个索引(即(1,1))引用了范围中的第一个单元格,所以对于Range("K2:K256") arr(1, 1)将引用单元格“K2”的值, arr(10, 1)将引用单元格“K11”等的值

正如LMM9790指出的,如果你想保持你的代码结构,那么它可以简单地写成:

  If arr4(Row, 1) = "IS" And arr5(Row, 1) = "IS" And arr6(Row, 1) = "IS" Then Cells(Row + 1, 13) = "UPDATE AB SET S=" & Cells(Row + 1, 6) & "WHERE C=" & Cells(Row + 1, 3) & ";" End If 

但是,我不得不问,为什么你需要这么多的数组,每列一个? 由于arr4,5和6都具有相同的行维度,因此可以只包含一个包含所有列的数组。 此外,您可以为整个数据集使用一个数组,修改适用值,然后将数组重新写入Worksheet

其他地方的代码有点奇怪。 例如,您是否有理由激活活动工作表和书本? 你也有几个未使用的variables – 你打算以后使用这些variables吗?

你的整个代码可以简化为:

 Sub D() Dim ws as Worksheet Dim r As Integer Dim v As Variant Set ws = ActiveWorkbook.Worksheets("Sheet1") 'name as appropriate v = ws.Range("C2:M256").Value2 For r = 1 To UBound(v, 1) If r < Ubound(v, 1) then If v(r, 8) = "IS" And v(r, 9) = "IS" And v(r, 10) = "IS" Then v(r + 1, 11) = "UPDATE AB SET S=" & v(r + 1, 4) & _ " WHERE C=" & v(r + 1, 1) & ";" End If End If Next '... ws.Range(("C2:M256").Value = v End Sub 

关于超出范围的错误,因为arr4,arr5和arr6只包含一列,所以你不能访问例如它们的第10列(在你的代码中由arr4(Row, 10) 。使用以下?

 Sub D() Dim a As String Dim wb As Workbook Dim file As Variant Dim Row As Integer Dim arr1() As Variant Dim arr2() As Variant Dim arr3() As Variant Dim arr() As Variant Dim arr4() As Variant Dim arr5() As Variant Dim arr6() As Variant Dim t As Integer ActiveWorkbook.Activate ActiveSheet.Activate arr4 = Range("J2:J256") arr5 = Range("K2:K256") arr6 = Range("L2:L256") For Row = 1 To UBound(arr4, 1) If arr4(Row, 1) = "IS" And arr5(Row, 1) = "IS" And arr6(Row, 1) = "IS" Then Cells(Row + 1, 13) = "UPDATE AB SET S=" & Cells(Row + 1, 6) & "WHERE C=" & Cells(Row + 1, 3) & ";" End If Next Row End Sub