Функция объединения работает в диапазоне, но функция диапазона не - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь выбрать непрерывный диапазон внутри таблицы, определяемой ссылками на переменные с использованием 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

И таблица расписаний с желаемым выходом:

enter image description here

На данный момент, используя функцию Union вместо функции Range в последнем ряду перед кодом закрытия, я могугенерировать все желаемые выходные данные, кроме того, что ячейка D8 пуста.

1 Ответ

2 голосов
/ 30 октября 2019

Учитывая ваш комментарий, я думаю, что ваша проблема связана с тем, как определить диапазон, и приведенные ниже изменения могут поддерживать использование 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, что допускает различную обработку ошибок. Это может или не может быть полезным для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...