Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Установка/снятие свойства locked с нескольких объединенных диапазонов, ускорить выполнение макроса
 
Доброго дня.
Столкнулся с похожей проблемой: для снятия защиты метод, являющийся предпочтительным, в связи с быстрой скоростью выполнения:
Код
МесABCDE.Locked = False
не работает для объединенных ячеек.

В связи с этим был заменен на:
Код
Dim x
For Each x In МесABCDE
   If x.MergeCells = True Then
      x.MergeArea.Locked = False
   Else
      x.Locked = False
   End If
Next
При этом скорость выполнения упала в несколько раз.

Вопрос: можно ли как-то обойти в первоначальном методе запрет работы с объединенными ячейками, т.к. второй метод сильно замедляет время работы?
Сопряжение объединенных диапазонов с методом очистки, Ошибка при очистке объединенных диапазонов
 
Дмитрий(The_Prist) Щербаков, Спасибо за развернутый ответ!
Сопряжение объединенных диапазонов с методом очистки, Ошибка при очистке объединенных диапазонов
 
Цитата
написал:
ActiveSheet.Range(ГодABCDEF.Address).Value = Empty
Благодарю. Работает.

Задался вопросом, чем отличаются методы ".Value = Empty" и "ClearContents", на просторах интернета нашел, что существуют и другие их варианты:
Код
.ClearContents
.Value = Empty
.Value = ""
.Value = vbNullString

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

Но почему все-таки метод
Код
.ClearContents
не работает с объединенным диапазоном?
Цитата
ActiveSheet.Range(ГодABCDEF.Address).ClearContents


Ведь в случае простых диапазонов работают все методы:
Код
[C14:AF763, C764:AH764, AV14:AZ763, AI14:AL763, F770, E8].ClearContents
[C14:AF763, C764:AH764, AV14:AZ763, AI14:AL763, F770, E8].Value = Empty
[C14:AF763, C764:AH764, AV14:AZ763, AI14:AL763, F770, E8].Value = vbNullString
Сопряжение объединенных диапазонов с методом очистки, Ошибка при очистке объединенных диапазонов
 
Необходимо очистить несколько различных диапазонов листа:
Код
Option Explicit
Dim ГодA
Dim ГодB
Dim ГодC
Dim ГодD
Dim ГодE
Dim ГодF
Dim ГодABCDEF
    Set ГодA = Range("C14:AF763")
    Set ГодB = Range("C764:AH764")
    Set ГодC = Range("AV14:AZ763")
    Set ГодD = Range("AI14:AL763")
    Set ГодE = Range("F770")
    Set ГодF = Range("E8")
    Set ГодABCDEF = Application.Union(ГодA, ГодB, ГодC, ГодD, ГодE, ГодF)

Sub Год_очистка()
    'очистка всех заполняемых ячеек
    If MsgBox("Вы действительно хотите очистить форму?", vbYesNo + vbCritical) = vbYes Then _
        ActiveSheet.Range(ГодABCDEF.Address).ClearContents
End Sub

Данная конструкция выдает ошибку "Run-time error '1004' application-defined or object-defined error".

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

Вопрос: Как нужно обозначить этот объединенный диапазон "ГодABCDEF", чтобы могла сработать очистка?
Несколько динамических диапазонов в Intersect, Проблема во включении нескольких динамических диапазонов Range в функцию Intersect
 
Цитата
написал:
масло масляное. XYZ и так уже диапазон, поэтому дополнительно крутить что-то нет смысла:
Код
КодIf Intersect(Target, XYZ) Is Nothing Then Exit Sub
Подправил. Спасибо.
Несколько динамических диапазонов в Intersect, Проблема во включении нескольких динамических диапазонов Range в функцию Intersect
 
Цитата
написал:
Голословное утверждение. Прочитайте про метод  UNION
Цитата
написал:
Объедините свои диапазоны при помощи Union
Спасибо. Вопрос решен.
Код
Set X = Range("J7:AN" & ПослРядСтолб9)
Set Y = Range("AV7:AW" & ПослРядСтолб9)
Set Z = Range("F" & lLastRow)
Set XYZ = Application.Union(X, Y, Z)
If Intersect(Target, Range(XYZ.Address)) Is Nothing Then Exit Sub
Цитата
нужно писать
Код
Код
If Not Intersect(Target, Range("F" & lLastRow)) Is Nothing Then Exit Sub
иначе (без Not) при попадании Target в указанный диапазон будет Exit Sub
При постановке Not  функция перестаёт работать, поэтому первоначальный вариант все-таки рабочий.
Изменено: Alexander.V - 30.01.2025 11:22:07
Несколько динамических диапазонов в Intersect, Проблема во включении нескольких динамических диапазонов Range в функцию Intersect
 
Цитата
написал:
П,С, И про ник не забываем
Ник исправлен.
Несколько динамических диапазонов в Intersect, Проблема во включении нескольких динамических диапазонов Range в функцию Intersect
 
Доброго дня!
Подскажите, как включить в указанный ниже код несколько динамических диапазонов?
Код
If Intersect(Target, Range("F" & lLastRow)) Is Nothing Then Exit Sub
К примеру:
Код
If Intersect(Target, Range("J7:AN" & ПослРядСтолб9), Range("AV7:AW" & ПослРядСтолб9), Range("F" & lLastRow)) Is Nothing Then Exit Sub

Чтобы действие выполнялось только при пересечении с этими динамическими диапазонами.

А по факту функция Intersect с более, чем одним диапазоном Range не работает.

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

Код
If Intersect(Target, Range("J7:AN1806, AV7:AW1806, F" & lLastRow)) Is Nothing Then Exit Sub
Изменено: San4os - 30.01.2025 09:09:45
Страницы: 1
Наверх