Замена формата Числовой на Текст

Автор joshua, 27 октября 2017, 14:59

0 Пользователи и 1 гость просматривают эту тему.

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

Цитата: Yakov от 27 октября 2017, 13:40Поставить апостроф ' перед текстом?
Это можно сделать за два прохода (макрос ленью не страдает ;D )

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


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

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

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

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

ЗЫ. А то что в этих двух колонках может получиться смесь чисел и строк - не страшно?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Но можно полениться и сделать за один проход ;D :


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

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

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

joshua

Цитата: JohnSUN от 27 октября 2017, 14:47oRplDsc.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 это текстовый формат? это типа код текстового формата такой?
а где можно посмотреть другие кода форматов?
Цитата: rami от 27 октября 2017, 14:48'начало макроса, затем:

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

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

mikekaganski

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

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

rami

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

JohnSUN

Ну, или, если хочется увидеть ВСЕ форматы текущего документа, то см. у Питоньяка в  5.14.1. View Supported Number Format Styles
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

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

JohnSUN

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

rami

#13
Цитата: JohnSUN от 30 октября 2017, 12:49Просто тут недавно один товарищ спросил как вводить макросом дату то в английском формате, то в тайском. Из-за него пришлось тряхнуть стариной Питоньяком... В самом деле, как номера форматов распределяются по локалям?..
Не тряси старину, он нам ещё пригодится ;D

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

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

Функция Format (sText = Format(Now(),"D MMMM YYYY")) по указанному тобой адресу очень ограничена в возможностях.

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 так и не собрался - не интересно стало.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне