我正在尝试使用VBA在由变量引用确定的表中选择一个连续范围。我遇到了一个问题,可以使用联合功能选择2个点,但不能使用范围功能来创建连续范围。
对于上下文,这是我使用的代码示例:
For i = 1 to 5
Set colrng = Table2.HeaderRowRange
Set rowrng = Range(Range("B3"), Range("B" & CStr(2 + Table2.DataBodyRange.Rows.Count)))
col = WorksheetFunction.Match(Table1.DataBodyRange(i, 1), colrng, 0)
row = WorksheetFunction.Match(Table1.DataBodyRange(i, 4), rowrng, 0)
Union(Table2.DataBodyRange(row, col), Table2.DataBodyRange(row + 2, col)) = "New Value"
Next
现在的代码可以正常工作,但是会导致2个包含“新值”的不连续单元格,而我希望两个端点之间(包括两个端点)的每个单元格都包含“新值”。我过去在较不高级的代码上使用的方法利用了Range函数,但这在这里不起作用并产生错误:
运行时错误“ 1004”:
应用定义或对象定义错误
编辑:在最初的示例中,我认为我不够清楚,因此下面是我正在使用的完整代码。
Private Sub test()
Dim colrng As Range
Dim rowrng As Range
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim r As Integer
Dim c As Integer
Dim t As Double
Dim Schedule As ListObject
Dim Info As ListObject
Set Schedule = Sheet1.ListObjects("Table1")
Set Info = Sheet2.ListObjects("Table2")
Schedule.DataBodyRange.ClearContents
For i = 1 To Info.DataBodyRange.Rows.Count
t = Info.DataBodyRange(i, 5) - 1
Set colrng = Schedule.HeaderRowRange
Set rowrng = Sheet1.Range(Sheet1.Range("B3"), Sheet1.Range("B" & CStr(2 + Schedule.DataBodyRange.Rows.Count)))
If IsEmpty(Info.DataBodyRange(i, 4)) = False And IsEmpty(Info.DataBodyRange(i, 1)) = False Then
c = Application.Match(Info.DataBodyRange(i, 1), colrng, 0)
r = Application.Match(Info.DataBodyRange(i, 4), rowrng, 0)
Range(Schedule.DataBodyRange(r, c), Schedule.DataBodyRange(r + t, c)) = Info.DataBodyRange(i, 2) & " - " & Info.DataBodyRange(i, 3)
End If
Next
End Sub
此表的信息在哪里:
具有所需输出的Schedule表是:
截至目前,在结束代码之前的最后一行中,使用 Union 函数代替 Range 函数,我能够生成所有所需的输出除了单元格D8为空之外。
答案 0 :(得分:2)
鉴于您的评论,我认为您的问题与如何定义范围有关,以下更改可能支持使用Range()
而不是并集:
For i = 1 to 5
Set colrng = Table2.HeaderRowRange
Set rowrng = Range(Range("B3"), Range("B" & CStr(2 + Table2.DataBodyRange.Rows.Count)))
'EDIT: You start with cell B3, so adding col+1 and row+2
col = Application.Match(Table1.DataBodyRange(i, 1), colrng, 0) + 1 'CHANGE
row = Application.Match(Table1.DataBodyRange(i, 4), rowrng, 0) + 2 'CHANGE
'range().value = "new value" and will utilize cells()
Range(Cells(row, col+1), Cells(row + 2, col+1)).Value = "New Value" 'CHANGE
Next
请记住要完全限定您的参考文献。在rowrng
中,您只有range()
引用,但是该引用在哪张纸上?某些信息可能会有所影响,具体取决于工作簿的布局和使用情况。
此外,将WorksheetFunction
更改为Application
,从而可以进行不同的错误处理。这可能对您没有好处。