错误9:超出范围Excel VBA下标

您好,我正在尝试通过表中的一些值来定义范围,但我无法做到这一点。 此外,我不知道是什么原因造成这个问题。

我的代码

Dim row As Range For Each row In [table2].Rows For Each c In Worksheets(row.Columns(row.ListObject.ListColumns("Sheet").Index).Value) .Range((row.Columns(row.ListObject.ListColumns("RangeBegin").Index).Value) + ":" + (row.Columns(row.ListObject.ListColumns("RangeEnd").Index).Value)) If c.Value = "O" Then Sheets("master").Cells(2, 3).Copy Sheets(row.Columns(row.ListObject.ListColumns("Sheet").Index).Value).Select c.Select ActiveSheet.Paste 

在这里输入图像说明

 For Each c In Worksheets(1).ListObjects(1).ListColumns("Sheet").DataBodyRange 'some code here... Next c 

Worksheets(1)只是一个例子。 您可以用工作表的名称replace1,如Worksheets("Sheet1")

ListObjects(1)只是一个例子。 您可以将1replace为表的名称,例如ListObject("Table1") 。 如果工作表只有一个表格,则可以将其保留为1。


这里是如何select表格行的范围

 Sub test() Dim r As ListRow Dim lo As ListObject Set lo = Worksheets(1).ListObjects(1) For Each r In lo.ListRows Debug.Print r.Range(1, lo.ListColumns("Sheet").Index).Value Next r End Sub 

我重构了你的代码。 我认为这是非常接近你想要的。 注意我是如何从链式对象中提取variables的。 这样做是为了使代码更易读,更容易debugging。
如果“设置targetRange”打破了代码,我可以将鼠标hover在SheetName,RangeBegin和RangeEnd上find它们各自的值。

 SheetName = .ListColumns("Sheet").DataBodyRange(i) RangeBegin = .ListColumns("RangeBegin").DataBodyRange(i) RangeEnd = .ListColumns("RangeEnd").DataBodyRange(i) Set targetRange = getTargetRange(SheetName, RangeBegin, RangeEnd) 
 Public Sub ProcessWorkSheets() Dim tbl As ListObject Dim SheetName As String, RangeBegin As String, RangeEnd As String Dim targetRange As Range Set tbl = Sheet1.ListObjects("Table1") With tbl For i = 1 To tbl.DataBodyRange.Rows.Count SheetName = .ListColumns("Sheet").DataBodyRange(i) RangeBegin = .ListColumns("RangeBegin").DataBodyRange(i) RangeEnd = .ListColumns("RangeEnd").DataBodyRange(i) Set targetRange = getTargetRange(SheetName, RangeBegin, RangeEnd) If Not targetRange Is Nothing Then With Worksheets(SheetName) For Each c In targetRange If c = "O" Then c = Sheets("master").Cells(2, 3) Next End If End With Next End With End Sub Public Function getTargetRange(SheetName As String, RangeBegin As String, RangeEnd As String) As Range On Error Resume Next Set getTargetRange = Worksheets(SheetName).Range(RangeBegin & ":" & RangeEnd) On Error GoTo 0 End Function Public Function hasWorkSheet(SheetName As String) On Error Resume Next Call Worksheets(SheetName).Name If Err.Number <> 0 Then hasWorkSheet = False Else hasWorkSheet = True End If On Error GoTo 0 End Function 

好的,经过很多次的尝试,我没有太多的改变我的代码。 我正在尝试读取每个单元格并粘贴其他单元格的内容,如果条件满足

 Application.CopyObjectsWithCells = True Dim row As Range For Each row In [table2].Rows For Each c In Worksheets(row.Columns(row.ListObject.ListColumns("Sheet").Index).Value).Range(row.Value2(1, 2)) If c.Value = "O" Then Sheets("master").Cells(2, 3).Copy Sheets(row.Columns(row.ListObject.ListColumns("Sheet").Index).Value).Select c.Select ActiveSheet.Paste ElseIf c.Value = "G" Then Sheets("master").Cells(3, 3).Copy Sheets(row.Columns(row.ListObject.ListColumns("Sheet").Index).Value).Select c.Select ActiveSheet.Paste ElseIf c.Value = "R" Then Sheets("master").Cells(4, 3).Copy Sheets(row.Columns(row.ListObject.ListColumns("Sheet").Index).Value).Select c.Select ActiveSheet.Paste Else c.Value = c.Value End If Next c Next