联合函数在一定范围内有效,但范围函数不会

时间:2019-10-30 17:58:14

标签: excel vba

我正在尝试使用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

此表的信息在哪里:

enter image description here

具有所需输出的Schedule表是:

enter image description here

截至目前,在结束代码之前的最后一行中,使用 Union 函数代替 Range 函数,我能够生成所有所需的输出除了单元格D8为空之外。

1 个答案:

答案 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,从而可以进行不同的错误处理。这可能对您没有好处。