Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Макрос "DeleteEmptyRows" - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: _Boroda_, китин  
Макрос "DeleteEmptyRows"
Alex_ST Дата: Вторник, 02.10.2012, 11:19 | Сообщение № 21
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Gustav,
спасибо
Я сделал по аналогии:
А1=пусто
В1=Т(СЛЧИС())
С1==Т(СЛЧИС()) & ""
[a1:c1].text вернул мне vbNullString
а Application.CountA([a1:c1]) = 2
Так вот почему .text используют редко!



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Вторник, 02.10.2012, 11:20
 
Ответить
СообщениеGustav,
спасибо
Я сделал по аналогии:
А1=пусто
В1=Т(СЛЧИС())
С1==Т(СЛЧИС()) & ""
[a1:c1].text вернул мне vbNullString
а Application.CountA([a1:c1]) = 2
Так вот почему .text используют редко!

Автор - Alex_ST
Дата добавления - 02.10.2012 в 11:19
Gustav Дата: Вторник, 02.10.2012, 12:20 | Сообщение № 22
Группа: Админы
Ранг: Участник клуба
Сообщений: 2793
Репутация: 1160 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Что ж, nilem меня вдохновил со своим первым столбцом и SpecialCells(xlCellTypeBlanks) на дальнейшие изыскания. Только я не стал использовать Union, о котором тоже подумывал, а стал переносить специальное выделение первого столбца на последующие и уже в этом, каждый раз уменьшающемся по кол-ву пустых ячеек, выделении искать очередные пустоты. Найденные таким образом пустоты последнего столбца и олицетворили собой пустые строки к удалению. Опуская начальные и конечные фрагменты с With Application...End With (а может они уже и не сильно нужны? ведь требуется всего одна вставка и одно удаление), код получился следующим:

[vba]
Code

Sub DeleteEmptyRowsInSelection2()

      Dim rng As Range, col As Range, i As Long
        
      Set rng = Intersect(Selection, ActiveSheet.UsedRange)
       
      On Error Resume Next
      Set col = rng.Columns(1)
      For i = 1 To rng.Columns.Count
          Set col = col.SpecialCells(xlCellTypeBlanks)
          If Err.Number <> 0 Then Exit Sub
          Set col = col.Offset(, 1)
      Next i
      On Error GoTo 0
        
      rng.Offset(rng.Rows.Count).Resize(col.Cells.Count).Insert xlShiftDown
      Intersect(rng, col.EntireRow).Delete xlShiftUp
        
End Sub
[/vba]

Из теоретических недостатков: снизу обрабатываемому выделению временно требуется достаточное место для компенсирующей вставки пачки новых пустых строк взамен далее удаляемых. Вызвано это тем, что, как можно видеть из кода, сначала выполняется вставка, а затем удаление. Если эти операции поменять местами, то код придется несколько усложнить. Впрочем, если выделение невелико по высоте и далеко от нижней границы рабочего листа, то практически этот недостаток будет неощутимым.

Ну, и напоминаю, что я удаляю не полные пустые строки (через весь лист), а "частичные" (только в пределах заданного диапазона, не трогая информацию справа и слева от диапазона).


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Вторник, 02.10.2012, 12:20
 
Ответить
СообщениеЧто ж, nilem меня вдохновил со своим первым столбцом и SpecialCells(xlCellTypeBlanks) на дальнейшие изыскания. Только я не стал использовать Union, о котором тоже подумывал, а стал переносить специальное выделение первого столбца на последующие и уже в этом, каждый раз уменьшающемся по кол-ву пустых ячеек, выделении искать очередные пустоты. Найденные таким образом пустоты последнего столбца и олицетворили собой пустые строки к удалению. Опуская начальные и конечные фрагменты с With Application...End With (а может они уже и не сильно нужны? ведь требуется всего одна вставка и одно удаление), код получился следующим:

[vba]
Code

Sub DeleteEmptyRowsInSelection2()

      Dim rng As Range, col As Range, i As Long
        
      Set rng = Intersect(Selection, ActiveSheet.UsedRange)
       
      On Error Resume Next
      Set col = rng.Columns(1)
      For i = 1 To rng.Columns.Count
          Set col = col.SpecialCells(xlCellTypeBlanks)
          If Err.Number <> 0 Then Exit Sub
          Set col = col.Offset(, 1)
      Next i
      On Error GoTo 0
        
      rng.Offset(rng.Rows.Count).Resize(col.Cells.Count).Insert xlShiftDown
      Intersect(rng, col.EntireRow).Delete xlShiftUp
        
End Sub
[/vba]

Из теоретических недостатков: снизу обрабатываемому выделению временно требуется достаточное место для компенсирующей вставки пачки новых пустых строк взамен далее удаляемых. Вызвано это тем, что, как можно видеть из кода, сначала выполняется вставка, а затем удаление. Если эти операции поменять местами, то код придется несколько усложнить. Впрочем, если выделение невелико по высоте и далеко от нижней границы рабочего листа, то практически этот недостаток будет неощутимым.

Ну, и напоминаю, что я удаляю не полные пустые строки (через весь лист), а "частичные" (только в пределах заданного диапазона, не трогая информацию справа и слева от диапазона).

