Здравствуйте Скажите пожалуйста что не так в макросе . Выделяю диапазон, объединяю ячейки, удаляю пустые ячейки со сдвигом вверх по столбику , хотя, как я понимаю, должна удаляться вся строчка . Почему удаляется не строчка, а только ячейки? Мне нужно удалить именно строку, пустую строку , в которой ранее было значение
Код
Sub MergeToOneCelldell()
Const sDELIM As String = " "
Dim rCell As Range
Dim sMergeStr As String
Dim n As Long, i As Long
If TypeName(Selection) <> "Range" Then Exit Sub 'если выделены не ячейки - выходим
With Selection
For Each rCell In .Cells
sMergeStr = sMergeStr & sDELIM & rCell.Text 'собираем текст из ячеек
rCell = "" '(добавляем строку)
Next rCell
Application.DisplayAlerts = False 'отключаем стандартное предупреждение о потере текста
'.Merge Across:=False 'объединяем ячейки (комментим эту строку)
Application.DisplayAlerts = True
.Item(1).Value = Mid(sMergeStr, 1 + Len(sDELIM)) 'добавляем к объед.ячейке суммарный текст
n = .Rows.Count
For i = n To 1 Step -1
If .Rows(i).Text = "" Then .Rows(i).Delete
Next
End With
End Sub
SSL, вам намекают, что есть свойство EntireRow (в переводе СТРОКА_ЦЕЛИКОМ), которое говорит Excel, что нужно использовать всю строку целиком, возможно вам надо использовать это свойство у свойства Row в вашем коде, приблизительно вот так
Код
For i = n To 1 Step -1
If .Rows(i).Text = "" Then .Rows(i).EntireRow.Delete 'удалить строку целиком, а не только в Selection
Next
так же вам намекают, что есть функция листа СЧЁТЗ(), она же на английском COUNTA(), она подсчитывает кол-во непустых ячеек в указанном в скобках диапазоне. То есть, если надо узнать сколько во второй строке непустых ячеек, то можно ввести в ячейку формулу (желательно вводить эту формулы не на второй строке) =СЧЁТЗ(2:2), если эта функция возвращает число 0, то вообще вся указанная строка пустая - нет ни одной заполненной ячейки в этой строке, а в макросе это будет так
Код
For i = n To 1 Step -1
If WorksheetFunction.CountA(.Rows(i)) = 0 Then 'вот тут мы использует СЧЁТЗ (COUNTA), чтобы проверить всю строку на пустоту
.Rows(i).EntireRow.Delete 'а вот тут мы используем свойство EntireRow, которую можно перевести СТРОКА_ЦЕЛИКОМ
End If
Next
New, спасибо. Не доголался к чему жто Попробую. Хотя тогда не понимаю если не использовать обьеденение строк, строка целиком удаляется при таком написании как сейчас. If .Rows(i).Text = "" Then .Rows(i).Delete
Я пологаю значит что то не так пишу в строках With selection Тут где то ошибка. Согласны?
Ps пишу с телефона, в формат кода не получается перевести. Извините
Если честно, то мы с вами можем тут переписываться ещё пару месяцев, пока вы не приложите файл-пример и не скажите нам какую задачу вы решаете (что хотите сделать). Грубо говоря, вы написали кривой код и хотите, чтобы мы его исправили, но мы пока не поняли, что вы решаете и что находится на листе. Мне вот не понятны вот эти вещи: зачем вы объединяете ячейки, зачем вы используете Selection, что такое в вашем коде rows(i).Text = "" Если наши советы выше не помогут вам, то прикладывайте файл и опишите вашу задачу, а мы уже напишем свой код или поправим ваш код.
SSL, посмотрите файл пример. В модуле этого фала 2 макроса: Ваш и исправленный. Протестируйте, посмотрите на результат. В файле на 1 листе, кроме диапазона для объединения есть еще непустые ячейки.
Если использовать Ваш вариант, то удаляется не вся строка целиком ( можно убедиться, посмотрев на изменение ячеек столбцов К, М и R).