Столкнулся с такой проблемой: не могу найти пустые ячейки с помощью метода .SpecialCells(xlCellTypeBlanks) Диапазон точно пустой, так как он выбирается на только что созданном чистом листе. Он выбирается и... выдает ошибку при поиске пустых ячеек. При этом .SpecialCells(xlCellTypeConstants) тоже ничего не находит... Впрочем, как и поиск по формулам или еще по чему.
Но стоит сделать .Clear, как пустые ячейки начинают определяться, как пустые.... Но что это за бред, какими они были до этого? Как мне найти пустые ячейки?
Вы описываете как работали над чем-то... и это похоже был файлик со своими проблемами... Да? А где он? Или Вы думаете, что здесь моделируют проблемы по описанию, а потом рассказывают как их решить?
Ничего не понял... Проблема либо есть, либо ее нет. Просто выберете
Если нужен код (зачем?) - вот он:
Код
Public Sub hp_SetCopyFormates( _
ByRef acceptor As Range, _
ByRef donor_for_filled_cells As Range, _
ByRef donor_for_empty_cells As Range _
)
With acceptor
On Error GoTo errLabel1
With .SpecialCells(xlCellTypeBlanks)
donor_for_empty_cells.Copy
.PasteSpecial xlPasteValidation
.PasteSpecial xlPasteFormats
.PasteSpecial xlPasteColumnWidths
.PasteSpecial xlPasteFormulas
End With
nextLabel1:
On Error GoTo errLabel2
With .SpecialCells(xlCellTypeConstants)
donor_for_filled_cells.Copy
.PasteSpecial xlPasteValidation
.PasteSpecial xlPasteFormats
.PasteSpecial xlPasteColumnWidths
.PasteSpecial xlPasteFormulas
End With
End With
nextLabel2:
Exit Sub
'---------------------'
errLabel1:
Resume nextLabel1
errLabel2:
Resume nextLabel2
End Sub
Вставляйте любые диапазоны. Если Аксептор будет пустым полностью, то .SpecialCells(xlCellTypeBlanks) не сработает. И я спрашиваю - что делать?
Vhodnoylogin, в пределах .UsedRange Вернее нет, я не правильно выразился... Если нет ни одной используемой ячейки, то будет ошибка Достаточно закрасить даже цветом одну и все путем.
AAF написал: Достаточно закрасить даже цветом одну и все путем.
Недостаточно... Ведь смысл кода в том, чтобы запилить форматы для выбранного рейнджа...
Чтобы работало, нужно дополнить код этим:
Код
If WorksheetFunction.CountA(acceptor) = 0 Then
donor_for_filled_cells.Copy
.PasteSpecial xlPasteValidation
.PasteSpecial xlPasteFormats
.PasteSpecial xlPasteColumnWidths
.PasteSpecial xlPasteFormulas
End If
Вот если б Вы выложили файл... А то мне самому рисовать доноров и акцепторов? Вы четко представляете Вашу задачу и для Вас не сложно сделать это. Я сейчас не вижу проблем... В чем они?
Vhodnoylogin написал: Но стоит сделать .Clear, как пустые ячейки начинают определяться, как пустые
возможно, повреждение книги. Такое поведение может быть в одном случае: в ячейках не пустые значения, а строки нулевой длины. Такое может наблюдаться при создании файлов путем выгрузки из 1С. Попробуйте сделать все в новом файле.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Дим, я в новой книге в А1 записал единичку, выделяю А1:А5, выполняю макрос
Код
Sub qqq()
Selection.SpecialCells(xlCellTypeBlanks).Select
End Sub
и получаю ошибку с сообщением, что не найдено ни одной ячейки, удовлетворяющей указанным условиям. Мало того: F5 - выделить - Пустые ячейки, получаю аналогичное сообщение. Получается, что и у меня повреждена новая книга?
А, если вообще нет значений - это логично, т.к. диапазон рабочий пока еще только из одной ячейки(точнее - из ни одной ) и любая конструкция SpecialCells будет ломаться, т.к. не работает для ни одной ячейки. Я обычно перед использованием SpecialCells проверяю сколько будет ячеек в необходимом диапазоне. И если только одна ячейка в рабочем диапазоне - то проверяю через свойства самой ячейки.
Sub test1()
'вот здесь будет ошибка
Sheets.Add
Range("A1") = 1
Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks)
Rng.Select
End Sub
Sub test2()
'вот здесь иллюстрация работы .SpecialCells(xlCellTypeBlanks)
Sheets.Add: Range("B2") = 1
Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks): Rng.Select
For i = 1 To Rng.Areas.Count
s = s & "Areas(" & i & ").count = " & Rng.Areas(i).Count & vbCrLf
Next
MsgBox Join(Split(Rng.Address, ","), vbCrLf) & vbCrLf & s: s = ""
Sheets.Add: Range("C3:G7") = 1
Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks): Rng.Select
For i = 1 To Rng.Areas.Count
s = s & "Areas(" & i & ").count = " & Rng.Areas(i).Count & vbCrLf
Next
MsgBox Join(Split(Rng.Address, ","), vbCrLf) & vbCrLf & s: s = ""
Sheets.Add: Range("C3:G7") = 1
Range("F6:H8").EntireRow.Rows.Hidden = True
Set Rng = Range("A1:J10").SpecialCells(xlCellTypeBlanks): Rng.Select
For i = 1 To Rng.Areas.Count
s = s & "Areas(" & i & ").count = " & Rng.Areas(i).Count & vbCrLf
Next
MsgBox Join(Split(Rng.Address, ","), vbCrLf) & vbCrLf & s
'стоит обратить внимание и на это поведение SpecialCells
s = "xlCellTypeLastCell " & Cells(1).SpecialCells(xlCellTypeLastCell).Address
Set usRng = ActiveSheet.UsedRange
Set curReg = Range("C3:G7")
MsgBox s & vbCrLf & "последняя UsedRange " & usRng.Cells(usRng.Rows.Count, usRng.Columns.Count).Address _
& vbCrLf & "последняя CurRegion " & curReg.Cells(curReg.Rows.Count, curReg.Columns.Count).Address
End Sub