Ссылка на объект Range, установленный Range.Row (), генерирует ошибку 1004 «Ошибка приложения или объекта» - PullRequest
1 голос
/ 14 июня 2019

Я создал объект диапазона, установив его из строки () другого объекта диапазона.Когда я ссылаюсь на вновь созданный диапазон по строке и столбцу, он генерирует ошибку 1004.

Я могу ссылаться на исходный диапазон по строке и столбцу.Я включил проверки, чтобы убедиться, что объект rng указывает на тот же диапазон, что и объект набора данных.Когда я проверяю объект rng, Value2 показывает одну строку данных.

Ниже приведен минимальный код, который я использую, который генерирует ошибку.

Private Sub TestRangeObject()

Dim i As Long
Dim dataset As Range
Dim rng As Range

    Set dataset = sRoster.Range("B18:E37")

    For i = 1 To dataset.Rows.Count

        Set rng = dataset.Rows(i)

        Debug.Print "Rng is Range Obj: " & (TypeOf rng Is Range)
        Debug.Print "Same worksheet: " & (rng.Parent.CodeName = dataset.Parent.CodeName)
        Debug.Print "Same address: " & (dataset.Rows(i).Address = rng.Address)

        'can reference dataset object by row and column
        Debug.Print "First column (dataset): " & dataset(i, 1).Address

        'error when referencing rng object by row and column
        Debug.Print "First column (rng): " & rng(1, 1).Address

    Next i

End Sub

Ответы [ 2 ]

3 голосов
/ 14 июня 2019

Как дополнительная деталь: есть разница между использованием Rows(somerow) и Range(somerange).

Это можно проверить на простом примере:

Sub Test()
    Dim rng As Range
    Set rng = Sheet1.Range("1:1")
    Debug.Print rng(1, 1).Address ' returns $A$1

    Dim rng2 As Range
    Set rng2 = Sheet1.Rows(1)
    Debug.Print rng2(1).Address ' succeeds, returns $1:$1
    Debug.Print rng2(1, 1).Address ' fails
End Sub

Решение - использовать Rows(myRow).Cells - уже было предложено.

EDIT:

В попытке отразить и обобщить некоторые из комментариев, Row, будь то Range.Rows(somerow) или Sheet.Rows(somerow), ссылается на единицу как строку , а не как отдельные клетки.

Например, Range("A1:E10").Rows будет означать 10 строк , а не 50 ячеек . Аналогично, Sheet1.Rows(1) относится к 1 строке , а не 16384 ячейкам . Строка является «наименьшей единицей рассмотрения» из-за отсутствия лучшего термина. Одна строка не может иметь индекс столбца - это всего лишь одна строка, а не коллекция всех ячеек, составляющих эту строку, каждая из которых имеет свой собственный индекс столбца.

Так что вам нужно будет использовать Cells, если вы хотите индексировать ячейки в определенной строке.

2 голосов
/ 14 июня 2019

Вы не можете использовать:

rng(1, 1)

, если rng - это диапазон из одной строки:

Sub jksfhsa()
    Dim sRoster As Worksheet, dataset As Range, rng As Range
    Set sRoster = Sheets("Sheet1")
    Set dataset = sRoster.Range("B18:E37")
    Set rng = dataset.Rows(1)

    MsgBox dataset.Address
    MsgBox dataset(1, 1).Address

    MsgBox rng.Address
    MsgBox rng(1, 1).Address

    End Sub

Последний MsgBox завершится ошибкой.

Однако:

Sub jksfhsa()
    Dim sRoster As Worksheet, dataset As Range, rng As Range
    Set sRoster = Sheets("Sheet1")
    Set dataset = sRoster.Range("B18:E37")
    Set rng = dataset.Rows(1).Cells

    MsgBox dataset.Address
    MsgBox dataset(1, 1).Address

    MsgBox rng.Address
    MsgBox rng(1, 1).Address

    End Sub

будет работать просто отлично.Поэтому в вашем коде замените:

Set rng = dataset.Rows(i)

на:

Set rng = dataset.Rows(i).Cells
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...