VBA: Как автоматически включать границы ячеек без ошибок (время выполнения 1004) Стиль линии - PullRequest
0 голосов
/ 29 мая 2019

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

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

Я записал макрос добавления границ (и изменил диапазон на переменный - RowToPasteTo), и все работало хорошо.

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

Run-Time error '1004':

Unable to set the LineStyle Property of the Borders class

Как упоминалось в сообщении об ошибке, похоже, что это ошибка .LineStyle, но я использую тот же стиль, что и мне дал их регистратор.

Как мне заставить это работать снова, чтобы завершить всеГраницы?

РЕДАКТИРОВАТЬ: Забыли добавить код - извините!

Sub Borders()

Dim RowToPasteTo As Long

With Sheets(4)

 RowToPasteTo = .Cells(.Rows.Count, "B").End(xlUp).Row + 1
 Range("B" & RowToPasteTo & ":" & "Z" & RowToPasteTo).Select
  With Selection.Borders
    .LineStyle = xlContinuous
    .ThemeColor = 3
    .TintAndShade = -9.99786370433668E-02
    .Weight = xlThin
    End With
End With

End Sub

РЕДАКТИРОВАТЬ 2: Этот фрагмент кода для вставки границ, когда каждая новая строка данных перемещается на этот лист(Метки сетки отключены, поскольку границы должны отображаться только в строках с данными.

Я перепробовал все предложенные поправки и до сих пор получаю ошибки при выполнении только вышеприведенного кода.

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

(Минимизированный) код, который позже будет вызывать этот фрагмент, если:

Sub ToTank()
Dim RowToPasteTo As Long
        RowToPasteTo = .Cells(.Rows.Count, "B").End(xlUp).Row + 1

        Sheets(4).Unprotect
        .Range("A" & RowToPasteTo & ":" & "Z" & RowToPasteTo).Locked = False
Call Borders()

End Sub

Ответы [ 2 ]

1 голос
/ 29 мая 2019

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

Option Explicit
Sub ToTank()

    Dim RowToPasteTo As Long

    With ThisWorkbook.Sheets(4) 'If the code runs for the same workbook the code is in
        RowToPasteTo = .Cells(.Rows.Count, "B").End(xlUp).Row + 1
        .Unprotect
        Borders .Range("B" & RowToPasteTo & ":" & "Z" & RowToPasteTo) 'call the procedure inserting the borders passing the range you need
    End With

End Sub
Sub Borders(MyRange As Range)

    With MyRange.Borders
        .LineStyle = xlContinuous
        .ThemeColor = 3
        .TintAndShade = -9.99786370433668E-02
        .Weight = xlThin
    End With

End Sub

Таким образом, вы всегда можете вызвать сабвуфер Borders, предоставив желаемый диапазон без каких-либо изменений. Вы также можете сделать переменные LineStyle и все необходимые вам свойства, передав больше аргументов.

1 голос
/ 29 мая 2019

Как сказано выше, .Borders требует как минимум 1 аргумент для работы.Один из способов добиться того, что вы пытаетесь сделать, это:

Sub Borders()

Dim RowToPasteTo As Long

With Sheets(4)

    RowToPasteTo = .Cells(.Rows.Count, "B").End(xlUp).Row + 1

    For X = 1 To 4
        With .Range("B" & RowToPasteTo & ":" & "Z" & RowToPasteTo).Borders(X)
            .LineStyle = xlContinuous
            .ColorIndex = 3
            .Weight = xlThin
        End With
    Next X
End With

End Sub

Исправление в соответствии с комментарием @ Damian, хотя вышеприведенное также идеально подходит для использования:

Sub Borders()

Dim RowToPasteTo As Long

With Sheets("Sheet1")

    RowToPasteTo = .Cells(.Rows.Count, "B").End(xlUp).Row + 1
    With .Range("B" & RowToPasteTo & ":" & "Z" & RowToPasteTo).Borders
        .LineStyle = xlContinuous
        .ColorIndex = 3
        .Weight = xlThin
    End With
End With

End Sub

Подробнее см. Границы .

...