1

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

Private Sub FixRowHeight_Click()
Dim rng As Range
Dim eRow As Excel.Range
Dim padding As Integer
padding = 10
With Worksheets("Issues")
    Set rng = .Range("A2").End(xlDown)
    rng.Select
    .Rows.AutoFit
    For Each eRow In rng.Rows
        eRow.Select
        eRow.VerticalAlignment = xlCenter
        eRow.RowHeight = eRow.RowHeight + padding
    Next eRow
End With
End Sub

Учитывая, что каждый раз, когда я запускаю его, весь диапазон автоматически соответствует высоте строки, кажется, что проблема заключается только в цикле for-each. Все, что заключено в этот цикл, прекрасно работает для последней строки в диапазоне, но это все. Ни на одну другую строку не влияет ни одно из двух фактических изменений в цикле (выравнивание по вертикали и отступ).

Весь файл .xlsm представляет собой простую книгу с одним листом (остальные 2 листа по умолчанию удалены). Содержимое - это просто таблица в стиле по умолчанию, начиная с A1 с заголовками столбцов и включенной сортировкой, без функций, но с добавлением текущей даты.

У меня есть некоторый опыт программирования, но нет ни одного в VBA (или любой другой VB). Любая помощь будет принята с благодарностью!

1 ответ1

1

Проблема не в цикле, это в вашем rng -

Когда вы set rng = range("A2").end(xlDown) вы устанавливаете rng в последнюю ячейку, которая заполнена вниз от A2. То есть вы выбираете только одну ячейку.

Пытаться -

Set rng = Range(Cells(2, 1), Cells(2, 1).End(xlDown))


Это работает нормально -

Sub FixRowHeight_Click()
Dim rng As Range
Dim padding As Integer
padding = 10
With ActiveSheet
    Set rng = .Range(Cells(2, 1), Cells(2, 1).End(xlDown))
    rng.Rows.AutoFit
    For Each Row In rng
        Row.VerticalAlignment = xlCenter
        Row.RowHeight = Row.RowHeight + padding
    Next
End With
End Sub

Но так же это -

Sub FixRowHeight_Click()
    Range(Cells(2, 1), Cells(2, 1).End(xlDown)).Rows.AutoFit
    For Each Row In Range(Cells(2, 1), Cells(2, 1).End(xlDown))
        Row.VerticalAlignment = xlCenter
        Row.RowHeight = Row.RowHeight + 10
    Next
End Sub

Кроме того, просто примечание, но вам не нужно .select в вашем коде для erow если остальная часть цикла не была selection.verticalalignment и т.д.

Также лучше избегать .select в целом и довольно жестко кодировать диапазоны, но это ни здесь, ни там.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .