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

Вход

Регистрация

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

 

= Мир MS Excel/Сокращение номенклатуры прайс-листа для печати кассового чек - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Сокращение номенклатуры прайс-листа для печати кассового чек (Формулы/Formulas)
Сокращение номенклатуры прайс-листа для печати кассового чек
yaroslavin Дата: Среда, 09.08.2017, 00:23 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Доброй всем ночи!

Помогите пожалуйста решить проблему.
Есть база данных, в данном случае прайс-лист. Для загрузки в кассовый аппарат нужно сократить номенклатуру до 28 символов в ячейке, т.е. из каждого слова взять 3 или 4 буквы.

Пример:
Зубная щетка Oral-B pro Expert 3d

нужно

Зуб.щет.Ora.pro.exp.3d

В ячейке может быть как 3 слова так и 10ть. прайс все время обновляется, дополняется и т.п. т.е. формула нужна универсальная. Голову сломал как это сделать. Прошу вашей помощи!
 
Ответить
СообщениеДоброй всем ночи!

Помогите пожалуйста решить проблему.
Есть база данных, в данном случае прайс-лист. Для загрузки в кассовый аппарат нужно сократить номенклатуру до 28 символов в ячейке, т.е. из каждого слова взять 3 или 4 буквы.

Пример:
Зубная щетка Oral-B pro Expert 3d

нужно

Зуб.щет.Ora.pro.exp.3d

В ячейке может быть как 3 слова так и 10ть. прайс все время обновляется, дополняется и т.п. т.е. формула нужна универсальная. Голову сломал как это сделать. Прошу вашей помощи!

Автор - yaroslavin
Дата добавления - 09.08.2017 в 00:23
AndreTM Дата: Среда, 09.08.2017, 00:58 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1664
Репутация: 481 ±
Замечаний: 0% ±

2003 & 2010
По идее, тут надо бы вообще завести дополнительную таблицу с сокращенными именами, и пополнять именно её, и макросом, а не формулой, и чтобы её можно было подправлять (и чтобы макрос потом уже не правил сам, а дополнял только новыми позициями её). И макрос должен проверять не только названия, но и "актуальность", чтобы можно было отфильтровать эту новую таблицу и перегрузить кассу только новыми наименованиями. Соотвественно, надо ещё и видеть образец вашей базы, чтобы знать, какие поля будут ключевыми, чтобы формировать эту "таблицу для загрузки" уже в формате, пригодном для кассы.

Так что тут надо не только ваши файлы-образцы иметь, но и задача может стать комплексной...


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеПо идее, тут надо бы вообще завести дополнительную таблицу с сокращенными именами, и пополнять именно её, и макросом, а не формулой, и чтобы её можно было подправлять (и чтобы макрос потом уже не правил сам, а дополнял только новыми позициями её). И макрос должен проверять не только названия, но и "актуальность", чтобы можно было отфильтровать эту новую таблицу и перегрузить кассу только новыми наименованиями. Соотвественно, надо ещё и видеть образец вашей базы, чтобы знать, какие поля будут ключевыми, чтобы формировать эту "таблицу для загрузки" уже в формате, пригодном для кассы.

Так что тут надо не только ваши файлы-образцы иметь, но и задача может стать комплексной...

Автор - AndreTM
Дата добавления - 09.08.2017 в 00:58
InExSu Дата: Среда, 09.08.2017, 09:30 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 93
Репутация: 12 ±
Замечаний: 0% ±

Excel 2007
Выделяете нужные ячейки и натравливаете макрос
[vba]
Код
Sub ХараКири_БМ_InExSu()
  Dim cell As Range
  For Each cell In Selection 'работаем с выделенным
    If Len(cell) > 28 Then
      arr_NS = Split(cell)
      For i = 0 To UBound(arr_NS)
        If Len(arr_NS(i)) > 3 Then
          NS = NS & Left(arr_NS(i), 3) & ". "
        Else
          NS = NS & arr_NS(i) & " "
        End If
      Next
      If Len(NS) > 28 Then NS = Left(NS, 28)
      cell.Value = NS: NS = ""
    End If
  Next
