2013-10-25 4 views
10

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

Worksheets(sheetname).Range(.Cells(2, LastColData), .Cells(LastRowData, LastColData)).ClearContents 

Чтобы сделать это, однако я получаю сообщение об ошибке в первой секции .Cells, почему это?

ответ

22

Вы можете получить доступ к весь столбец в диапазоне, используя Worksheet.Columns объект

Что-то вроде:

Worksheets(sheetname).Columns(1).ClearContents 

должен очистить содержимое столбца

Существует также объект Worksheet.Rows, если вам нужно сделать что-то подобное для строк


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

Вы можете прочитать с блоками здесь: Microsoft Help

0

Перед началом работы необходимо указать с инструкцией. Или сделать .Cells в клеток

+0

Я попытался удалить. перед каждой ячейкой для получения этого 'Worksheets (имя листа) .Range (ячейки (2, LastColData), ячейки (LastRowData, LastColData)). ClearContents' И я получаю сообщение об ошибке« Ошибка определения приложения или ошибка, определяемая объектом ». При использовании ** WITH **, где это должно произойти? – dojogeorge

1

Как уже упоминалось студент Гэри, вы должны удалить точку перед Cells, чтобы сделать код работы, как вы изначально написали. Я не могу быть уверен, поскольку вы включили только одну строку кода, но ошибка, которую вы получили, когда вы удалили точки, может иметь какое-то отношение к тому, как вы определили свои переменные.

Я побежал вашу строку кода с переменными, определенными как целые числа, и она работала:

Sub TestClearLastColumn() 

    Dim LastColData As Long 
     Set LastColData = Range("A1").End(xlToRight).Column 

    Dim LastRowData As Long 
     Set LastRowData = Range("A1").End(xlDown).Row 

    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).ClearContents 

End Sub 

Я не думаю, что With утверждение подходит к строке кода вы поделились, но если бы вы были используйте один, With будет в начале строки, которая определяет объект, который вы манипулируете. Вот ваш код переписан используя ненужную With заявления:

With Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)) 
    .ClearContents 
End With 

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

With Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)) 
    .ClearContents 
    .Interior.Color = vbRed 
    .BorderAround Color:=vbBlack, Weight:=xlThick 
End With 

В противном случае вы должны объявить диапазон для каждого действия или свойства, как это:

Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).ClearContents 
    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).Interior.Color = vbRed 
    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).BorderAround Color:=vbBlack, Weight:=xlThick 

Я надеюсь, что это дает вам ощущение того, почему студент Гари считал, что компилятор может быть ожидая With (хотя это было неуместно) и, как и когда With может быть полезным в вашем коде.

+2

Вам нужно определить переменные как Long, иначе у вас будут проблемы после строки 32767 – Sam

+0

Спасибо @SamWard. Я внес изменения. –

0

Проблема не в том, что оператор with, это функция Range, она не принимает абсолютное значение ячейки .. она должна быть как Range («A4: B100»).Вы можете обратиться следующую нить для справки ..

следующий код должен работать .. Convert cells(1,1) into "A1" and vice versa

LastColData = Sheets(WSNAME).Range("A4").End(xlToRight).Column 
      LastRowData = Sheets(WSNAME).Range("A4").End(xlDown).Row 
      Rng = "A4:" & Sheets(WSNAME).Cells(LastRowData, LastColData).Address(RowAbsolute:=False, ColumnAbsolute:=False) 

Worksheets(WSNAME).Range(Rng).ClearContents 
1

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

Sub ClearThisSheet() 

ActiveSheet.UsedRange.ClearContents 

End Sub 
0

Чтобы очистить все строки, у которых есть данные, я использую две переменные, подобные этой. Мне это нравится, потому что вы можете настроить его на определенный диапазон столбцов, если вам нужно. дим Crow As Integer Dim LastRow As Integer

CRow = 1 
LastRow = Cells(Rows.Count, 3).End(xlUp).Row 

Do Until CRow = LastRow + 1 
    Cells(CRow, 1).Value = Empty 
    Cells(CRow, 2).Value = Empty 
    Cells(CRow, 3).Value = Empty 
    Cells(CRow, 4).Value = Empty 
    CRow = CRow + 1 
Loop 
0

Я нашел это простой способ очистки в форме между желаемой строки и столбца. Я не уверен, что это то, что вы ищете. Надеюсь, поможет.

Sub sbClearCellsOnlyData() 
Range("A1:C10").ClearContents 
End Sub 
0

Для тех, кто, как я, кто сталкивался с этим и нужно решение, которое не четкие заголовки, вот один лайнер, который работает для меня:

ActiveSheet.Range("A3:A" & Range("A3").End(xlDown).Row).ClearContents 

начинается на третьем ряду - изменить на ваш вкус.

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