Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

22 Сентябрь 2018, 22:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: Замена формата Числовой на Текст  (Прочитано 1523 раз)
0 Пользователей и 1 Гость смотрят эту тему.
joshua
Форумчанин
***
Offline Offline

Сообщений: 51



« Стартовое сообщение: 27 Октябрь 2017, 14:59 »

Уважаемые господа,  есть диапазоны, где вместо 0 встречаются буквы "О". Нужно заменить каждую букву О на 0(ноль)
проблема в том что у ячеек стоит числовой формат и что после замены дескриптором ООО221679 превращается в 221679

Как быть в такой ситуации?
Программно изменить формат ячеек на Текст? Как это сделать?

oRange1 = oSheet.getCellRangeByName ("A7:B"+FindLastRow)
oRplDsc = oRange1.createReplaceDescriptor() 
oRplDsc.setSearchString("О")  ' Искать "О"
oRplDsc.setReplaceString("0") ' Менять на "0"
oRange1.replaceAll(oRplDsc)   ' начинаю замену!
Записан
Yakov
Администратор
**
Offline Offline

Сообщений: 2 344


WWW
« Ответ #1: 27 Октябрь 2017, 15:40 »

Поставить апостроф ' перед текстом?
Записан

joshua
Форумчанин
***
Offline Offline

Сообщений: 51



« Ответ #2: 27 Октябрь 2017, 16:06 »

Мне нужно сделать это в макросе.
Как изменить тип всех ячеек в диапазоне с числового на текст?
что нить типа oRange1.celltype=string ну или что то типа того должно быть.
Записан
rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 546


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #3: 27 Октябрь 2017, 16:33 »

Поставить апостроф ' перед текстом?
Это можно сделать за два прохода (макрос ленью не страдает Смеющийся )

Первый проход: вставка апострофа
Второй проход: замена "О" на нули

Код:
'начало макроса, затем:

oRplDsc.SearchRegularExpression=true
oRplDsc.setSearchString("(О+[0-9])")  'Искать "О" перед цифрами
oRplDsc.setReplaceString("'$0") 'поставить апостроф
oRange1.replaceAll(oRplDsc)   'начинаю замену!
oRplDsc.SearchRegularExpression=false
oRplDsc.setSearchString("О")  'Искать "О"
oRplDsc.setReplaceString("0") 'Менять на "0"
oRange1.replaceAll(oRplDsc)   'начинаю замену!
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 577


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #4: 27 Октябрь 2017, 16:47 »

Ну да... Или если уж все равно два прохода, то сначала все первые О заменить на ноль с апострофом, а вторым проходом добить оставшиеся
Код:
 oRplDsc.SearchRegularExpression = True
  oRplDsc.setSearchString("^О")
  oRplDsc.setReplaceString("'0")
  oRange1.replaceAll(oRplDsc)

Rem И теперь как у тебя и было
  oRplDsc.SearchRegularExpression = False
  oRplDsc.setSearchString("О")
  oRplDsc.setReplaceString("0")
  oRange1.replaceAll(oRplDsc)
(Мне просто кажется, что в этом случае строка поиска попроще выглядит, нет?)

ЗЫ. А то что в этих двух колонках может получиться смесь чисел и строк - не страшно?
« Последнее редактирование: 27 Октябрь 2017, 16:49 от JohnSUN » Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 546


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #5: 27 Октябрь 2017, 16:48 »

Но можно полениться и сделать за один проход Смеющийся :

Код:
'начало макроса, затем:

oRange1.NumberFormat=100   'установка текстового формата в диапазоне

oRplDsc=oRange1.createReplaceDescriptor()
oRplDsc.SearchRegularExpression=false
oRplDsc.setSearchString("О")  'Искать "О"
oRplDsc.setReplaceString("0") 'Менять на "0"
oRange1.replaceAll(oRplDsc)   'начинаю замену!
Записан

joshua
Форумчанин
***
Offline Offline

Сообщений: 51



« Ответ #6: 30 Октябрь 2017, 11:10 »

oRplDsc.SearchRegularExpression = True
  oRplDsc.setSearchString("^О")
  oRplDsc.setReplaceString("'0")
  oRange1.replaceAll(oRplDsc)

Rem И теперь как у тебя и было
  oRplDsc.SearchRegularExpression = False
  oRplDsc.setSearchString("О")
  oRplDsc.setReplaceString("0")
  oRange1.replaceAll(oRplDsc)

