Gustav, спасибо Я сделал по аналогии: А1=пусто В1=Т(СЛЧИС()) С1==Т(СЛЧИС()) & "" [a1:c1].text вернул мне vbNullString а Application.CountA([a1:c1]) = 2 Так вот почему .text используют редко!
Gustav, спасибо Я сделал по аналогии: А1=пусто В1=Т(СЛЧИС()) С1==Т(СЛЧИС()) & "" [a1:c1].text вернул мне vbNullString а Application.CountA([a1:c1]) = 2 Так вот почему .text используют редко!Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 02.10.2012, 11: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
Из теоретических недостатков: снизу обрабатываемому выделению временно требуется достаточное место для компенсирующей вставки пачки новых пустых строк взамен далее удаляемых. Вызвано это тем, что, как можно видеть из кода, сначала выполняется вставка, а затем удаление. Если эти операции поменять местами, то код придется несколько усложнить. Впрочем, если выделение невелико по высоте и далеко от нижней границы рабочего листа, то практически этот недостаток будет неощутимым.
Ну, и напоминаю, что я удаляю не полные пустые строки (через весь лист), а "частичные" (только в пределах заданного диапазона, не трогая информацию справа и слева от диапазона).
Что ж, 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
Из теоретических недостатков: снизу обрабатываемому выделению временно требуется достаточное место для компенсирующей вставки пачки новых пустых строк взамен далее удаляемых. Вызвано это тем, что, как можно видеть из кода, сначала выполняется вставка, а затем удаление. Если эти операции поменять местами, то код придется несколько усложнить. Впрочем, если выделение невелико по высоте и далеко от нижней границы рабочего листа, то практически этот недостаток будет неощутимым.
Ну, и напоминаю, что я удаляю не полные пустые строки (через весь лист), а "частичные" (только в пределах заданного диапазона, не трогая информацию справа и слева от диапазона).Gustav
Я, видимо, неправильно написал: "Если все ячейки диапазона содержат одинаковые значения..." Не "содержат одинаковые значения", а имеют одинаковое свойство Text (ну, или имеют одинаковое видимое представление). Если формула возвращает "", то Text этой ячейки будет vbNullString, что вполне логично. Попробуйте для интереса записать в А1 1,111; В1 1,112; С1 1,113. Уменьшите ширину столбцов, чтобы в ячейках осталось 1,11 и тогда MsgBox Range("A1:C1").Text выдаст "1,11" Вполне хорошее свойство, можно использовать чаще
xlCalculationManual изменил. Спасибо.
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" Вполне хорошее свойство, можно использовать чаще
Попробуйте для интереса записать в А1 1,111; В1 1,112; С1 1,113. Уменьшите ширину столбцов, чтобы в ячейках осталось 1,11 и тогда MsgBox Range("A1:C1").Text выдаст "1,11"
Эвона как! Надо же... В одной уважаемой ERP-системе мне встретился такой код для получения значения ячейки Excel:
[/vba] Представляю, какие потенциальные сюрпризы в нем заложены...
Заметил, что в основном "проблемы" наблюдаются с числами (укорачивание) и датами (тут одно из двух - либо сама дата, либо частокол решеток). Если же ввести длинный текст в две соседние ячейки, то у первой текст будет отображаться лишь частично, т.е. в пределах ячейки. Свойство же Text, тем не менее, вернет полную строку. Но если на эту ячейку наложить скрывающий формат ;;; , то Text вернет пустоту!
И опять примерчик:
A1: Пролетарии всех стран, соединяйтесь! (c форматом ;;; ) B1: пусто
? [a1:b1].Text = vbNullString True
!!!!!! и все равно мозг отказывается понимать...
Quote (nilem)
Попробуйте для интереса записать в А1 1,111; В1 1,112; С1 1,113. Уменьшите ширину столбцов, чтобы в ячейках осталось 1,11 и тогда MsgBox Range("A1:C1").Text выдаст "1,11"
Эвона как! Надо же... В одной уважаемой ERP-системе мне встретился такой код для получения значения ячейки Excel:
[/vba] Представляю, какие потенциальные сюрпризы в нем заложены...
Заметил, что в основном "проблемы" наблюдаются с числами (укорачивание) и датами (тут одно из двух - либо сама дата, либо частокол решеток). Если же ввести длинный текст в две соседние ячейки, то у первой текст будет отображаться лишь частично, т.е. в пределах ячейки. Свойство же Text, тем не менее, вернет полную строку. Но если на эту ячейку наложить скрывающий формат ;;; , то Text вернет пустоту!
И опять примерчик:
A1: Пролетарии всех стран, соединяйтесь! (c форматом ;;; ) B1: пусто
? [a1:b1].Text = vbNullString True
!!!!!! и все равно мозг отказывается понимать... Gustav
В общем, свойство .Text - штука хоть и мощная, но достаточно опасная, т.к. всегда может вдруг вернуть не то, на что рассчитывал программист. Ну её нафиг!
В общем, свойство .Text - штука хоть и мощная, но достаточно опасная, т.к. всегда может вдруг вернуть не то, на что рассчитывал программист. Ну её нафиг!Alex_ST