VBA для цикла с переменной - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь запустить цикл for, используя последнюю строку в качестве количества строк, но по какой-то причине он не работает. И то же самое, если я поставлю число вместо LR, оно прекрасно работает.

Dim LR As Long
LR = Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To LR
    If (Cells(i, 8).Value <> "") Then
        Cells(i, 13).Value = (Cells(i, 12).Value - Cells(i, 11).Value)
    End If
Next i

1 Ответ

1 голос
/ 07 ноября 2019

Код работает нормально, но не так, как вы предполагали. Это наиболее вероятно, потому что вы использовали неявную ссылку на лист;

LR = Cells(Rows.Count, 1).End(xlUp).Row

В строке выше будет взята последняя использованная строка из текущего активного листа, поэтому указанную выше строку также можно прочитать как LR = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

То же самое произойдет с такими вещами, как Cells(i, 8).Value и Cells(i, 13).Value = (Cells(i, 12).Value - Cells(i, 11).Value), которые будут читаться как ActiveSheet.Cells(i,8).Value и т. Д.

Явная ссылка будет включать лист, на который вы хотите сослаться. Так, например: LR = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row

Чтобы предотвратить многократное повторение ссылки на одну и ту же таблицу, я бы рекомендовал использовать оператор With, чтобы сделать ваши ссылки явными:

Dim LR As Long i as long

With Sheet1 'Change according to your sheets CodeName
    LR = .Cells(.Rows.Count, 1).End(xlUp).Row
    For i = 2 To LR
        If .Cells(i, 8).Value <> "" Then
            .Cells(i, 13).Value = .Cells(i, 12).Value - .Cells(i, 11).Value
        End If
    Next i
End with

Еслиэто все равно не запустит ваш цикл, вам придется проверить ваш первый столбец, чтобы увидеть, есть ли реальные данные за строкой 2.

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