Страницы: 1
RSS
СЖПРОБЕЛЫ() на VBA ????
 
как на VBA будет выглядить функция СЖПРОБЕЛЫ() ?
 
Trim()  
причем и как функция листа, а так же есть и функция VBA, если надо в коде переменную "сжать"
 
аналог функции СЖПРОБЕЛЫ в VBA - не TRIM(" текст   текст  "), а  
application.WorksheetFunction.Trim(" текст   текст  ")  
 
Последнюю можно также записать как  
WorksheetFunction.Trim(" текст   текст  ")  
и  
application.Trim(" текст   текст  ")  
 
 
TRIM убирает пробелы только справа и слева,  
application.Trim уберет также повторяющиеся проблы внутри текста.
 
Но не получается почемуто..  
ячейка водержит "cxczxczxc zczxcz          zxczxczxc           zczxc"  
вот кусок кода :  
 
cell = Trim(cell)  
 
но ничего не происходит....
 
Добавлю - Trim() уберёт только пробелы в начале и в конце, а двойные внутри оставит. А вот в VBA Excel при Application.WorksheetFunction.Trim(Ячейка.Value) -  будут удаляться лидирующие и финиширующие пробелы, а также многократные пробелы между словами (исползуется стандартная функция СЖПРОБЕЛЫ)
 
{quote}{login=Andrey}{date=03.04.2010 07:17}{thema=}{post}Но не получается почемуто..  
ячейка водержит "cxczxczxc zczxcz          zxczxczxc           zczxc"  
вот кусок кода :  
 
cell = Trim(cell)  
 
но ничего не происходит....{/post}{/quote}  
 
Так трим убирает только в начале и в конце - а там пробелов нет.  
cell = Application.WorksheetFunction.Trim(cell) используйте.
 
Вообще-то автор давал нормальную строку, с множественными пробелами внутри, но движок форума при выводе обрезал. Но я при цитировании их видел - можете попробовать цитнуть :) (интересный эффект - в цитате есть пробелы, при выводе - нет).
 
Объесняю немного подробнее,что хочется получить..  
Есть диапазон ячеек,  в котором есть ячейки с содержанием "лишних"  пробелов.  
Вот нужен макрос, который бы "убивал" лишние пробелы ( по подобию результата действия функции Excel = СЖПРОБЕЛЫ() )  
 
До макроса было :  
"Вася__Петя____Коля"  
После макроса :  
"Вася_Петя_Коля"  
 
"_" - это пробелы (т.к. двойные пробелы движек форума "съедает")
 
Афтар, выдели диапазон ячеек на листе и запусти этот код  
 
Sub DelSpaces()  
Dim iCell As Range  
   If MsgBox("Удалить лишние пробелы в выделенном диапазоне?", vbQuestion + vbYesNo, "Чистка пробелов") = vbNo Then Exit Sub  
   For Each iCell In Selection.Cells  
       iCell = Application.Trim(iCell)  
   Next  
   MsgBox "Лишние пробелы в указанном диапазоне удалены!", 64, "Конец"  
End Sub  
 
и не мучай людей по пустякам )))
 
{quote}{login=}{date=03.04.2010 10:59}{thema=}{post}Афтар, выдели диапазон ячеек на листе и запусти этот код  
 
Sub DelSpaces()  
Dim iCell As Range  
   If MsgBox("Удалить лишние пробелы в выделенном диапазоне?", vbQuestion + vbYesNo, "Чистка пробелов") = vbNo Then Exit Sub  
   For Each iCell In Selection.Cells  
       iCell = Application.Trim(iCell)  
   Next  
   MsgBox "Лишние пробелы в указанном диапазоне удалены!", 64, "Конец"  
End Sub  
 
и не мучай людей по пустякам ))){/post}{/quote}  
Вот так все же поэффективнее будет :-)  
 
Sub test()  
   With Selection  
       .Value = Application.Trim(.Value)  
   End With  
End Sub
KL
 
)) Кирилл как всегда на высоте ) Спасибо, буду знать )
 
KL, Ваше появление на форуме - подарок к празднику? Рад видеть (слышать? читать?) :)
 
{quote}{login=vikttur}{date=04.04.2010 01:24}{thema=}{post}KL, Ваше появление на форуме - подарок к празднику? Рад видеть (слышать? читать?) :){/post}{/quote}  
vikttur,  
Спасибо на добром слове. Я периодически почитываю форум, но времени отвечать почти нет. Да и потом в моем понимании здесь нет недостатка в квалифицированных ответах :-)
KL
 
{quote}{login=KL}{date=04.04.2010 04:36}{thema=Re: }{post}{quote}{login=}{date=03.04.2010 10:59}{thema=}{post}Афтар, выдели диапазон ячеек на листе и запусти этот код  
 