End Sub
[/vba]

Макрос в ячейке с текстом длиннее 28 сократит слова. Если сокращения не помогут, всё равно оставит в ячейке 28 символов.


Сообщение отредактировал InExSu - Среда, 09.08.2017, 19:45
 
Ответить
СообщениеВыделяете нужные ячейки и натравливаете макрос
[vba]
Код
Sub ХараКири_БМ_InExSu()
  Dim cell As Range
  For Each cell In Selection 'работаем с выделенным
    If Len(cell) > 28 Then
      arr_NS = Split(cell)
      For i = 0 To UBound(arr_NS)
        If Len(arr_NS(i)) > 3 Then
          NS = NS & Left(arr_NS(i), 3) & ". "
        Else
          NS = NS & arr_NS(i) & " "
        End If
      Next
      If Len(NS) > 28 Then NS = Left(NS, 28)
      cell.Value = NS: NS = ""
    End If
  Next
End Sub
[/vba]

Макрос в ячейке с текстом длиннее 28 сократит слова. Если сокращения не помогут, всё равно оставит в ячейке 28 символов.

Автор - InExSu
Дата добавления - 09.08.2017 в 09:30
yaroslavin Дата: Среда, 09.08.2017, 23:23 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
InExSu, спасибо огромное!!! Сейчас буду пробовать!
 
Ответить
СообщениеInExSu, спасибо огромное!!! Сейчас буду пробовать!

Автор - yaroslavin
Дата добавления - 09.08.2017 в 23:23
_Boroda_ Дата: Среда, 09.08.2017, 23:31 | Сообщение № 5
Группа: Модераторы
Ранг: Местный житель
Сообщений: 10992
Репутация: 4564 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Еще вариант функцией пользователя
[vba]
Код
Function LenSimv28(d_)
    Dim f_ As String * 28, s_ As String * 3
    d_ = WorksheetFunction.Trim(d_)
    If Len(d_) < 28 Then
        LenSimv28 = d_
        Exit Function
    End If
    m_ = Split(d_, " ")
    For i = 0 To UBound(m_) - 1
        s_ = m_(i)
        m_(i) = Trim(s_) & "."
    Next i
    s_ = m_(i)
    m_(i) = Trim(s_)
    f_ = Join(m_, "")
    LenSimv28 = Trim(f_)
End Function
[/vba]
К сообщению приложен файл: len28_1.xlsm(14Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеЕще вариант функцией пользователя
[vba]
Код
Function LenSimv28(d_)
    Dim f_ As String * 28, s_ As String * 3
    d_ = WorksheetFunction.Trim(d_)
    If Len(d_) < 28 Then
        LenSimv28 = d_
        Exit Function
    End If
    m_ = Split(d_, " ")
    For i = 0 To UBound(m_) - 1
        s_ = m_(i)
        m_(i) = Trim(s_) & "."
    Next i
    s_ = m_(i)
    m_(i) = Trim(s_)
    f_ = Join(m_, "")
    LenSimv28 = Trim(f_)
End Function
[/vba]

Автор - _Boroda_
Дата добавления - 09.08.2017 в 23:31
AndreTM Дата: Среда, 09.08.2017, 23:41 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1664
Репутация: 481 ±
Замечаний: 0% ±

2003 & 2010
Александр, у InExSu алгоритм выглядит побыстрее, даже если к нему забытый WorksheetFunction.Trim() добавить... :)


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеАлександр, у InExSu алгоритм выглядит побыстрее, даже если к нему забытый WorksheetFunction.Trim() добавить... :)

