#excel #vba
#excel #vba
Вопрос:
Я пытаюсь создать макрос в рабочей книге, который очищает содержимое как из диапазонов, так и из отдельных ячеек одним нажатием кнопки; Я написал приведенный ниже код, который работает для всех диапазонов, но выдает ошибки для отдельных ячеек. Знаете ли вы, какое слово я должен использовать вместо «Диапазон», чтобы очистить содержимое из отдельных ячеек?
Sub Clearcells()
'Updateby Extendoffice 20161008
Range("C1:C2").ClearContents
Range("I11:I24").ClearContents
Range("I26:I31").ClearContents
Range("I33:I38").ClearContents
Range("I40:I44").ClearContents
Range("I46:I49").ClearContents
Range("I51:I54").ClearContents
Range("156:I58").ClearContents
Range("I60:I62").ClearContents
Range("I64:I66").ClearContents
Range("I68:I69").ClearContents
Range("I71:I72").ClearContents
Range("I74:I75").ClearContents
Range("I77:I78").ClearContents
Range("I80:I81").ClearContents
Range("I83:I84").ClearContents
Range("I86:I87").ClearContents
Range("I89:I90").ClearContents
Range("I92:I93").ClearContents
Range("I95:I96").ClearContents
Range("I98:I99").ClearContents
Range("I101:I102").ClearContents
Range("I104:I105").ClearContents
Range("I107:I108").ClearContents
Range("I110").ClearContents
Range("I112").ClearContents
Range("I114").ClearContents
Range("I116").ClearContents
Range("I118").ClearContents
Range("I120").ClearContents
Range("I122").ClearContents
Range("I124").ClearContents
Range("I126").ClearContents
Range("I128").ClearContents
Range("I130").ClearContents
Range("I132").ClearContents
Range("I134").ClearContents
Range("I136").ClearContents
Range("I138").ClearContents
Range("I140").ClearContents
Range("I142").ClearContents
Range("I144").ClearContents
End Sub
Комментарии:
1. Опечатка:
Range("156:I58").ClearContents
— это должна быть букваI
вместо цифры1
. В остальном для меня это работает отлично. Какое сообщение об ошибке и в какой строке?2. Всегда ли вы очищаете одни и те же диапазоны / ячейки? Если это так, у меня возникнет соблазн создать именованный диапазон и очистить все это в одной строке кода.
3. Я бы согласился с тем, что предложил @kevin9999. Создайте именованный диапазон, затем вы можете просто очистить его, используя 1 строку кода
Range("MyNamedRange").Clearcontents
. Как создать именованный диапазон
Ответ №1:
Нет разницы в синтаксисе, с помощью которого можно обращаться к диапазону из одной или нескольких ячеек. Я думаю, что BigBen в значительной степени справился с этим. Тем не менее, я предлагаю использовать код, приведенный ниже.
Sub ClearCells()
Dim Def As String ' range Definition
Dim Sp() As String
Dim i As Integer
Def = "C1:C2,I11:I24,I26:I31,I33:I38,I40:I44,I46:I49,I51:I54,I56:I58,I60:I62," amp; _
"I64:I66,I68:I69,I71:I72,I74:I75,I77:I78,I80:I81,I83:I84,I86:I87,I89:I90," amp; _
"I92:I93,I95:I96,I98:I99,I101:I102,I104:I105,I107:I108,I110,I112,I114,I116," amp; _
"I118,I120,I122,I124,I126,I128,I130,I132,I134,I136,I138,I140,I142,I144"
Sp = Split(Def, ",")
For i = 0 To UBound(Sp)
' Debug.Print Range(Sp(i)).Address
Range(Sp(i)).ClearContents
Next i
End Sub
Debug.Print Range(Sp(i)).Address
предназначен для того, чтобы помочь вам найти опечатки, подобные указанным BigBen, потому что код завершится ошибкой, когда дело дойдет до неверного адреса.
Даже более простой код, такой как Range("C1:C2,I11:I24,I26:I31,I33:I38,I40:I44,I46:I49").ClearContents
, также работает, но ваш список слишком длинный. Excel отклоняет это, и я предполагаю, что то же самое было бы верно, если бы вы попытались создать диапазон ‘Union`, объединив их все. Приведенное выше предложение является надежным и устойчивым, даже если оно расширено.
Говоря о расширении, код можно ускорить, отключив обновление экрана во время его выполнения. Завершите цикл с Application.ScreenUpdating = False
и повторите ту же строку с True
после цикла.