Sub DelSpaces()  
Dim iCell As Range  
   If MsgBox("Удалить лишние пробелы в выделенном диапазоне?", vbQuestion + vbYesNo, "Чистка пробелов") = vbNo Then Exit Sub  
   For Each iCell In Selection.Cells  
       iCell = Application.Trim(iCell)  
   Next  
   MsgBox "Лишние пробелы в указанном диапазоне удалены!", 64, "Конец"  
End Sub  
 
и не мучай людей по пустякам ))){/post}{/quote}  
Вот так все же поэффективнее будет :-)  
 
Sub test()  
   With Selection  
       .Value = Application.Trim(.Value)  
   End With  
End Sub{/post}{/quote}  
Улет! Я бы не додумался.:-(
Я сам - дурнее всякого примера! ...
 
А у меня что-то так работать не хочет...  
Давно написанный для себя макрос:  
Sub Trim_with_Cycle()   ' применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона  
  Dim rRange As Range, rCell As Range  
  Application.ScreenUpdating = False  
 
  Set rRange = Intersect(Selection, ActiveSheet.UsedRange)  
  For Each rCell In rRange  
     rCell.Value = Application.WorksheetFunction.Trim(rCell.Value)  
  Next  
 
  Application.ScreenUpdating = True  
End Sub  
 
работает отлично, а точно такой же, но по методу, предложенному KL (все ячейки диапазона сразу, а не циклом):  
 
Sub Trim_with_Range()   ' применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона  
  Dim rRange As Range  
  Application.ScreenUpdating = False  
 
  Set rRange = Intersect(Selection, ActiveSheet.UsedRange)  
  rRange.Value = Application.WorksheetFunction.Trim(rRange.Value)  
 
  Application.ScreenUpdating = True  
End Sub  
 
работать не хочет. Говорит, что "Несоответствие типа" (ошибка 13)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Я так сразу и пробовал.    
Если убрать .WorksheetFunction и написать просто:  
rRange.Value = Application.Trim(rRange.Value)  
то выдаётся "Ошибка, определяемая приложением или объектом" (ошибка 1004)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Sub Trim_with_Range() ' применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона  
Dim rRange As Range  
Set rRange = Intersect(Selection, ActiveSheet.UsedRange)  
rRange.Value = Application.Trim(rRange.Value)  
End Sub  
 
так у меня работает, с функцией листа не работает.
 
Подрихтовываю свой макрос, удаляющий лишние пробелы в ячейках.  
Чтобы не портились формулы и форматы даты/времени решил всё-таки отказаться от обработки целиком диапазона:  
rRange.Value = Application.Trim(rRange.Value),  
а ввести проверку каждой ячейки: не формула ли в ней, не дата ли, не время ли?  
 
С формулой и датой всё ясно:  
 
Sub Trim_By_Formula() ' применить функцию СЖПРОБЕЛЫ к ячейкам выделенного диапазона  
  Dim rRange As Range, rCell As Range  
  Application.ScreenUpdating = False  
  Set rRange = Intersect(Selection, ActiveSheet.UsedRange)  
  For Each rCell In rRange  
     If rCell.EntireRow.Height > 0 _  
        And Not (rCell.HasFormula) _  
        And Not IsDate(rCell) Then  
        rCell.Value = Application.WorksheetFunction.Trim(rCell.Value)  
     End If  
  Next  
  Application.ScreenUpdating = True  
End Sub  
 
А вот как проверить не время ли в ячеёке?  
Свойство IsDate(rCell) вернёт ИСТИНУ при любом из форматов даты в ячейке.  
А как быть с разными форматами времени? Ведь аналогичного свойства IsTime(rCell) - в VBA нет...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Но ведь время - это дата.
 
Это Вы так думаете, а Ёксель - нет.  
Попробуйте ввести в одну ячейку, например, 1.1.10 (автоматически преобразуется после ввода в дату 01.01.2010), а в другую - 10:00 (преобразуется после ввода во время 10:00:00).  
А потом попробуйте применить к ячейкам мой макрос из предыдущего поста.  
Или просто напишите  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
MsgBox IsDate(Target)  
End Sub  
"Покликайте" по ячейкам и сами увидите, что IsDate будет True только при дате в ячейке, а при времени - False
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
А вот так корректно будет?  
Sub TestTimeFormat()  
Dim x As String  
x = ActiveCell.NumberFormat  
If x Like "*" & ":" & "*" Then MsgBox "Время"  
End Sub
 
Нет: если в ячейке формат дата + время, то тоже сработает. Тогда так:  
Sub TestTimeFormat()  
Dim x As String  
x = ActiveCell.NumberFormat  
If Len(x) < 9 And x Like "*" & ":" & "*" Then MsgBox "Только время"  
End Sub
 
Мужики, а что быстрее будет работать в цикле:  
If Target.NumberFormat Like "*" & ":" & "*" Then ...  
или  
If InStr(1, Target.NumberFormat, "h:mm", vbTextCompare) > 0 Then ...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Наверх