Автор - AndreTM
Дата добавления - 09.08.2017 в 23:41
_Boroda_ Дата: Четверг, 10.08.2017, 16:18 | Сообщение № 7
Группа: Модераторы
Ранг: Местный житель
Сообщений: 10992
Репутация: 4564 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Обычно я на такие бездоказательные инсинуации
Александр, у InExSu алгоритм выглядит побыстрее
не отвечаю, но здесь вроде уважаемый человек, дай, думаю, действительно посмотрю
Ну, во-первых, это я решил побаловаться с вот этим методом отсечения http://www.excelworld.ru/forum/7-1861-1
А во-вовторых - обоснуй. С цифрами. И с учетом того, что у меня функция, которая никогда не будет работать быстрее простого макроса.
Если код функции перевести на Sub и работу с выделенным диапазоном (что в принципе некорректно, т.к. алгоритм разный), то по времени отработки 10000 ячеек разница в 0,02 сек
А если нормально макрос для работы с диапазоном написать (даже без всяких улучшений, просто Селекшн в массив перенести), то уменьшение скорости примерно раз в 15 получается. А если подумать еще, ... Но мне уже неохота


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеОбычно я на такие бездоказательные инсинуации
Александр, у InExSu алгоритм выглядит побыстрее
не отвечаю, но здесь вроде уважаемый человек, дай, думаю, действительно посмотрю
Ну, во-первых, это я решил побаловаться с вот этим методом отсечения http://www.excelworld.ru/forum/7-1861-1
А во-вовторых - обоснуй. С цифрами. И с учетом того, что у меня функция, которая никогда не будет работать быстрее простого макроса.
Если код функции перевести на Sub и работу с выделенным диапазоном (что в принципе некорректно, т.к. алгоритм разный), то по времени отработки 10000 ячеек разница в 0,02 сек
А если нормально макрос для работы с диапазоном написать (даже без всяких улучшений, просто Селекшн в массив перенести), то уменьшение скорости примерно раз в 15 получается. А если подумать еще, ... Но мне уже неохота

Автор - _Boroda_
Дата добавления - 10.08.2017 в 16:18
AndreTM Дата: Четверг, 10.08.2017, 21:40 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1664
Репутация: 481 ±
Замечаний: 0% ±

2003 & 2010
Саша, на самом деле, вопрос был только к лишнему Join :)
Потому что если и к алгоритму InExSu прикрутить такой же метод отсечения, то кто нам запрещает сразу же добавлять к результирующей строке ". "? А у тебя время уходит на перезапись обратно в m_(i) (динамические переменные, неявная проверка типов), плюс потом сборка Join'ом.
Так что не всё так просто...

Что же касается работы в массиве, а также использования RTrim() - это уже вопросы оптимизации. Я ж не стал упоминать, что все почему-то забыли про "или 4 буквы" :D


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеСаша, на самом деле, вопрос был только к лишнему Join :)
Потому что если и к алгоритму InExSu прикрутить такой же метод отсечения, то кто нам запрещает сразу же добавлять к результирующей строке ". "? А у тебя время уходит на перезапись обратно в m_(i) (динамические переменные, неявная проверка типов), плюс потом сборка Join'ом.
Так что не всё так просто...

Что же касается работы в массиве, а также использования RTrim() - это уже вопросы оптимизации. Я ж не стал упоминать, что все почему-то забыли про "или 4 буквы" :D

Автор - AndreTM
Дата добавления - 10.08.2017 в 21:40
InExSu Дата: Четверг, 10.08.2017, 21:58 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 93
Репутация: 12 ±
Замечаний: 0% ±

Excel 2007
"или 4 буквы"

А мы лучше знаем, что нужно yaroslavin :p
"- Боря домой!
- я замерз?
- нет, ты хочешь кушать"
 
Ответить
Сообщение
"или 4 буквы"

А мы лучше знаем, что нужно yaroslavin :p
"- Боря домой!
- я замерз?
- нет, ты хочешь кушать"

Автор - InExSu
Дата добавления - 10.08.2017 в 21:58
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Сокращение номенклатуры прайс-листа для печати кассового чек (Формулы/Formulas)
Страница 1 из 11
Поиск:

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