Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2015, 08:22   #1
AleksandrH
Форумчанин
 
Аватар для AleksandrH
 
Регистрация: 15.02.2010
Сообщений: 148
По умолчанию Изменить формат ячейки и удалить пробелы

После выгрузки данных с ERP текстовые данные получаю с пробеламы в конце ("sku "), решил сделать макрос который в выделенном диапазоне удалит пробелы в непустых ячейках и преобразует их в текстовый формат. Если встречаются ячейки с формулами-их не трогать.
Прошу совета что можно оптимизировать, реализировать более просто :-)
Код:
Sub ToTextV2()
    Dim cur_range As Range
    Dim mini_range As Range
    Dim work_range As Range
    Dim RangeAddress As String
    Dim Ranges() As String
    Dim counter As Integer, i As Integer
    Dim RowsSelected As Integer
    Dim ColsSelected As Integer
    Dim maxrow As Long, maxcol As Long
    Set cur_range = Selection
    RangeAddress = cur_range.Address
    Ranges = Split(RangeAddress, ",")
    For counter = LBound(Ranges) To UBound(Ranges)
        Set mini_range = Range(Ranges(counter))
        With mini_range
            Select Case .Address
                Case Cells.Address ' виділено весь лист
                    MsgBox "Whole sheet was selected" & Chr(10) & "It's maybe some joke, dude!"
                    Exit Sub
                Case .EntireColumn.Address ' виділено стовпець/ці
                    RowsSelected = 0: maxrow = 0
                    For i = .Column To .Column + .Columns.Count - 1
                        maxrow = Cells(.Rows.Count, i).End(xlUp).Row
                        RowsSelected = IIf(RowsSelected > maxrow, RowsSelected, maxrow) ' самий нижній рядок
                    Next i
                    Set work_range = Range(Cells(RowsSelected, .Column + .Columns.Count - 1), Cells(1, .Column))
                Case .EntireRow.Address ' виділено рядок/дки
                    ColsSelected = 0: maxcol = 0
                    For i = .Row To .Row + .Rows.Count - 1
                        maxcol = Cells(i, .Columns.Count).End(xlToLeft).Column
                        ColsSelected = IIf(ColsSelected > maxcol, ColsSelected, maxcol) ' самий правий стовпець
                    Next i
                    Set work_range = Range(Cells(.Row, 1), Cells(.Rows.Count - 1, ColsSelected))
                Case Else ' виділено звичайний діапазон
                    Set work_range = Range(Cells(.Row, .Column), Cells(.Row + .Rows.Count - 1, .Column + .Columns.Count - 1))
            End Select
            TrimValue work_range
        End With
    Next counter
 End Sub
 
 Function TrimValue(rng As Range)
    Dim cel As Range
        For Each cel In rng
        If cel <> "" And Not (cel.HasFormula) Then
            cel.NumberFormat = "@"
            Do While InStr(cel.Value2, "  ") > 0
                cel.Value2 = Replace(cel.Value2, "  ", " ")
            Loop
            cel.Value2 = Trim(cel.Value2)
        End If
        Next
 End Function
WIX-FILTERS. A Filter for every application.
AleksandrH вне форума Ответить с цитированием
Старый 21.10.2015, 10:25   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Да, текста многовато Попробуйте так - со всем листом тоже можно работать
Код:
Sub AleksandrH()
Dim a As Range
  For Each a In Selection.SpecialCells(xlCellTypeConstants, xlTextValues).Areas
    a.NumberFormat = "@"
    a.Value = Application.Trim(a.Value)
  Next
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 21.10.2015, 10:36   #3
AleksandrH
Форумчанин
 
Аватар для AleksandrH
 
Регистрация: 15.02.2010
Сообщений: 148
По умолчанию

pięknie!

А можете обяснить почему trim() обрезает пробелы слева-справа, а Application.Trim() и в тексте?
WIX-FILTERS. A Filter for every application.
AleksandrH вне форума Ответить с цитированием
Старый 21.10.2015, 10:42   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Application.Trim это функция листа СЖПРОБЕЛЫ, она также заменяет множественные пробелы на один в строке. И, как многие другие функции листа, может работать с массивом.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 21.10.2015, 10:50   #5
AleksandrH
Форумчанин
 
Аватар для AleksandrH
 
Регистрация: 15.02.2010
Сообщений: 148
По умолчанию

и еще маленькую доделку прошу. Если в выделении нету текстовых ячеек, как обработать ошибку 1004 (Не найдено ячеек = указанным условиям) на "Selection.SpecialCells(xlCellTypeC onstants, xlTextValues).Areas"

Решил
Код:
Sub ToText()
  Dim a As Range
  On Error GoTo norec
    For Each a In Selection.SpecialCells(xlCellTypeConstants, xlTextValues).Areas
        a.NumberFormat = "@"
        a.Value = Application.Trim(a.Value)
    Next
norec:
End Sub
WIX-FILTERS. A Filter for every application.

Последний раз редактировалось AleksandrH; 21.10.2015 в 10:57.
AleksandrH вне форума Ответить с цитированием
Старый 21.10.2015, 11:48   #6
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию

А
Код:
On Error GoTo resume next
не поможет?

Может такая проверка
Код:
If   a.NumberFormat = "@" Then a.Value = Application.Trim(a.Value)
27102014 вне форума Ответить с цитированием
Старый 21.10.2015, 12:01   #7
AleksandrH
Форумчанин
 
Аватар для AleksandrH
 
Регистрация: 15.02.2010
Сообщений: 148
По умолчанию

Цитата:
Сообщение от 27102014 Посмотреть сообщение
А
Код:
On Error GoTo resume next
не поможет?
имхо
On Error resume next "запустит" выполнение команд внутри цикла
а On Error Goto Norec "перепрыгнет" в конец процедуры.
визуально на листе результат вроде одинаковый.

Цитата:
Сообщение от 27102014 Посмотреть сообщение
Может такая проверка
Код:
If   a.NumberFormat = "@" Then a.Value = Application.Trim(a.Value)
без on error... к етой строке не дойдет, потому что остановится на
Selection.SpecialCells(xlCellTypeCo nstants, xlTextValues, xlNumber).Areas
WIX-FILTERS. A Filter for every application.
AleksandrH вне форума Ответить с цитированием
Старый 11.03.2016, 11:20   #8
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Как "подшаманить" макроса чтобы отрабатывал и с установленным фильтром, те удалял пробелы и приводил формат в текст только видимых ячеек?
Вложения
Тип файла: xls Книга1.xls (41.5 Кб, 7 просмотров)
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменить формат ячейки при сохранении xls Євгеній Бєлік Общие вопросы Delphi 7 26.11.2013 08:14
Удалить пробелы из файла. elfi Общие вопросы C/C++ 1 14.09.2013 15:58
Формат ячейки равнялся формату ячейки из другого листа? Alexandrone Microsoft Office Excel 5 29.10.2010 00:08
Удалить лишние пробелы [C++] StudeHt Помощь студентам 2 20.05.2009 23:12
изменить формат ячейки natali Microsoft Office Excel 2 08.10.2007 12:40