Автор - Gustav
Дата добавления - 02.10.2012 в 12:20
nilem Дата: Вторник, 02.10.2012, 15:40 | Сообщение № 23
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Quote (Alex_ST)
Так вот почему .text используют редко!

Я, видимо, неправильно написал: "Если все ячейки диапазона содержат одинаковые значения..."
Не "содержат одинаковые значения", а имеют одинаковое свойство Text (ну, или имеют одинаковое видимое представление).
Если формула возвращает "", то Text этой ячейки будет vbNullString, что вполне логично.
Попробуйте для интереса записать в А1 1,111; В1 1,112; С1 1,113. Уменьшите ширину столбцов, чтобы в ячейках осталось 1,11 и тогда
MsgBox Range("A1:C1").Text выдаст "1,11"
Вполне хорошее свойство, можно использовать чаще smile

xlCalculationManual изменил. Спасибо.


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение
Quote (Alex_ST)
Так вот почему .text используют редко!

Я, видимо, неправильно написал: "Если все ячейки диапазона содержат одинаковые значения..."
Не "содержат одинаковые значения", а имеют одинаковое свойство Text (ну, или имеют одинаковое видимое представление).
Если формула возвращает "", то Text этой ячейки будет vbNullString, что вполне логично.
Попробуйте для интереса записать в А1 1,111; В1 1,112; С1 1,113. Уменьшите ширину столбцов, чтобы в ячейках осталось 1,11 и тогда
MsgBox Range("A1:C1").Text выдаст "1,11"
Вполне хорошее свойство, можно использовать чаще smile

xlCalculationManual изменил. Спасибо.

Автор - nilem
Дата добавления - 02.10.2012 в 15:40
Gustav Дата: Среда, 03.10.2012, 10:55 | Сообщение № 24
Группа: Админы
Ранг: Участник клуба
Сообщений: 2793
Репутация: 1160 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Quote (nilem)
Попробуйте для интереса записать в А1 1,111; В1 1,112; С1 1,113. Уменьшите ширину столбцов, чтобы в ячейках осталось 1,11 и тогда
MsgBox Range("A1:C1").Text выдаст "1,11"

Эвона как! Надо же... В одной уважаемой ERP-системе мне встретился такой код для получения значения ячейки Excel:

[vba]
Code
protected anyType GetValueFromRange(COM _comRange)
{
      str _anyType;

      _anyType=this.convertVariant2Str(_comRange.text());

      return _anyType;
}
[/vba]
Представляю, какие потенциальные сюрпризы в нем заложены...

Заметил, что в основном "проблемы" наблюдаются с числами (укорачивание) и датами (тут одно из двух - либо сама дата, либо частокол решеток). Если же ввести длинный текст в две соседние ячейки, то у первой текст будет отображаться лишь частично, т.е. в пределах ячейки. Свойство же Text, тем не менее, вернет полную строку. Но если на эту ячейку наложить скрывающий формат ;;; , то Text вернет пустоту!

И опять примерчик:

A1: Пролетарии всех стран, соединяйтесь! (c форматом ;;; )
B1: пусто

? [a1:b1].Text = vbNullString
True

!!!!!! и все равно мозг отказывается понимать... sad


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Quote (nilem)
Попробуйте для интереса записать в А1 1,111; В1 1,112; С1 1,113. Уменьшите ширину столбцов, чтобы в ячейках осталось 1,11 и тогда
MsgBox Range("A1:C1").Text выдаст "1,11"

Эвона как! Надо же... В одной уважаемой ERP-системе мне встретился такой код для получения значения ячейки Excel:

[vba]
Code
protected anyType GetValueFromRange(COM _comRange)
{
      str _anyType;

      _anyType=this.convertVariant2Str(_comRange.text());

      return _anyType;
}
[/vba]
Представляю, какие потенциальные сюрпризы в нем заложены...

Заметил, что в основном "проблемы" наблюдаются с числами (укорачивание) и датами (тут одно из двух - либо сама дата, либо частокол решеток). Если же ввести длинный текст в две соседние ячейки, то у первой текст будет отображаться лишь частично, т.е. в пределах ячейки. Свойство же Text, тем не менее, вернет полную строку. Но если на эту ячейку наложить скрывающий формат ;;; , то Text вернет пустоту!

И опять примерчик:

A1: Пролетарии всех стран, соединяйтесь! (c форматом ;;; )
B1: пусто

? [a1:b1].Text = vbNullString
True

!!!!!! и все равно мозг отказывается понимать... sad

Автор - Gustav
Дата добавления - 03.10.2012 в 10:55
Alex_ST Дата: Среда, 03.10.2012, 11:22 | Сообщение № 25
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
В общем, свойство .Text - штука хоть и мощная, но достаточно опасная, т.к. всегда может вдруг вернуть не то, на что рассчитывал программист. biggrin
Ну её нафиг!



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеВ общем, свойство .Text - штука хоть и мощная, но достаточно опасная, т.к. всегда может вдруг вернуть не то, на что рассчитывал программист. biggrin
Ну её нафиг!

Автор - Alex_ST
Дата добавления - 03.10.2012 в 11:22
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!