Помогите пожалуйста решить проблему. Есть база данных, в данном случае прайс-лист. Для загрузки в кассовый аппарат нужно сократить номенклатуру до 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
По идее, тут надо бы вообще завести дополнительную таблицу с сокращенными именами, и пополнять именно её, и макросом, а не формулой, и чтобы её можно было подправлять (и чтобы макрос потом уже не правил сам, а дополнял только новыми позициями её). И макрос должен проверять не только названия, но и "актуальность", чтобы можно было отфильтровать эту новую таблицу и перегрузить кассу только новыми наименованиями. Соотвественно, надо ещё и видеть образец вашей базы, чтобы знать, какие поля будут ключевыми, чтобы формировать эту "таблицу для загрузки" уже в формате, пригодном для кассы.
Так что тут надо не только ваши файлы-образцы иметь, но и задача может стать комплексной...
По идее, тут надо бы вообще завести дополнительную таблицу с сокращенными именами, и пополнять именно её, и макросом, а не формулой, и чтобы её можно было подправлять (и чтобы макрос потом уже не правил сам, а дополнял только новыми позициями её). И макрос должен проверять не только названия, но и "актуальность", чтобы можно было отфильтровать эту новую таблицу и перегрузить кассу только новыми наименованиями. Соотвественно, надо ещё и видеть образец вашей базы, чтобы знать, какие поля будут ключевыми, чтобы формировать эту "таблицу для загрузки" уже в формате, пригодном для кассы.
Так что тут надо не только ваши файлы-образцы иметь, но и задача может стать комплексной...AndreTM
Выделяете нужные ячейки и натравливаете макрос [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 символов.
Выделяете нужные ячейки и натравливаете макрос [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
Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
Сообщение отредактировал InExSu - Среда, 09.08.2017, 19:45
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]
Еще вариант функцией пользователя [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
не отвечаю, но здесь вроде уважаемый человек, дай, думаю, действительно посмотрю Ну, во-первых, это я решил побаловаться с вот этим методом отсечения http://www.excelworld.ru/forum/7-1861-1 А во-вовторых - обоснуй. С цифрами. И с учетом того, что у меня функция, которая никогда не будет работать быстрее простого макроса. Если код функции перевести на Sub и работу с выделенным диапазоном (что в принципе некорректно, т.к. алгоритм разный), то по времени отработки 10000 ячеек разница в 0,02 сек А если нормально макрос для работы с диапазоном написать (даже без всяких улучшений, просто Селекшн в массив перенести), то уменьшение скорости примерно раз в 15 получается. А если подумать еще, ... Но мне уже неохота
не отвечаю, но здесь вроде уважаемый человек, дай, думаю, действительно посмотрю Ну, во-первых, это я решил побаловаться с вот этим методом отсечения http://www.excelworld.ru/forum/7-1861-1 А во-вовторых - обоснуй. С цифрами. И с учетом того, что у меня функция, которая никогда не будет работать быстрее простого макроса. Если код функции перевести на Sub и работу с выделенным диапазоном (что в принципе некорректно, т.к. алгоритм разный), то по времени отработки 10000 ячеек разница в 0,02 сек А если нормально макрос для работы с диапазоном написать (даже без всяких улучшений, просто Селекшн в массив перенести), то уменьшение скорости примерно раз в 15 получается. А если подумать еще, ... Но мне уже неохота_Boroda_
Саша, на самом деле, вопрос был только к лишнему Join Потому что если и к алгоритму InExSu прикрутить такой же метод отсечения, то кто нам запрещает сразу же добавлять к результирующей строке ". "? А у тебя время уходит на перезапись обратно в m_(i) (динамические переменные, неявная проверка типов), плюс потом сборка Join'ом. Так что не всё так просто...
Что же касается работы в массиве, а также использования RTrim() - это уже вопросы оптимизации. Я ж не стал упоминать, что все почему-то забыли про "или 4 буквы"
Саша, на самом деле, вопрос был только к лишнему Join Потому что если и к алгоритму InExSu прикрутить такой же метод отсечения, то кто нам запрещает сразу же добавлять к результирующей строке ". "? А у тебя время уходит на перезапись обратно в m_(i) (динамические переменные, неявная проверка типов), плюс потом сборка Join'ом. Так что не всё так просто...
Что же касается работы в массиве, а также использования RTrim() - это уже вопросы оптимизации. Я ж не стал упоминать, что все почему-то забыли про "или 4 буквы" AndreTM