joshua
|
Уважаемые господа, есть диапазоны, где вместо 0 встречаются буквы "О". Нужно заменить каждую букву О на 0(ноль) проблема в том что у ячеек стоит числовой формат и что после замены дескриптором ООО221679 превращается в 221679
Как быть в такой ситуации? Программно изменить формат ячеек на Текст? Как это сделать?
oRange1 = oSheet.getCellRangeByName ("A7:B"+FindLastRow) oRplDsc = oRange1.createReplaceDescriptor() oRplDsc.setSearchString("О") ' Искать "О" oRplDsc.setReplaceString("0") ' Менять на "0" oRange1.replaceAll(oRplDsc) ' начинаю замену!
|
|
|
Записан
|
|
|
|
Yakov
|
Поставить апостроф ' перед текстом?
|
|
|
Записан
|
|
|
|
joshua
|
Мне нужно сделать это в макросе. Как изменить тип всех ячеек в диапазоне с числового на текст? что нить типа oRange1.celltype=string ну или что то типа того должно быть.
|
|
|
Записан
|
|
|
|
rami
|
Поставить апостроф ' перед текстом? Это можно сделать за два прохода (макрос ленью не страдает  ) Первый проход: вставка апострофа Второй проход: замена "О" на нули 'начало макроса, затем:
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
|
Ну да... Или если уж все равно два прохода, то сначала все первые О заменить на ноль с апострофом, а вторым проходом добить оставшиеся 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 »
|
Записан
|
|
|
|
rami
|
Но можно полениться и сделать за один проход  : 'начало макроса, затем:
oRange1.NumberFormat=100 'установка текстового формата в диапазоне
oRplDsc=oRange1.createReplaceDescriptor() oRplDsc.SearchRegularExpression=false oRplDsc.setSearchString("О") 'Искать "О" oRplDsc.setReplaceString("0") 'Менять на "0" oRange1.replaceAll(oRplDsc) 'начинаю замену!
|
|
|
Записан
|
|
|
|
joshua
|
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
|
ООО а вот это сработало) как понять что 100 это текстовый формат? это типа код текстового формата такой? а где можно посмотреть другие кода форматов? 'начало макроса, затем:
oRange1.NumberFormat=100 'установка текстового формата в диапазоне
oRplDsc=oRange1.createReplaceDescriptor() oRplDsc.SearchRegularExpression=false oRplDsc.setSearchString("О") 'Искать "О" oRplDsc.setReplaceString("0") 'Менять на "0" oRange1.replaceAll(oRplDsc) 'начинаю замену!
|
|
|
Записан
|
|
|
|
mikekaganski
|
Оффтопик: если идентифкатор - это число, то желательно, чтобы его обработка была возможна при любом числе отображаемых знаков. Чтобы проблем, как здесь не возникало. (Тогда при желании можно просто выставить числовой формат, но это не будет проблемой при дальнейшем экспорте и обработке сторонними средствами.)
Если же идентификатор - это строка, то желательно ещё при планировании удостовериться, что она не может быть перепутана с числом, например, с помощью буквенных префиксов.
|
|
|
Записан
|
|
|
|
rami
|
а где можно посмотреть другие кода форматов? В ячейке A1 на первом листе установите нужный вам формат и выполните макрос, увидите номер формата ячейки: Sub NumberFormatNumber Print ThisComponent.Sheets(0).getCellRangeByName("A1").NumberFormat End Sub
|
|
|
Записан
|
|
|
|
JohnSUN
|
Ну, или, если хочется увидеть ВСЕ форматы текущего документа, то см. у Питоньяка в 5.14.1. View Supported Number Format Styles
|
|
|
Записан
|
|
|
|
rami
|
Читать книгу Питоньяка безусловно полезно, но не следует забывать об окошке просмотра переменных внизу редактора макросов, в нём можно узнать быстро и легко о свойствах выбранной переменной. Всегда под рукой и перед глазами.
|
|
|
Записан
|
|
|
|
|
rami
|
Просто тут недавно один товарищ спросил как вводить макросом дату то в английском формате, то в тайском. Из-за него пришлось тряхнуть стариной Питоньяком... В самом деле, как номера форматов распределяются по локалям?.. Не тряси старину, он нам ещё пригодится  Я бы поступил проще как и советовал чуть раньше: отформатировать ячейку существующим или вновь созданным форматом и посмотреть его номер. Это самый простой вариант, с учётом того, что эти номера форматов нужны раз в год и то не каждый год. Можно попытаться выяснить как формируется номер пользовательского формата, но я не вижу в этом практической пользы, будет намного сложней этим пользоваться. Функция Format ( sText = Format(Now(),"D MMMM YYYY")) по указанному тобой адресу очень ограничена в возможностях.
|
|
« Последнее редактирование: 30 Октябрь 2017, 16:05 от rami »
|
Записан
|
|
|
|
JohnSUN
|
Мне, кстати, когда-то давно было любопытно, можно ли затолкать в эту строку формата что-то из серии [$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 так и не собрался - не интересно стало.
|
|
|
Записан
|
|
|
|
|