VBA, как изменить переменную диапазона, используя что-то вроде смещения - PullRequest
0 голосов
/ 26 сентября 2019

Я думаю, что следующий код должен давать диагональ чисел, и мне интересно, почему этот код не работает должным образом:

Sub RangeExample()

Dim a As Range

Set a = Sheets(1).Range("a1")

a.Value = 0

Dim i As Integer


    For i = 1 To 100

        a = a.Offset(1, 1)
        a.Value = i

    Next i

End Sub

Я понимаю, что существует много способов созданиядиагональ чисел, я не спрашиваю, как это сделать.
Я спрашиваю, как бы я изменил свою переменную диапазона a, чтобы она стала другим диапазоном, и сделал бы это итеративно.Мне кажется, что, поскольку a.offset(1,1) возвращает объект диапазона, один на один и один вниз, я должен быть в состоянии переназначить a как этот новый диапазон, присвоить значение и двигаться дальше.

Ответы [ 3 ]

2 голосов
/ 26 сентября 2019

Ваша текущая проблема в том, что вам не хватает Set:

Set a = a.Offset(1, 1)  

Обратите внимание, что вы также можете просто использовать i, а не повторно Set:

a.Offset(i, i).Value = i

Другим вариантом является использование Cells, например

Sheets(1).Cells(i + 1, i + 1).Value = i

Существует более одного способа снятия шкуры с кошки - выберите то, что легче и интуитивнее для будущего вас.

0 голосов
/ 26 сентября 2019

проблема уже решена @ BigBen

, но вы можете избежать переустановки диапазона на каждой итерации с помощью With...End With block

Option Explicit

Sub RangeExample()
    Dim i As Long

    With Sheets(1).Range("a1") ' reference topleftmost cell
        .Value = 0 ' write referenced cell value
        For i = 1 To 100
            .Offset(i, i).Value = i 'write referenced cell current offset value
        Next
    End With
End Sub
0 голосов
/ 26 сентября 2019

Спасибо за ответ, я не знал, set требовалось в этом случае.Конкретный ответ, который я искал, теперь я нашел по адресу:

Что на самом деле делает ключевое слово Set в VBA?

В частности, следующий ответ от LeppyR64.Msgstr "Set используется для установки ссылок на объекты, а не для присвоения значения."

Я не знал, что одно только равенство влияло только на значение объекта диапазона a.Чтобы реально изменить диапазон, на который ссылалась a, мне нужно было set, потому что a должен ссылаться на новый объект диапазона.

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