Это работает но только с одной буквой "О", например О5469 он заменит на '05469
но если идут больше одной "О" подряд, то он потряет нули - станет 5469
Дело в том, что когда в '0О5469 букву О поменять на 0,то апостроф почему то пропадает - даже при ручной замене
Записан
joshua
Форумчанин
***
Offline Offline

Сообщений: 51



« Ответ #7: 30 Октябрь 2017, 11:15 »

ООО а вот это сработало)
как понять что 100 это текстовый формат? это типа код текстового формата такой?
а где можно посмотреть другие кода форматов?
'начало макроса, затем:

oRange1.NumberFormat=100   'установка текстового формата в диапазоне

oRplDsc=oRange1.createReplaceDescriptor()
oRplDsc.SearchRegularExpression=false
oRplDsc.setSearchString("О")  'Искать "О"
oRplDsc.setReplaceString("0") 'Менять на "0"
oRange1.replaceAll(oRplDsc)   'начинаю замену!
Записан
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 028


« Ответ #8: 30 Октябрь 2017, 11:26 »

Оффтопик: если идентифкатор - это число, то желательно, чтобы его обработка была возможна при любом числе отображаемых знаков. Чтобы проблем, как здесь не возникало. (Тогда при желании можно просто выставить числовой формат, но это не будет проблемой при дальнейшем экспорте и обработке сторонними средствами.)

Если же идентификатор - это строка, то желательно ещё при планировании удостовериться, что она не может быть перепутана с числом, например, с помощью буквенных префиксов.
Записан

С уважением,
Михаил Каганский
rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 546


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #9: 30 Октябрь 2017, 13:05 »

а где можно посмотреть другие кода форматов?
В ячейке A1 на первом листе установите нужный вам формат и выполните макрос, увидите номер формата ячейки:
Код:
Sub NumberFormatNumber
Print ThisComponent.Sheets(0).getCellRangeByName("A1").NumberFormat
End Sub
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 577


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #10: 30 Октябрь 2017, 13:21 »

Ну, или, если хочется увидеть ВСЕ форматы текущего документа, то см. у Питоньяка в  5.14.1. View Supported Number Format Styles
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 546


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #11: 30 Октябрь 2017, 14:24 »

Читать книгу Питоньяка безусловно полезно, но не следует забывать об окошке просмотра переменных внизу редактора макросов, в нём можно узнать быстро и легко о свойствах выбранной переменной. Всегда под рукой и перед глазами.


* Узнать свойства переменной.png (67.89 Кб, 491x320 - просмотрено 18 раз.)
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 577


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #12: 30 Октябрь 2017, 14:49 »

Да, да и еще раз да... И использование MRI или XRay тоже очень полезно...
Просто тут недавно один товарищ спросил как вводить макросом дату то в английском формате, то в тайском. Из-за него пришлось тряхнуть стариной Питоньяком... В самом деле, как номера форматов распределяются по локалям?..
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 546


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #13: 30 Октябрь 2017, 15:55 »

Просто тут недавно один товарищ спросил как вводить макросом дату то в английском формате, то в тайском. Из-за него пришлось тряхнуть стариной Питоньяком... В самом деле, как номера форматов распределяются по локалям?..
Не тряси старину, он нам ещё пригодится Смеющийся

Я бы поступил проще как и советовал чуть раньше: отформатировать ячейку существующим или вновь созданным форматом и посмотреть его номер. Это самый простой вариант, с учётом того, что эти номера форматов нужны раз в год и то не каждый год.

Можно попытаться выяснить как формируется номер пользовательского формата, но я не вижу в этом практической пользы, будет намного сложней этим пользоваться.

Функция Format (sText = Format(Now(),"D MMMM YYYY")) по указанному тобой адресу очень ограничена в возможностях.
« Последнее редактирование: 30 Октябрь 2017, 16:05 от rami » Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 577


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #14: 30 Октябрь 2017, 16:25 »

Мне, кстати, когда-то давно было любопытно, можно ли затолкать в эту строку формата что-то из серии [$xxx-nnn]. Я имею в виду "The format code for currencies uses the form [$xxx-nnn], where xxx is the currency symbol, and nnn the country code". В смысле, применить этот самый nnn не к деньгам, а к дате. Или к точке/запятой в числах. Но поискать все эти nnn так и не собрался - не интересно стало.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!