У меня есть код VBA, который увеличивает даты в активной ячейке до следующего доступного столбца.

Dim lngLastCol As Long, lngRow As Long
lngRow = ActiveCell.Row
lngLastCol = Cells(lngRow, Columns.Count).End(xlToLeft).Column

If IsDate(Cells(lngRow, lngLastCol)) Then
    With Cells(lngRow, lngLastCol + 1)
        .Value = DateAdd("M", 1, CDate(Cells(lngRow, lngLastCol)))
        .NumberFormat = Cells(lngRow, lngLastCol).NumberFormat
    End With
End If

Вместо увеличения месяца (и года) в активной строке, на которой я сейчас нажимаю, я хочу обновить месяцы в определенных фиксированных строках, то есть в строках 3, 17 и 42 (все в одном столбце).

3
RVH 1 Ноя 2018 в 14:02

2 ответа

Лучший ответ

Другой подход, цикл от одного столбца к последней строке (в данном случае 250). Во второй формуле If вы указываете, в какие строки следует добавлять новые столбцы. Итак, если это утверждение истинно Cells(i, 2).Row = 3 (текущая строка, которую мы зацикливаем, равна 3), добавьте новый столбец.

Поэтому заменяем активную строку петлей:

lngRow = ActiveCell.Row -> lngRow = Cells(i, 2).Row

Цикл For i будет с 3 по 250 ряд.

Sub ColumnsAdd()

Dim lngLastCol As Long, lngRow As Long, i As Long

For i = 3 To 250 'Loop from row 3 to 250
    If Cells(i, 2).Row = 3 Or Cells(i, 2).Row = 17 Or Cells(i, 2).Row = 42 Then 'If any of the rows is 3, 17 or 42 then go and add new column
        lngRow = Cells(i, 2).Row
        lngLastCol = Cells(lngRow, Columns.Count).End(xlToLeft).Column
            If IsDate(Cells(lngRow, lngLastCol)) Then
            With Cells(lngRow, lngLastCol + 1)
                .Value = DateAdd("M", 1, CDate(Cells(lngRow, lngLastCol)))
                .NumberFormat = Cells(lngRow, lngLastCol).NumberFormat
            End With
            End If
    End If
Next i
End Sub
2
Wizhi 1 Ноя 2018 в 12:34

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

Option Explicit

Sub test()

    Dim lngLastCol As Long, lngRow As Long

    lngRow = ActiveCell.Row
    lngLastCol = Cells(lngRow, Columns.Count).End(xlToLeft).Column

    If IsDate(Cells(lngRow, lngLastCol)) Then
        With Union(Cells(3, lngLastCol + 1), Cells(17, lngLastCol + 1), Cells(42, lngLastCol + 1))
            .Value = DateAdd("M", 1, CDate(Cells(lngRow, lngLastCol)))
            .NumberFormat = Cells(lngRow, lngLastCol).NumberFormat
        End With
    End If

End Sub
2
Error 1004 1 Ноя 2018 в 12:18