При попытке применить свойства диапазона к диапазону или ячейкам я получаю сообщение об ошибке - PullRequest
0 голосов
/ 17 января 2020

В следующем коде VBA у меня проблема со ссылками на диапазоны.

Dim counter_x As Long
Dim counter_y As Long
Dim OriginalEntries As Range

    ActiveSheet.Unprotect ("")
    Set OriginalEntries = Range("AZ1") 'Dummy range so its not empty for first union as that seems to cause issues
    With ActiveSheet
        For counter_y = 3 To 27 Step 3
            For counter_x = 1 To 41 Step 5
                If .Cells(counter_y, counter_x) <> "" Then
                    Set OriginalEntries = Union(OriginalEntries, .Cells(counter_y, counter_x))
                    'CRASHES HERE WHEN ORIGINALFILES EMPTY
                End If
            Next counter_x
        Next counter_y
    End With

    With OriginalEntries
        .Locked = True 'CRASHES HERE
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = -4.99893185216834E-02
        .Color = -52429
    End With

    ActiveSheet.Protect ("")

Моя первоначальная проблема заключалась в том, что я не смог UNION OriginalEntries. Я временно решил эту проблему, инициализировав OriginalEntries фиктивным диапазоном.

После объединения всех диапазонов я пытаюсь применить некоторые свойства диапазона безуспешно. I

То, что я пробовал:

Изменение

.cells(counter_x, counter_y)

на

.range(cells(counter_x, counter_y))
.range(.cells(counter_x, counter_y))

Обе эти вещи вызывают взрыв на линии UNION

Также пробовал

.cells(counter_x, counter_y).locked = TRUE

и тот взорвался.

После With OriginalEntries я использовал следующие строки и, похоже, работает:

OriginalEntries.select
Selection.Lock

Но я продолжаю читать, избегая использования select, так что я делаю не так?

Ответы [ 2 ]

1 голос
/ 17 января 2020

Вам не нужен фиктивный диапазон, просто чтобы убедиться, что вы не Union на Nothing. Простая функция может гарантировать, что:

Private Function Combine(ByVal range1 As Range, ByVal range2 As Range) As Range
    If Not range1 Is Nothing And Not range2 Is Nothing Then
        Set Combine = Union(range1, range2)
    Else If range1 Is Nothing Then
        Set Combine = range2
    Else If range2 Is Nothing Then
        Set Combine = range1
    End If
End Function

И теперь вы можете изменить это:

Set OriginalEntries = Union(OriginalEntries, .Cells(counter_y, counter_x))

На что:

Set OriginalEntries = Combine(OriginalEntries, .Cells(counter_y, counter_x))

Что касается .Select part ...

OriginalEntries.Select
Selection.Lock

Вам не нужно Select диапазон, потому что в конце дня вы хотите вызвать Range.Lock ... которое должно быть .Locked, и это свойство чтения / записи, поэтому вы хотите присвоить его, например, так:

OriginalEntries.Locked = True
0 голосов
/ 17 января 2020

Итак, спасибо Мэтью Гиндону за то, что он уделил мне много времени и рассмотрел различные вопросы. Оказывается, виновником являются объединенные ячейки.

Я возился с головоломкой судоку и искал способ легко разблокировать / заблокировать исходную головоломку, вернуться к исходной, стереть головоломку как способ практики мои навыки программирования на VBA.

Код должен был принять это:

Unlocked Puzz

И превратить его в это:

Locked Puzz

Поскольку A3 фактически является частью объединенного A3: E3, код испортил все, когда я попытался применить изменения свойства ячейки только к части объединенной ячейки. Он продолжал выдавать ошибку 1004.

Я перешел к ошибке, изучив MergeArea и не понимая ее достаточно для работы, убедившись, что диапазон A3: E3 был частью выбора. не только А3. Обновленный код выглядит следующим образом:

Sub Lock_Puzz()

Dim counter_x As Long
Dim counter_y As Long
Dim OriginalEntries As Range

    Sheet1.Unprotect ("")

    With Sheet1
        For counter_y = 3 To 27 Step 3
            For counter_x = 1 To 41 Step 5
                If Sheet1.Cells(counter_y, counter_x) <> "" Then
                    Set OriginalEntries = Combine(OriginalEntries, .Range(.Cells(counter_y, counter_x), .Cells(counter_y, counter_x + 4)))
                End If
            Next counter_x
        Next counter_y
    End With

    With OriginalEntries
        .Locked = True
        .Font.Color = -52429
        .Interior.ThemeColor = xlThemeColorDark1
        .Interior.TintAndShade = -4.99893185216834E-02
    End With

    Sheet1.Protect ("")

End Sub

Функция Combine предоставлена ​​Матье Гиндоном, которая позволяет выполнять UNION, когда один из диапазонов пуст.

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