Содержимое Excel VBA в обоих диапазонах и отдельных ячейках при нажатии кнопки

#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 после цикла.