2013-09-23 1 views
6

Добрый вечер друзья:2 способа для «ClearContents» на VBA Excel, но 1 работает нормально. Зачем?

Я имею в виду 2-мя способами для очистки содержимого в заданном диапазоне ячеек проекта VBA (в MS Excel):

  1. Worksheets("SheetName").Range("A1:B10").ClearContents
  2. Worksheets("SheetName").Range(Cells(1, 1), Cells(10, 2)).ClearContents

Проблема в том, что второй способ показать мне ошибку «1004», когда я не смотрю текущий рабочий лист «SheetName» (другими словами, когда у меня нет «SheetName» как ActiveSheet).

Первый способ работы безупречно в любой ситуации.

Почему это происходит? Как я могу использовать «Второй способ» без этой ошибки?

+1

Не для очков, но был ли мой ответ, который трудно понять? –

+0

@Sid Если когда-либо я был в отчаянии для принятия, я думаю, что я просто последую за вами, отправляя ответы! – pnuts

+1

@pnuts: Нет, я не думаю: @tigeravatar в отчаянии :) Это была просто разница в несколько минут :) –

ответ

8

Это связано с тем, что у вас не было Cells(1, 1) с объектом рабочего листа, а также для Cells(10, 2). Для кода, чтобы работать, он должен выглядеть примерно так:

Dim ws As Worksheet 

Set ws = Sheets("SheetName") 
Range(ws.Cells(1, 1), ws.Cells(10, 2)).ClearContents 

Поочередно:

With Sheets("SheetName") 
    Range(.Cells(1, 1), .Cells(10, 2)).ClearContents 
End With 

EDIT: Объект Range наследуют таблицу из объектов Cells, когда код выполняется из стандартный модуль или пользовательскую форму. Если вы работаете код из модуля листа кода, вам нужно будет претендовать Range также, например, так:

ws.Range(ws.Cells(1, 1), ws.Cells(10, 2)).ClearContents 

или

With Sheets("SheetName") 
    .Range(.Cells(1, 1), .Cells(10, 2)).ClearContents 
End With 
+0

Возможно, вы захотите добавить 'ws.' перед' Range'? 'ws.Range (ws.Cells (1, 1), ws.Cells (10, 2)). ClearContents' –

+0

Аналогичным образом добавляется DOT для второго кода' .Range (.Cells (1, 1), .Cells (10, 2)). ClearContents' –

+0

Это не обязательно. Range наследует рабочий лист объектов Cells, если Range не был предоставлен листом – tigeravatar

8

Это потому, что вы не полностью квалифицируете свой объект клеток. Попробуйте это

With Worksheets("SheetName") 
    .Range(.Cells(1, 1), .Cells(10, 2)).ClearContents 
End With 

Обратите внимание на DOT перед ячейками?

0

Для численной адресации ячеек попытаться включить S1O1 флажок в MS Настройки Excel. Это вторая вкладка сверху (т. Е. Формулы), где-то в середине страницы в моей венгерской версии.

Если включено, он обрабатывает адресацию VBA в обоих стилях, то есть диапазон («A1: B10») и диапазон (ячейки (1, 1), ячейки (10, 2)). Я предполагаю, что он обрабатывает только стиль Range («A1: B10»), если он не включен.

Удачи вам!

(Обратите внимание, что диапазон («A1: B10») представляет квадрат 2x10, а диапазон (ячейки (1, 1), ячейки (10, 2)) представляет 10x2. Использование номеров столбцов вместо букв не повлияет порядок начисления.)

Смежные вопросы